[Prolog]論理パズル/正直者は誰? (失敗例)

非常に素直に実装してみたら解けてない。
「嘘つきは1人いる」か否かをチェックするために、「嘘つきは1人いる」か否かをチェックするため、無限再帰に陥る。

非常に素直に実装してみたら解けてない。
「嘘つきは1人いる」か否かをチェックするために、「嘘つきは1人いる」か否かをチェックするため、無限再帰に陥る。

%
/*
A11
A22
A33
A44
A55
(' ', 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]
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX