在约束处理规则中表示逻辑析取
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
仍然未绑定的事实来看,您可以看出两个真值仍然是可接受的。
我正在 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
仍然未绑定的事实来看,您可以看出两个真值仍然是可接受的。