0

クエリソリューションを取得するために使用されたすべてのファクトを印刷しようとしていますが、統合に失敗した場合は何も印刷しないことを望んでいます。だから私はこれを書きます:

a:-
    b,c,writeln(b^c->a).
b:-
    d,writeln(d->b).
c:-
    fail,writeln(e->c).
d:-
    writeln(d).
a:-
    b,d,writeln(b^d->a).

ただし、クエリを実行するa.と、悲しいことに次の出力が得られました。

d
d->b
d
d->b
d
b^d->a
true.

誰かが、Prologにはクエリを実行するために使用されるすべての事実を表示するメカニズムが組み込まれていると言っているようです。彼は本当ですか?どうすれば正しい出力を得ることができますか?

4

1 に答える 1

1

あなたのプログラムには変数がないため、統一されていません。

edit : または、抽象的な意味で言えば、Prologは、現在の目標を各ルール ヘッドと統合する Horn 句のリストから選択します。しかし、実際のプロローグは、パフォーマンスのために選択フェーズをインデックス作成に置き換え、引数の統一を試みます。

を呼び出すaが呼び出され、式が出力されます。b c

クエリで使用されるすべてのルールを表示する組み込みメカニズムは、おそらくtraceです。詳細については、Prolog マニュアルを参照してください。これは、システムの内部動作と、対象とする言語の「アーキテクチャ」を含む、かなり複雑な議論です。

もちろん、目に見えるものを除いて、正しい出力はありません。それがあなたが書いたセマンティックです。

于 2012-04-14T05:15:25.353 に答える