我想用可交换和传递的属性来模拟 Prolog 中的等价性,这就是我所做的:equal/2 将作为事实提供。
symmetricEqual(A,B):- equal(A,B).
symmetricEqual(A,B):- equal(B,A).
transitiveEqualPath(A,B,_) :- symmetricEqual(A,B).
transitiveEqualPath(B,C,IntermediateNodes) :-
symmetricEqual(A,B),
\+ member(C,IntermediateNodes),
transitiveEqualPath(A,C,[B|IntermediateNodes]), B\==C.
transitiveEqual(A,B) :- transitiveEqualPath(A,B,[]).
但是我在使用上述解决方案时遇到了性能问题,试图计算transitiveEqual/2(大约花了20分钟),我从equal/2计算得非常快,大约有2KsymmetricEqual/2事实,所以它一定是规则的原因对于transitiveEqual/2,任何人都可以提出任何改进建议吗?
非常感谢。