ナレッジ ベースに次の事実があります。
line(a,b). -- denotes the line determined by point a and b
line(c,d). -- denotes the line determined by point c and d
lineEqual(line(a,b),line(c,d)) -- denotes the length of two lines are equal
lineEqual/2 の 2 つの引数を交換できる別のルールが必要です。
lineEqual(line(C, D), line(A, B)):-
lineEqual(line(A,B),line(C,D)).
残念ながら、ルールは Prolog で無限ループを作成します。他のアイデアはありますか?
更新していただきありがとうございます。最後のルールを理解できたかどうかわかりません:
transitiveSymmetricRelPath(L1, L2, IntermediateNodes) :- symmetricRel(L1, L3),
\+member(L3, IntermediateNodes),
transitiveSymmetricRelPath(L1, L2, [L3 | IntermediateNodes]).
たまたまL1とL3の両方にリンクされている場合、ヘッドノードを取り除こうとするたびに想像できますよね? したがって、リストが空の場合は、次のルールを使用できます。
transitiveSymmetricRel(L1, L2) :- transitiveSymmetricRelPath(L1, L2, []).
しかし、私が実際に得ていないのは、transitiveSymmetricRelPath/3 の中間ノードの空でないリストをどこで取得するかということです。私は実際に与えられた事実rel(a、b)であなたのコードを試しました。rel(a,c)。また、transitiveSymmetricRel(b,c) も、transitiveSymmetricRel(c,b) も返しません。調べていただけますか?
どうもありがとう!
編集済み:次のようにルールを変更することで機能しました。
transitiveSymmetricRelPath(L2, L3, IntermediateNodes) :- symmetricRel(L1, L3),
\+member(L3, IntermediateNodes),
transitiveSymmetricRelPath(L1, L2, [L3 | IntermediateNodes]).
とにかくあなたの提案をありがとう。