Ограниченное программирование булева решателя

Хьюи, Дьюи и Луи допрашиваются их дядей. Вот заявления, которые они делают:

• Хьюи: "Дьюи и Луи имели равную долю в этом; если один виновен, значит и другой ".

• Дьюи: "Если Хьюи виновен, то и я тоже".

• Луи: "Мы с Дьюи не виноваты"

Их дядя, зная, что они разведчики, понимает, что не может сказать неправду.

Мое решение.

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)];

Миницинк не может решить это.

4 ответа

Вот моя (старая) версия этой проблемы: 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))
;

Еще одно решение, использующее 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.

Для такого рода проблем я предпочитаю использовать булево соответствие (SAT) напрямую. Ваша проблема, очевидно, может быть сформулирована как логическая формула высказывания следующим образом (с использованием формата DIMACS):

Атом 1: Дьюи виновен (т.е. будет связан с литералами -1 и 1 в CNF) Атом 2: Луи виновен (т.е. будет связан с литералами -2 и 2 в CNF) Атом 3: Хьюи виноват (т.е. будет связан с литералами -3 и 3 в CNF)

Файл CNF тогда:

пнф 4 3
-1 2 0
-2 1 0
-3 1 0
-1 -2 0

И вот решение с использованием "онлайн" SAT Solver: http://boolsat.com/show/5320e18a0148a30002000002

Другой вариант - спросить WolframAlpha:

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

Как предположил Хакан, также возможно следующее эквивалентное выражение:

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

Результатом является таблица истинности, которая имеет только (!D !H !L) как решение.

Другие вопросы по тегам