swi-prolog中的“NOT EXISTS”

时间:2011-09-24 18:16:20

标签: 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).

我需要再添加一个谓词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中是否有类似的东西?

1 个答案:

答案 0 :(得分:5)

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

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

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

编辑:

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