1

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

例如,有两个人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).

提前非常感谢。

4

2 回答 2

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).为真,如果不能,则为假。drives(seby).为了做到这一点,如果可以的话,我们需要强迫 Clingo 实现。我们可以通过优化来做到这一点。

一种天真的方法是计算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 的值。

于 2019-04-12T09:55:54.020 回答
0

我不完全理解这个问题。第 3 行和第 4 行是不同的规则,即使第 4 行的前件是假的,第 3 行仍然是真的。换句话说,第 4 行似乎是多余的。

看起来你想要一个选择。我假设 ab(d(drives(seby))) 表示 seby 已经失去了他们的许可证。所以,第四行下面是你对只有有驾照的人的限制。第五行是选择,所以默认情况下,andy 或 seby 可以开车,但不能同时开车。请注意地面程序中的第五行如何等同于驱动器(seby):-而不是驱动器(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.
于 2017-09-25T12:19:02.320 回答