我正在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)).
是否可以使用单个语句而不是多个冗余语句来实现此公式?
答案 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
仍未绑定的事实来看,你可以说两个真值都是可以接受的。