约束编程布尔求解器

时间:2014-03-12 15:28:29

标签: constraint-programming minizinc clpb

Huey,Dewey和Louie正被他们的叔叔盘问。以下是他们的陈述:

•休伊:“杜威和路易在其中占有相同份额;如果一个人有罪,另一个人也有罪。“

•杜威:“如果休伊有罪,那么我也是。”

路易:“杜威和我都没有内疚。”

他们的叔叔知道他们是侦察员意识到他们不能说谎。

我的解决方案。

var bool :D; var bool :L; var bool :H;
    constraint D <->L;
    constraint H -> D;
    constraint D!=L;
    solve satisfy;
    output[show(D), "\n", show(L),"\n", show(H)];

Minizinc无法解决它。

4 个答案:

答案 0 :(得分:3)

以下是此问题的我(旧)版本:http://www.hakank.org/minizinc/huey_dewey_louie.mzn

 var bool: huey;
 var bool: dewey;
 var bool: louie;

 constraint
   %  Huey: Dewey and Louie has equal share in it; if one is quitly, so is the other.
   (dewey <-> louie)

   %  Dewey: If Huey is guilty, then so am I.
   /\
   (huey -> dewey)

   %  Louie: Dewey and I are not both quilty.
   /\
   (not (dewey /\ louie))
;

答案 1 :(得分:2)

对于这类问题,我更喜欢直接使用布尔可满足性(SAT)。您的问题显然可以表述为命题逻辑公式如下(使用DIMACS格式):

原子1:杜威有罪(即将与CNF中的文字-1和1相关联) 原子2:路易有罪(即将与CNF中的文字-2和2相关联) 原子3:休伊有罪(即将与CNF中的文字-3和3相关联)

CNF文件是:

p cnf 4 3
-1 2 0
-2 1 0
-3 1 0
-1 -2 0

这里是使用“在线”SAT解算器的解决方案:http://boolsat.com/show/5320e18a0148a30002000002

答案 2 :(得分:2)

另一种解决方案,使用CLP(B)(对布尔变量进行约束逻辑编程)与SICStus Prolog或SWI:

:- use_module(library(clpb)).

guilty(H, D, L) :-
    sat(D =:= L), % Huey
    sat(H =< D),  % Dewey
    sat(~(D*L)).  % Louie

示例查询及其结果:

?- guilty(H, D, L).
D = H, H = L, L = 0.

答案 3 :(得分:1)

另一种选择是问WolframAlpha

not (L xor D) and (H implies D) and not (L and D)

根据Hakan的建议,以下equivalent expression也是可能的:

(L equivalent D) and (H implies D) and not (L and D)

结果是一个真值表,只有(!D !H !L)作为解决方案。

enter image description here