5

私はいくつかの.plファイルを持っていて、Pythonスクリプトからその中で宣言された述語を呼び出したいと思います。どうやってやるの?

例えば、test.pl

rD( [], Ans, Ans ).
rD( [X|Xs], Ans, Acc ) :-
    member( X, Acc ),
    rD( Xs, Ans, Acc ), !.
rD( [X|Xs], Ans, Acc ) :-
    \+member( X, Acc ),
    append( Acc, [X], AccNew ),
    rD( Xs, Ans, AccNew ), !.

のように働く

?- rD( [1,2,3,4,5,4], X ).
X = [1, 2, 3, 4, 5].

rDどういうわけかPythonスクリプトから呼び出して、結果変数で答えを取得したい

result
[1, 2, 3, 4, 5]

ps:これは単なる例であり、現在のPrologプログラムを書き直したくありません。

4

4 に答える 4

4

私はそれを直接経験しているわけではありませんが、PythonとSWI-Prologの間のブリッジを提供するPySWIPと呼ばれるプロジェクトがあります。Google Codeのプロジェクトページでホストされているwikiには、インストール手順といくつかの使用例が含まれています。

編集(2019年7月5日)

PySWIPは、独自のインストール手順とともにGithubで維持されているようです。TLDR:Python 2と3の両方で、SWI-Prologをインストールし、その仕事をする必要があります。pip install pyswip

于 2011-05-23T22:09:16.530 に答える
3

「現在のPrologプログラムを書き直したくない」ので、適切なコマンドライン引数を渡して、PythonからSWI-Prologへの外部呼び出しを行うのが自然なアプローチだと思います。

2008年9月からのこのSOの議論、Pythonで外部コマンドを呼び出す方法をsubprocess見てください。モジュールを使用すると、外部コマンドからのstdoutをPythonプロセスにパイプして、そこでストリームとして読み取ることができます。

これにより、 SWI-Prologのコマンドライン引数を選択する際の問題が軽減されます。UnixライクなシステムのシェルスクリプトまたはWindowsの「DOS」バッチ/cmdファイルを介して間接的にSWI-Prologを呼び出すことは可能ですが、そのような間接的な呼び出しについてはこれ以上言及しません。

特にセクションの議論を参照してください。-gおよび-tオプションのSWI-Prologマニュアル(上記にリンク)の2.4.2 。例えば:

swipl --quiet -t rD( [1,2,3,4,5,4], X ),halt

おそらくあなたが望むことをするでしょう。この--quietオプションは、バナー/ウェルカムメッセージを抑制します。これは、Pythonが受信した出力の解析を単純化するために必要になる可能性があります。

于 2011-05-25T13:27:54.213 に答える
2

Python3のアップデート、執筆時点でのPyPIのPySwipは、レガシーPythonのみを対象としていますが、githubのソースコードはPython3と互換性があります。これをgitcloneして実行するpython3 setup.py installと、Python3バージョンが提供されます。

Knowledge_base.plとして保存されている既存のナレッジベースを参照するには、次のようにします。

from pyswip import Prolog
prolog = Prolog()
prolog.consult("knowledge_base.pl")
for res in prolog.query("rD( [1,2,3,4,5,4], X )."):
    print(res)

# output:
# {'X': [1, 2, 3, 4, 5]}
于 2018-05-19T21:57:16.537 に答える
-1
from subprocess import Popen, PIPE, STDOUT

p = Popen('/usr/local/sicstus4.2.3/bin/sicstus', shell=True, stdin=PIPE, stdout=PIPE, stderr=STDOUT)
cmd = open('/path/to/your/test.pl').read()
res = p.communicate(cmd)
for line in res:
    print line
于 2013-01-28T22:33:52.713 に答える