非常に素直に実装してみたら解けてない。
「嘘つきは1人いる」か否かをチェックするために、「嘘つきは1人いる」か否かをチェックするため、無限再帰に陥る。
非常に素直に実装してみたら解けてない。
「嘘つきは1人いる」か否かをチェックするために、「嘘つきは1人いる」か否かをチェックするため、無限再帰に陥る。
% 嘘つき問題
/*
正直者は誰?
A1「ここに、嘘つきは1人いる。」
A2「ここに、嘘つきは2人いる。」
A3「ここに、嘘つきは3人いる。」
A4「ここに、嘘つきは4人いる。」
A5「ここに、嘘つきは5人いる。」
引用('数学ガール ゲーデルの不完全性定理', page: 3).
*/
% 定義
嘘(A) :- \+(A).
正直者(P) :- 人(P), \+(嘘つき(P)).
嘘つき(P) :- 人(P), 主張(P, A), 嘘(A).
'嘘つきはN人いる'(N) :- setof(P, 嘘つき(P), L), length(L, N).
% 問題
人(a1). 主張(a1, '嘘つきはN人いる'(1)). % 元々閉世界なので「ここに、」は不要
人(a2). 主張(a2, '嘘つきはN人いる'(2)).
人(a3). 主張(a3, '嘘つきはN人いる'(3)).
人(a4). 主張(a4, '嘘つきはN人いる'(4)).
人(a5). 主張(a5, '嘘つきはN人いる'(5)).
:- trace. % ステップ実行にて無限再帰を確認なされ
?- setof(P, 正直者(P), L). % 正直者リスト L を求める。
% L = [a4]