当知识库中已存在(也)一个默认语句时,我有一个关于如何使现有事实无效的答案集编程的问题。
例如,有两个人seby
和andy
,其中一个能够立即开车。情况可能是seby
可以驾驶,如第3行所示,但是让我们说,在他的执照被取消后他不能再开车了,因此我们现在有4到7号线,同时andy
学习驾驶,如第7行所示。第6行显示只有一个人可以一次开车,除了显示seby
和andy
不一样。
1 person(seby).
2 person(andy).
3 drives(seby).
4 drives(seby) :- person(seby), not ab(d(drives(seby))), not -drives(seby).
5 ab(d(drives(seby))).
6 -drives(P) :- drives(P0), person(P), P0 != P.
7 drives(andy).
在上面的程序中,第3行和第7行与第6行相矛盾,而Clingo求解器(我使用它)显然输出UNSATISFIABLE
。
说完这一切之后,请不要说删除第3行,问题就解决了。提出这个问题背后的意图是要知道现在是否有可能让第3行无效地让第4行尽职尽责。
但是,第4行也可以写成:
4 drives(P) :- person(P), not ab(d(drives(P))), not -drives(P).
非常感谢提前。
我不完全理解这个问题。第3行和第4行是单独的规则,即使第4行的前提是假行第3行仍然是真的。换句话说,第4行似乎是多余的。
看起来你想要一个选择。我假设ab(d(驱动器(seby)))表示seby丢失了他们的许可证。因此,第四行是您对只有驾驶执照的人的约束。第五行是选择,因此默认情况下,andy或seby可以驱动但不能同时驱动。请注意在地面程序中第五行是如何等同于驱动器(seby): - 不是驱动器(andy)。和驱动器(andy): - 不是驱动器(seby)。您还可以使用seby作为使用优化语句的首选驱动程序(下面的选择规则就像优化语句)。
person(seby).
person(andy).
ab(d(drives(seby))).
:- person(P), ab(d(drives(P))), drives(P).
1{drives(P) : person(P)}1.
如果某些事情是真的,那一定是真的。因此行:
drives(seby).
永远都是真的。
但是,我们可以通过将事实放入选择规则来解决这个问题。
0{drives(seby)}1.
这条线说答案将有0到1 drives(seby).
。这意味着我们可以制定与drives(seby).
相矛盾的规则,答案仍然可以满足,但我们也可以让drives(seby).
成为现实。
这个程序都是:
0{drives(seby)}1.
drives(seby).
这个程序:
0{drives(seby)}1.
:- drives(seby).
是可以满足的。
如果可能的话,你很可能会想要drives(seby).
是真的,如果不可能的话,你会想要假。要做到这一点,我们需要强迫Clingo使drives(seby).
成为现实,如果可以的话。我们可以通过使用优化来实现。
一个天真的方法是计算存在多少drives(seby).
(0或1)并最大化计数。
我们可以用这一行计算drives(seby).
的数量:
sebyCount(N) :- N = #count {drives(seby) : drives(seby)}.
N等于域drives(seby).
中drives(seby).
的数量。这将是0或1。
然后我们可以使用以下语句最大化N的值:
#maximize {N@1 : sebyCount(N)}.
这使得在sebyCount(N)域中优先级为1(数字越低,优先级越低)的N值最大化。