私はPrologでいくつかの宿題に取り組んでおり、次のようなものを使用する必要があります:
ルール:
brothers(a,b)
brothers(c,d)
データベースに重複を持たずにクエリを実行brothers(b,a)
して真になる機能を実装する必要があります。
: を使用することを考えましbrothers(X,Y):- brothers(Y,X)
たが、無限に再帰的になります。両方の名前が同じでなければならないので、他に何ができるかわかりません。
さて、無限再帰を破る必要があります! これは、さまざまな方法で実行できます。
1) 注文
データベースを各brother(X,Y)
ルールに作成しますX>Y
。次に、ルールを追加しますbrother(X,Y):- Y>X, brother(Y,X).
2) ラッパー述語
brother(X,Y):- brother_facts(X,Y) ; brother_facts(Y,X).
3) テーブル作成
XSB (またはそれをサポートする他のプロローグ実装) を使用する場合に可能です。テーブル化はメモ化に少し似ており、ループを壊します