0

本からいくつかの基本的な例を試してみましたが、「ローカル スタックが不足しています」というエラーが発生します (コードの後で詳しく説明します)。コードは次のとおりです。

edge(a,b).
edge(a,e).
edge(b,d).
edge(b,c).
edge(c,a).
edge(e,b).
tedge(Node1,Node2) :-
    edge(Node1,SomeNode),
    edge(SomeNode,Node2).
edge(X,Y) :- tedge(X,Y).

たとえば、クエリ edge(a,b) を記述しようとすると、true が返され、「;」と入力しました。そしてそれはエラーを起こしました。ここで何が問題なのですか?

4

1 に答える 1

2

問題は、循環的な方法でエッジとは何かを定義したことです。aからbPrologへの 2 番目のパスを探している間tedge(a,VAR)edge(a,VAR)tedge(a,VAR)、 などをループしています。

エッジが対称になるように定義していなくても、つまりサイクルにより、Prolog がループすることに注意してくださいa -> b -> c -> a

解決策は、以前にアクセスした頂点やエッジを追跡することです。繰り返されない頂点のチェックは、closure0/3 (SO ユーザー false から学んだ述語) を使用して簡単に実装できます。その述語を使用する場合は、edge/2事実と次のクエリのみが必要です。

?- closure0(edge, a, b).
于 2014-12-30T18:27:43.787 に答える