3

ここに私のナレッジベースがあります:

a(b,c). 
a(X,Y):-a(Y,X). 

これが私のクエリです:a(c,b).

SWI-Prolog を使用しています。このクエリは、プログラムが「true」を出力することにつながると思いました。ただし、代わりに「true」を出力し、セミコロンを押すとtrueを出力し続けます... FOREVERまで。

止まらないのはなぜ?

私の考え: まず、X は b にバインドされ、Y は c にバインドされます。次に、Prolog は a(b,c) をテストし、これが真であることを確認します。したがって、a(c,b) も true であり、SWI-Prolog は true を 1 回出力する必要があります。ただし、そのセミコロンを押し続けている限り、永久に true と出力されるため、何か再帰的なことが起こっていると思われます。これはどこで起こっていますか?ヘルプ!

編集:より具体的には、プログラムが「true」のたびに一時停止し、終了するのではなく、セミコロンまたは別のキーを押すのを待つのはなぜですか? 2 つの述語 human(socrates) と mortal(X):-humans(X) がある場合、クエリ mortal(socrates) に対する応答は 1 つの「true」になります。(上記でこれを明確にできなかった場合は申し訳ありません。)

4

1 に答える 1

2

Prologa(c,b)は、最初に2番目のルールを使用して証明し、次に最初のルールを使用して証明します。a(c,b)次に、 2番目のルールの3回の呼び出しと、それに続く最初のルールの呼び出しによって証明されます。次に、2番目のルールの5回の呼び出しなどによって。Prologの推論アルゴリズムは、閉集合のない深さ優先探索です。つまり、すでに証明されたものを追跡せず、再び喜んで証明します。

この動作を望まない場合は、ルールを次のように書き直す必要があります。

a_fact(b, c).
a(X, Y) :- a_fact(X, Y).
a(Y, X) :- a_fact(X, Y).

...またはある種のタブリング実行を使用します。ただし、SWI-Prologはタブリングをサポートしていないと思います。

于 2012-05-15T21:59:31.187 に答える