我正在尝试练习,我必须编写谓词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。
我想知道:
答案 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)
之类的查询无论如何都会失败。
X
和Y
的相等性进行完整性检查,适当的机制是dif(X, Y)
:
colors(X, Y) :- (col(X, Y) ; col(Y, X)), dif(X, Y).
由于,
的优先级高于;
,因此需要使用括号。这样可以防止您碰巧有一个事实或谓词col/2
,其中两个参数相同(相同或统一)。