我正在尝试制作invert/2
。我希望它忽略其参数的顺序,这样你就不必担心反转的哪一半是你所知道的那种,所以你在将反转作为事实陈述时不必重复自己。我目前有
invert(Left, Right) :-
call_with_depth_limit(invert(Right, Left), 1, Result),
Result \= depth_limit_exceeded.
作为第一个invert
规则。这主要有用,但如果invert(a, b).
,那么?- invert(b, X).
会同时提供X = a
和false
,这根本不是我想要的。
答案 0 :(得分:1)
我要考虑两件事。首先,确保您为事实中建立关系对称性而创建的谓词具有与事实不同的名称。名称相同通常会导致诸如无限递归之类的问题。其次,如果事实在你的控制下宣布,那么事实是否明确宣布对称的情况是一致的。如果他们这样做,那么你不需要额外的谓词。如果他们不这样做,那么你需要一个额外的谓词。
例如,显式声明对称性:
opposite(a, b).
opposite(b, a).
opposite(c, d).
opposite(d, c).
您不需要额外的谓词来获取opposite
的对称解决方案。
未明确声明对称性的示例:
opposite(a, b).
opposite(c, d).
inverted(X, Y) :- opposite(X, Y).
inverted(X, Y) :- opposite(Y, X).
在这种情况下,查询inverted/2
而非opposite/2
将处理关系中的对称性。