假设我们有以下程序:

human(socrates).
day(tomorrow).
die(X) :- human(X).
may_go_to_school(Y) :- day(Y),
                       not holiday(Y).
如果我们运行clingo来获取程序的答案集,则会得到
Answer: 1
human(socrates) day(tomorrow) die(socrates) may_go_to_school(tomorrow)
我们知道接地程序首先将所有变量实例化为常量,因此接地程序如下:
human(socrates).
day(tomorrow).
die(socrates) :- human(socrates).
may_go_to_school(tomorrow) :- day(tomorrow),
                              not holiday(tomorrow).
我在book from Gelfond中阅读,它给出了3条规则来获取答案集:

在规则中:
may_go_to_school(tomorrow) :- day(tomorrow),
                              not holiday(tomorrow).
我们得到了失败not holiday(tomorrow)的否定
如这本书所示:

然后基于规则1 believe in the head of a rule if you believe in its body,我应该相信主体not holiday(tomorrow).,因为我不应该相信holiday(tomorrow).¬holiday(tomorrow).吗?
根据答案,我应该相信¬holiday(tomorrow).
  • 那么,为什么我们需要这种否定作为失败?
  • 我们可以只使用经典否定吗?
  • 最佳答案



    好吧,看来我们做不到。问题在于我们无法实现逻辑求反。主要思想是Prolog为您的程序理论生成一个模型(Herbrand模型)。添加否定时,程序的语义会发生变化,因此Prolog可能无法使用sld解析找到模型。因此,否定即失败具有以下优势:我们可以进行否定(不完全是逻辑否定),而程序语义仍然不会像传统否定那样出现问题。

    您可以看一下我的相关问题:Logical Negation in Prolog。这个问题与这个问题的要求并不完全相同,但是他的答案中的@ j4n bur53描述了为什么我们不能进行逻辑否定。

    关于answer-set-programming - 如何将否定理解为ASP中的失败?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52961340/

    10-12 17:09