在约束处理规则中表示逻辑分离

时间:2017-05-08 00:04:21

标签: prolog clp constraint-handling-rules

我正在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)).

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

1 个答案:

答案 0 :(得分:3)

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

例如,使用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仍未绑定的事实来看,你可以说两个真值都是可以接受的。