我正在学习prolog
在我看来,prolog的规则(关系和简单事实)是"积极的"。-他们说什么是或可能是真的。
在prolog程序中添加新的这样的规则只会增加"positive"知识。它不能加上"负"用事实说某事是不真实的。
-
这是单调的吗逻辑吗?
-
称为"失败否定"的过程(非逻辑)结构;是否需要添加"negative"打破纯逻辑序言的单调性的事实,例如规则的例外。
我说的对吗?
更新
注释要求举例
likes(mary, X) :- reptile(X), !, fail.
likes(mary, X) :- animal(X).
如果没有程序上的删节,就没有办法在纯逻辑的序言中定义玛丽喜欢动物,除了爬行动物。(这是正确的吗?)
对于Prolog来说,单调程序是一个添加更多子句不会减少谓词*的解集的程序。相反,删除子句永远不会增加在这样的程序中找到的解。假设@brebs
的定义likes(mary, X) :- animal(X), + reptile(X).
如果你在reptile/1
中添加更多的事实,Mary喜欢的动物的集合可能会减少。这是一个非单调行为的例子。但是,请注意,这种形式的简单否定仅在X
在调用+ reptile(X)
时被充分实例化时才有效。即使像重新排序这样看似微不足道的更改也会使程序在某些用途上不正确。
likes(mary, X) :- + reptile(X), animal(X).
?- X = cat, likes(mary, X).
X = cat.
?- likes(mary, X), X = cat.
false, unexpected.
?- likes(mary, X).
false, unexpected.
一般来说,作为初学者,首先坚持使用Prolog的纯单调子集。它已经很难掌握,只有当你真正理解这一点时,包含非单调结构才有意义。
1模不终止和误差
Mary喜欢动物:
likes(mary, X) :- animal(X).
Mary喜欢非爬行动物的动物:
likes(mary, X) :- animal(X), not_reptile(X).
当然现在的问题是,如何实现not_reptile/1
?没有否定作为失败,你仍然可以这样写:
not_reptile(dog).
not_reptile(cat).
not_reptile(spider).
not_reptile(jelly_fish).
% and so on
在某些情况下(有限世界或有限话语),这是可能的,并且可能比任何其他解决方案都好。