意外とすっきりした解答が得られたので。
意外とすっきりした解答が得られたので。
/*
帽子は何色?
論理的思考力を持つ3人の正直者 a, b, c に、5つの帽子(赤×3, 白×2)のうち3つを1つずつ被せる。
どの人も、他2人の帽子の色を知っている(∵見えている)が、自身の帽子の色は知らない。
出題者「あなたの帽子の色は?」 a「……わかりません。」
出題者「あなたの帽子の色は?」 b「……わかりません。」
出題者「あなたの帽子の色は?」 ――さて、c の帽子の色は?
% 出展('数学ガール ゲーデルの不完全性定理', page: 16).
% (同値な問題だが、文字数圧縮のため問題文は書き直した。)
*/
insert(E, Set, [E|Set]).
insert(E, [X|Set0], [X|Set]) :- insert(E, Set0, Set).
部分集合([], X).
部分集合([H|L], R) :- insert(H, R0, R), 部分集合(L, R0).
不確定(X, Cond) :- % 条件 Cond を満たす変数 X は一意に存在しない
setof(X, Cond, L), \+(length(L, 1)).
?- _hats = [赤, 赤, 赤, 白, 白], % 簡単のため
A = 赤, B = 赤, (C = 赤 ; C = 白),
% 部分集合([A, B, C], _hats),
% a には自身の帽子の色 ASelf が確定できない
不確定(ASelf, 部分集合([ASelf, B, C], _hats)),
% a には自身の帽子の色 ASelf が確定できないことが分かっていても、
% b には自身の帽子の色 BSelf が確定できない
不確定(BSelf, (
部分集合([A, BSelf, C], _hats),
不確定(ASelf2, 部分集合([ASelf2, BSelf, C], _hats))
)).
% A = 赤, B = 赤, C = 赤