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

时间:2015-01-28 02:00:05

标签: prolog prolog-toplevel

我正在尝试练习,我必须编写谓词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)).

我不明白为什么我的谓词不会起作用。它返回语法错误"运算符预期。"我说的是你写下事实的顺序并不重要。意思是,你可以说颜色(红色,蓝色)或颜色(蓝色,红色),但你不能查询具有相同名称的颜色而不返回false。

我想知道:

  1. 为什么这不是一个有效的表达。
  2. 我可以采取哪些措施来解决问题。

1 个答案:

答案 0 :(得分: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)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,其中两个参数相同(相同或统一)。