prolog - 如何在 PROLOG 中制造负面事实
问题描述
如果我在 PROLOG 中有一个事实“安娜是一个人”,我会写例如:
person(anna).
但是,如果我有一个事实“表不是人”,我该怎么写。我试过了
not(person(table)).
但这不起作用。我如何写负面事实?
解决方案
在 Prolog 中,通常您不必将否定断言为事实。没有肯定事实或证明规则会导致失败(或更准确地说,“缺乏可证明性”)。
因此,如果您只断言person(anna)
,那么查询person(anna).
将为真(成功或可证明),但person(table).
如预期的那样为假(失败或不可证明)。此外,查询person(X).
只会X = anna
按预期产生。
默认情况下,如果您查询person(X)
并且没有定义人员,Prolog 将给出一个错误,表明这person
是一个未知的谓词。如果您希望 Prolog 在这种情况下简单地失败,您可以设置一个选项(我在 SWI Prolog 中特别知道,但我不记得该选项是什么),或者您可以声明person/1
为动态谓词,如果您计划person
在程序执行时动态地将事实断言到您的数据库中。
作为谓词定义的一部分,您可能想要指出温血动物是哺乳动物但不是人。在这种情况下,您可能有:
warm_blooded_animal(X) :-
mammal(X),
\+ person(X).
这只是作为一个例子有点做作。在这种情况下,您更有可能mammal
根据温血等特征来定义,而不是相反。但是您明白了...请注意,not/1
不推荐使用运算符以支持 ISO 标准\+/1
。
推荐阅读
- python - 如何避免正则表达式中的组不匹配?
- qml - PySide 2“QVariantMap”信号 QT5.15 -> QT5.12
- pytorch - RobertaTokenizer() 和 from_pretrained() 初始化 RobertaTokenizer 的方式有什么区别?
- angular - 角度检查和取消数据中的复选框
- javascript - 在javascript(json对象)中删除localstorage的键值
- node.js - 我无法访问解析服务器中云代码函数中的响应对象?
- javascript - 在这种情况下,如何在嵌套页面中使用带有“精确参数”的反应路由器?
- javascript - 滚动时的水平布局
- c++ - 为什么我不能将 std::from_chars 的结果分配给 std::tie?
- bash - 在Linux中将内容文件复制到多个文件