prolog - Prolog 中的失败否定和逻辑单调性?

标签 prolog logic

我正在学习序言。

在我看来,prolog 的规则(关系和简单的事实)是“肯定的”——他们说的是或可能是真的。

向 prolog 程序添加新的此类规则只会增加“正面”知识。它不能添加“负面”事实来说明某事不真实。

问题

  1. 这就是所谓的单调逻辑吗?

  2. 称为“失败否定”的程序(非逻辑)构造是添加“否定”事实以打破纯逻辑序言的单调性(例如规则异常(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/

相关文章:

prolog - 提示不回来

prolog - 两个变量列表的交集

javascript - 除了长条件语句之外,是否有更 Eloquent 方法来比较三个或更多值

c - C 中的数字模式

search - boolean 逻辑(操作顺序)A和B或C

list - 使用 Prolog 折叠添加列表中的所有项目

prolog - 汉诺塔谜题(序言)

java - 检查点是否包含在矩形内时出错

sql - 对一组数据进行两个级别的分组。是否可以

prolog - 查找列表列表的长度