在约束处理规则中表示逻辑析取

Representing logical disjunctions in Constraint Handling Rules

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

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

我在 Constraint Handling Rules 中找到了一种实现它的方法,但它比原来的公式要冗长得多:

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

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

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

例如,使用 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,
sat(Alive_A=:=Alive_A).

Alive_A 仍然未绑定的事实来看,您可以看出两个真值仍然是可接受的。