•休伊:“杜威和路易在其中占有相同份额;如果一个人有罪,另一个人也有罪。“
•杜威:“如果休伊有罪,那么我也是。”
路易:“杜威和我都没有内疚。”他们的叔叔知道他们是侦察员意识到他们不能说谎。
我的解决方案。
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无法解决它。
答案 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)
作为解决方案。