我的老师给了我以下规则,用于在prolog中实现逻辑not
:
not( X ) :- X, !, fail.
not( _ ).
我很难理解它。我有点认为!
意味着削减,但我对这种情况下的工作原理以及第二行试图实现的目标感到困惑。有人可以帮我理解吗?
答案 0 :(得分:2)
实施非常简单:
规则:not( X ) :- X, !, fail.
州调用X
查看是否成功,如果X
成功,则not(X)
失败,因此会调用fail
结束但在此之前你必须告诉 Prolog 不检查第二条规则(这会成功)这就是它放置切割(!)
的原因。
规则:not( _ ).
符合上述规则X
失败的情况,因此上述规则失败,Prolog
会尝试通过回溯来匹配其他规则。< / p>
虽然重要的是要认识到 Prolog没有逻辑否定但是否定为失败 这有点不同。您可以查看我之前的问题Logical Negation in Prolog,看看是否存在一些差异,并了解为什么让逻辑否定这么困难(也许是不可能的)。
你也可以谷歌关于否定作为失败更好地理解它。可以找到解释它的简单链接(并且还指出逻辑否定的主要区别)here。