我对Prolog很新,所以请耐心等待。
假设我有以下内容:
foo(bar(a,b)).
foo(bar(b,a)).
然后我输入foo(X)作为查询:
?- foo(X).
X = bar(a, b) ;
X = bar(b, a).
Prolog返回X的两个实例以满足查询:bar(a,b)和bar(b,a)。
有没有我可以使这两个实例等效?一旦Prolog将X实例化为bar(a,b),它就不会将其实例化为bar(b,a)。
所以当我输入foo(X)作为查询时:
?- foo(X).
X = bar(a, b).
X没有实例化为bar(b,a),因为它等同于bar(a,b)。这可能与Prolog有关,还是违背了Prolog的基本原则?
答案 0 :(得分:0)
文字的同一性它是统一的核心 - Prolog算法的基本操作 - 然后是你的问题的答案不是,它不可能处理吧(a, b)作为条(b,a)。
答案 1 :(得分:0)
symmetry/2
的第一个条款处理foo(bar(a,b))
和foo(bar(b,a))
都出现的情况。我使用标准的术语顺序,只返回前者。请注意,使用@<
会错误地排除foo(bar(e,e))
等结果。
第二个条款处理foo(bar(c,d))
或foo(bar(d,c))
出现的情况。
foo(bar(a, b)).
foo(bar(b, a)).
foo(bar(c, d)).
foo(bar(e, e)).
symmetry(X, Y):-
foo(bar(X, Y)),
foo(bar(Y, X)),
X @=< Y.
symmetry(X, Y):-
foo(bar(X, Y)),
\+ foo(bar(Y, X)).
使用示例:
?- symmetry(X, Y).
X = a,
Y = b ;
X = Y, Y = e ;
X = c,
Y = d ;
false
希望这有帮助!