Clingo:怎么做 "If p causes UNSAT then q."

Clingo: How to do "If p causes UNSAT then q."

在下面的代码中

% Facts
a.

% Rules
-a :- a, not not p.

在上面添加事实 p. 会导致它成为 UNSAT。 clingo 中有没有办法添加规则来显示这一点?像

q :- Assuming p causes UNSAT.

添加规则等解决方案

{p; q} = 1.

不行。如果 p. 导致 UNSAT,它会在答案集中给出 q.,正如我想要的那样。但是,当 p. 不会导致 UNSAT 时,它会给出 p.q. 作为答案集。在 p. 不导致 UNSAT 的情况下,我不希望在答案集中出现 q.

我希望能够检查某些事实是否会导致某个复杂条件不成立。例如,假设问题的一部分要求您检查图形是否不包含哈密顿循环。如果图形满足条件,则找到哈密顿循环的程序将 return UNSAT,但我不希望程序结束,因为还有其他计算要做。

你或许可以把它当作一个优化问题。因此,通常是约束的东西变成了一个特殊的谓词,然后您试图将其最小化。基本上你有一些形式:

 err(err1) :- some-bad-condition.
 err(err2) :- some-other-bad-condition.

 #minimize{ 1,XXX: err(XXX) }.

这里的 XXX 是每个错误条件的唯一标识符。优化语句找到一个模型,使 err 的数量最小化。

唯一需要注意的是,这会增加问题的复杂性;您现在正在解决优化问题而不是决策问题。在调试 asp 程序时这是一个有用的技巧,但对于 large/difficult 问题它可能太慢了。