swi-prolog中的“NOT EXISTS”
问题描述:
我在prolog中遇到了一个简单的问题。 让我们考虑的方案swi-prolog中的“NOT EXISTS”
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),这将是真实的,如果作业者X没有汽车,也就是,如果我们输入一个查询 : - no_car(X )。 序言应该回答
X=smitt,
X=bill,
yes
我所做的是
hascar(X):-owner(X,_).
nocar(X):- worker(X),not hascar(X).
但这种方法是行不通的,因为anonimous变量只能用于查询avaliable。 所以,我真的坚持这一点。 我知道SQL中有“NOT EXISTS”字样,它允许在查询中表达这个逻辑,但是在序言中有没有类似于它们的东西?
答
我下面的作品,并提供预期的结果:
no_car(W):-
worker(W),
\+ owner(W, _).
现在,这是接近你所拥有的。首先,你可以当然使用_
谓词;它不限于查询。我通常使用\*
否定,而not
在这里给我一个语法错误!?
编辑:
啊!在我的,虽然过时的Prolog版本中,您必须使用not(hascar(X))
才能使其正常工作,因此不需要将/ 1用作术语,而不是操作员。但该手册还说not
已弃用\+
。
+0
谢谢!不(hascar(X))正常工作。使用其他版本的prolog后,看起来很奇怪,我没有想到要检查它。 –
如果您使用\ +而不是使用\ +,则它与匿名变量无关。 –