swi-prolog中的"NOT EXISTS"

Evg*_*lai 1 prolog

我在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).
Run Code Online (Sandbox Code Playgroud)

我需要再添加一个谓词no_car(X),如果worker X没有汽车,即如果我们输入查询,那将是真的吗?: - no_car(X).序言应该回答

X=smitt,
X=bill,
yes 
Run Code Online (Sandbox Code Playgroud)

我所做的是

   hascar(X):-owner(X,_).
   nocar(X):- worker(X),not hascar(X).
Run Code Online (Sandbox Code Playgroud)

但是这种方法不起作用,因为只有查询才能使用无限变量.所以,我真的坚持这个.我知道SQL中有"NOT EXISTS"字样允许在查询中表达这个逻辑,但在prolog中是否有类似的东西?

Tho*_*asH 5

以下内容适用于我并提供预期结果:

no_car(W):-
   worker(W),
   \+ owner(W, _).
Run Code Online (Sandbox Code Playgroud)

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

编辑:

啊! 在我的Prolog版本(尽管已过时)中,您必须使用not(hascar(X))它来使其工作,因此不需要将/ 1用作术语,而不是操作符.但该手册也表示not不赞成使用\+.