2

我正在尝试一个练习,我必须编写如下运行的谓词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”的语法错误。我是说你写事实的顺序并不重要。意思是,您可以说颜色(红色,蓝色)或颜色(蓝色,红色),但是如果不返回 false,则无法查询具有相同名称的颜色。

我想知道:

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

1 回答 1

2

有几件事:

您在,前面缺少逗号 ( )not并且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)and 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两个论点相同(相同或统一)的事实或谓词的情况。

于 2015-01-28T02:15:51.930 回答