我在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中是否有类似的东西?
以下内容适用于我并提供预期结果:
no_car(W):-
worker(W),
\+ owner(W, _).
Run Code Online (Sandbox Code Playgroud)
现在这很接近你所拥有的.首先,你可以当然使用的_
谓词; 它不仅限于查询.我通常\*
用于否定,并not
在这里给我一个语法错误!?
编辑:
啊! 在我的Prolog版本(尽管已过时)中,您必须使用not(hascar(X))
它来使其工作,因此不需要将/ 1用作术语,而不是操作符.但该手册也表示not
不赞成使用\+
.