我在prolog中遇到了一个简单的问题。 我们来考虑一下这个程序
worker(bill).
worker(smitt).
worker(fred).
worker(dany).
worker(john).
car(bmw).
car(mazda).
car(audi).
owner(fred,mazda).
owner(dany,bmw).
owner(john,audi).
我需要再添加一个谓词no_car(X),如果worker X没有汽车,那就是真的,即如果我们输入一个查询 ?: - no_car(X)。 序言应该回答
X=smitt,
X=bill,
yes
我所做的是
hascar(X):-owner(X,_).
nocar(X):- worker(X),not hascar(X).
但是这种方法不起作用,因为只有查询才能使用无限变量。 所以,我真的坚持这个。 我知道SQL中有“NOT EXISTS”字样允许在查询中表达这个逻辑,但在prolog中是否有类似的东西?
答案 0 :(得分:5)
以下适用于我并提供预期结果:
no_car(W):-
worker(W),
\+ owner(W, _).
现在这已经接近你所拥有的。首先, 当然可以在谓词中使用_
;它不仅限于查询。我通常使用\*
进行否定,not
在这里给我一个语法错误!?
编辑:
啊!在我的Prolog版本(尽管已过时)中,您必须使用not(hascar(X))
才能使其正常工作,因此不需要将/ 1用作术语,而不是操作符。但该手册还指出not
已被弃用,而有利于\+
。