Prolog - 使两个实例化相等

时间:2014-04-10 21:17:17

标签: prolog

我对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的基本原则?

2 个答案:

答案 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

希望这有帮助!