我正在学习序言。
在我看来,prolog 的规则(关系和简单的事实)是“肯定的”——他们说的是或可能是真的。
向 prolog 程序添加新的此类规则只会增加“正面”知识。它不能添加“负面”事实来说明某事不真实。
问题
这就是所谓的单调逻辑吗?
称为“失败否定”的程序(非逻辑)构造是添加“否定”事实以打破纯逻辑序言的单调性(例如规则异常(exception))所需的技巧。
我说的对吗?
更新
要求示例的评论。
likes(mary, X) :- reptile(X), !, fail.
likes(mary, X) :- animal(X).
如果没有程序剪辑,就无法在纯逻辑序言中定义 Mary 喜欢爬行动物以外的动物。 (这是正确的吗?)
最佳答案
就 Prolog 而言,单调程序是指添加更多子句不会减少谓词* 解集的程序。相反,删除子句永远不会增加在此类程序中找到的解决方案。假设@brebs 的定义
likes(mary, X) :- animal(X), \+ reptile(X).
如果您向reptile/1
添加更多的事实,Mary 喜欢的动物集合可能会减少。所以这是一个非单调行为的例子。但是请注意,只有在调用 \+ reptile(X)
时 充分实例化 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 模非终止和错误
关于prolog - Prolog 中的失败否定和逻辑单调性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74386752/