次のプロローグベースを使用しましょう:
father(anakinSkywalker, princessLeia).
father(anakinSkywalker, lukeSkywalker).
saysOhNo(lukeSkywalker).
sdescienceloverは、シェル呼び出しから swi-prologでパターン マッチング ゴールの結果を表示する方法を尋ね、クエリを手動で変換して書き込みを発行するという回答を得ました。
swipl -q -s kb.pl -t "father(anakinSkywalker,X), writeln(X), false"
結果:
princessLeia
lukeSkywalker
これは、単一の自由変数を使用したクエリがいくつかある場合には問題なく機能しますが、それぞれを手動で変換するのは面倒です。また、各変数の名前とその結果を適切に出力したい場合は、すぐに非常に煩わしくなります。たとえば、クエリを実行するには、次のfather(AVariable, Another)
ように記述する必要があります。
swipl -q -s kb.pl -t "father(AVariable,Another), write('AVariable='), write(AVariable), write(', Another='), writeln(Another), false"
結果:
AVariable=anakinSkywalker, Another=princessLeia
AVariable=anakinSkywalker, Another=lukeSkywalker
パイプからコマンドを供給しようとしましたが、うまくいきません(結果の書き込みがいつ終了したかを検出できないため、後でハングし、改行で回答が区切られません):
(echo "father(X,Y)."; while true; do echo ";"; done) | swipl -q -s kb.pl
結果 :
X = anakinSkywalker,
Y = princessLeia X = anakinSkywalker,
Y = lukeSkywalker.
swipl hangs here, and needs to be stopped with Control-C.
sed
スクリプトを使用してクエリを前処理し、変数を大文字で出力するために必要なコードを追加できることはわかっていますが、たとえば 2 つの述語を満たす必要がある場合など、複雑なクエリを処理するにはかなりの作業が必要になります。
father(X,Y), saysOhNo(Y).
常に正しい結果を得るには、prolog 用のパーサーを作成する必要がありますが、prolog は対話的にこれを行う方法を既に知っているため、これは役に立たない作業です。
だからここに私の質問があります:GNUプロローグまたはSWIプロローグ(またはLinuxに簡単にインストールできる他の無料バージョン)に、インタラクティブに行うのと同じように、いくつかのクエリを実行して結果を出力するように指示する方法はありますか?各クエリを手動で入力 (またはコピーして貼り付け) するには?
編集 :一連のクエリをファイル (kb.pl
ファイルまたは補助ファイル) に保存し、それらすべてを実行して、結果を表示する方法はさらに優れています。