可換性と推移性のプロパティを使用して、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 から約 2K の対称 Equal/2 ファクトがかなり高速に計算されるため、ルールの原因である必要があります。推移的Equal / 2の場合、誰でもこれに関する改善を提案できますか?
どうもありがとう。