首页 > 解决方案 > 如何在 PROLOG 中制造负面事实

问题描述

如果我在 PROLOG 中有一个事实“安娜是一个人”,我会写例如:

person(anna).

但是,如果我有一个事实“表不是人”,我该怎么写。我试过了

not(person(table)).

但这不起作用。我如何写负面事实?

标签: prolog

解决方案


在 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


推荐阅读