我在知识库中有以下事实:
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]).
无论如何感谢您的建议。