答案集编程 - 使FACT无效

问题描述 投票:1回答:2

当知识库中已存在(也)一个默认语句时,我有一个关于如何使现有事实无效的答案集编程的问题。

例如,有两个人sebyandy,其中一个能够立即开车。情况可能是seby可以驾驶,如第3行所示,但是让我们说,在他的执照被取消后他不能再开车了,因此我们现在有4到7号线,同时andy学习驾驶,如第7行所示。第6行显示只有一个人可以一次开车,除了显示sebyandy不一样。

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).

非常感谢提前。

automation artificial-intelligence answer-set-programming clingo
2个回答
0
投票

我不完全理解这个问题。第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.

0
投票

如果某些事情是真的,那一定是真的。因此行:

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值最大化。

© www.soinside.com 2019 - 2024. All rights reserved.