假设我们有以下程序:
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/