我在知識庫中的以下事實:避免無限循環中的Prolog
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:
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)嘗試了你的代碼。相對(A,C)。並且它不返回transitiveSymmetricRel(b,c),也不返回transitiveSymmetricRel(c,b)。你可以看看它嗎?
非常感謝!
編輯: 我知道了通過修改規則一樣工作:
transitiveSymmetricRelPath(L2, L3, IntermediateNodes) :- symmetricRel(L1, L3),
\+member(L3, IntermediateNodes),
transitiveSymmetricRelPath(L1, L2, [L3 | IntermediateNodes]).
感謝您的建議,反正。
感謝您的回覆。傳遞關係呢?我可能需要根據您的建議編寫8條規則:areLinesEqual(L1,L3): - linesEqual(L2,L1),linesEqual(L2,L3)。 areLinesEqual(L1,L3): - 線等於(L1,L2),線等於(L2,L3)。 areLinesEqual(L1,L3): - 線等於(L2,L1),線等於(L3,L2)。 areLinesEqual(L1,L3): - 線等於(L1,L2),線等於(L3,L2)。另外4條規則可以交換L1和L3嗎?可能不是一個好方法。 – user1935724
@ user1935724:我更新了答案。 – liori
感謝您的更新,我根據您的回覆編輯了問題。 – user1935724