0

我正在 Prolog 中编写一个约束求解器,它实现了一个简单的逻辑公式:

"(alive(A) and animal(A)) iff (awake(A) or asleep(A))".

我在约束处理规则中找到了一种实现它的方法,但它比原始公式要冗长得多:

:- use_module(library(chr)).

:- chr_constraint is_true/1.
is_true(A) \ is_true(A) <=> true.

is_true(alive(A)),is_true(animal(A)) ==> is_true(awake(A));is_true(asleep(A)).
is_true(awake(A)) ==> is_true(animal(A)),is_true(alive(A)).
is_true(asleep(A)) ==> is_true(animal(A)),is_true(alive(A)).

是否可以使用单个语句而不是多个冗余语句来实现此公式?

4

1 回答 1

3

这不是对您的字面问题的直接回答。但是,我仍然想完全指出一个替代解决方案:至少在这种具体情况下,所有陈述都是命题陈述,因此您可以将整个句子建模为对命题的布尔约束

例如,使用 CLP(B):

?- sat((Alive_A * Animal_A) =:= (Awake_A + Asleep_A))。

如果您现在实例化任何变量,约束求解器会自动传播它所能传播的一切。例如:

?- sat((Alive_A * Animal_A) =:= (Awake_A + Asleep_A)),
    Animal_A = 0. 
Animal_A = Awake_A, Awake_A = Asleep_A, Asleep_A = 0,
坐(Alive_A=:=Alive_A)。

Alive_A仍然不受约束的事实可以看出,两个真值仍然是可接受的。

于 2017-05-09T00:05:31.243 回答