在Clingo指南中,引入了两种模式,称为谨慎模式和勇敢模式,如下所示:
勇敢计算某人的勇敢后果(所有答案集的总和) 逻辑程序。
谨慎计算逻辑程序的谨慎后果(所有答案集的交集)。
指南中未提供更多信息。我尝试了一些示例,但在理解该问题时遇到了麻烦。
我尝试运行以下简单的ASP程序:
p :- not q.
q :- not p.
运行不带模式参数的Clingo将给出正确的答案集:
answer 1:{p}
answer 2:{q}
如指南中所述,如果在勇敢模式下运行,它将计算所有答案集的并集,我应该得到结果{p, q}
。
同样,在谨慎的情况下,预期结果为空。
但是,Clingo进行勇敢推理的实际结果是:
clingo版本5.3.0
从test / cautious_reasoning.lp读取
解决...
答案:1
q
后果:[1; 2]
答案:2
q p
后果:[2; 2]
满意
型号:2
勇敢:是
后果:2
通话次数:1
时间:0.006秒(解决:0.00秒,第一模式:0.00秒未饱和:0.00秒)
CPU时间:0.002s
对于谨慎的情况:
clingo版本5.3.0
从test / cautious_reasoning.lp读取
解决...
答案:1
q
后果:[0; 1]
答案:2
后果:[0; 0]
满意
型号:2
谨慎:是
后果:0
通话次数:1
时间:0.001秒(解决:0.00秒,第一模式:0.00秒未饱和:0.00秒)
CPU时间:0.001秒
那么[]
中的数字代表什么?如何理解Clingo中谨慎而勇敢的推理模式?
答案 0 :(得分:1)
当您使用枚举算法--enum-mode brave
或--enum-mode cautious
调用clingo时,出现在每个枚举模型中的原子都会“收敛”到一系列勇敢或谨慎的结果上。也就是说,在brave
模式下,原子将单调增加,而在cautious
模式下,原子将单调减少。分别将其视为产生勇敢和谨慎后果的“运行中”工会或交叉路口。
方括号[d;p]
中的数字具有以下含义:每个模型的clingo调用TextOutput::printMeta
,它会打印一对具有明确结果[d;p]
的整数d
和Output::numCons
计算出的剩余可能后果p
。
编辑:最后一个答案将为您提供最终结果,即输入程序的勇敢/谨慎后果。如果您只关心最终结果,则可以像这样调用clingo来获得勇敢的结果(例如,程序a | b | c | d.
的结果)
% echo 'a|b|c|d.' | clingo -e brave | grep -A1 '^Answer:' | tail -n -1
b c d a
对于程序a | b | c | d.
的谨慎后果(即空集),您只需要在谨慎的枚举模式下启动clingo:
% echo 'a|b|c|d.' | clingo -e cautious | grep -A1 '^Answer:' | tail -n -1