接受 2 种不同的颜色,但不接受相同的颜色

Accepting 2 different colors, but not the same colors

我正在尝试一个必须编写谓词 colors/2(或 colors(C1,C2) :- ...)的练习,其运行方式如下:

?- colors(red,blue).
true.
?- colors(red,red).
false.
?- colors(blue,blue).
false.

所以,基本上,我必须以一种当您输入相同颜色两次时它不接受的方式编写我的谓词。

我将我的事实定义为:

col(red,blue).
col(purple,orange).
col(green, yellow). 

我的谓词是:

colors(X,Y) :- (col(X,Y); col(Y,X)) not (col(X,X); col(Y,Y)).

我不明白为什么我的谓词不起作用。它返回语法错误 "Operator Expected." 我是说你写事实的顺序并不重要。意思是,你可以说 colors(red,blue) 或 colors(blue,red),但是如果不返回 false,你就不能查询具有相同名称的颜色。

我想知道:

  1. 为什么这不是一个有效的表达式。
  2. 我能做些什么来解决这个问题。

几件事:

您在 notnot/1 之前缺少逗号 (,),并且 not/1 需要括号中的单个术语,因此请使用更多括号:

colors(X,Y) :- (col(X,Y); col(Y,X)), not( (col(X,X); col(Y,Y)) ).

正如@PauloMora 指出的那样,not/1 已弃用,取而代之的是 ISO \+/1,因此更好的做法是:

colors(X,Y) :- (col(X,Y); col(Y,X)), \+ (col(X,X); col(Y,Y)).

然后查看 col(X,X)col(Y,Y),没有任何事实或谓词使 col(X,X) 为真(两个参数相同)。因此,其中每一个都将始终为假,而 \+ (col(X,X); col(Y,Y)) 将始终为真。所以这个表达式是多余的,你的谓词变成了(至少在你当前的事实集中建立的模式):

colors(X,Y) :- col(X,Y) ; col(Y,X).

由于您没有任何用匹配颜色 (col(x,x)) 规定的事实,因此像 col(red, red) 这样的查询无论如何都会失败。


根据@false 的建议,对于 XY 的完整性检查,适当的机制是 dif(X, Y):

colors(X, Y) :- (col(X, Y) ; col(Y, X)), dif(X, Y).

括号是必需的,因为 , 的优先级高于 ;。这将防止您碰巧有一个事实或谓词 col/2,其中两个参数相同(相同或统一)的情况。