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”字样,它允许在查询中表达这个逻辑,但是在序言中有没有类似于它们的东西?

+0

如果您使用\ +而不是使用\ +,则它与匿名变量无关。 –

我下面的作品,并提供预期的结果:

no_car(W):- 
    worker(W), 
    \+ owner(W, _). 

现在,这是接近你所拥有的。首先,你可以当然使用_谓词;它不限于查询。我通常使用\*否定,而not在这里给我一个语法错误!?

编辑:

啊!在我的,虽然过时的Prolog版本中,您必须使用not(hascar(X))才能使其正常工作,因此不需要将/ 1用作术语,而不是操作员。但该手册还说not已弃用\+

+0

谢谢!不(hascar(X))正常工作。使用其他版本的prolog后,看起来很奇怪,我没有想到要检查它。 –