【问题标题】:"NOT EXISTS" in swi-prologswi-prolog 中的“不存在”
【发布时间】:2011-09-24 18:16:20
【问题描述】:

我在序言中遇到了一个简单的问题。 让我们考虑一下程序

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).

但是这种方法不起作用,因为匿名变量仅适用于查询。 所以,我真的坚持这一点。 我知道 SQL 中有“NOT EXISTS”字样可以在查询中表达这个逻辑,但是 prolog 中有没有类似的东西?

【问题讨论】:

  • 如果您使用 \+ 而不是不使用,您的代码可以工作,它与匿名变量无关..

标签: prolog


【解决方案1】:

以下内容对我有用并提供了预期的结果:

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

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

编辑:

啊!在我的 Prolog 版本中,尽管已经过时,但您必须使用 not(hascar(X)) 才能使其工作,因此 not/1 需要用作术语,而不是运算符。但该手册还说not 已被弃用,取而代之的是\+

【讨论】:

  • 谢谢! not(hascar(X)) 工作正常。使用其他版本的 prolog 后看起来很奇怪,我没想到会检查它。
猜你喜欢
  • 2012-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-16
  • 1970-01-01
  • 2012-04-02
相关资源
最近更新 更多