The criminal is one of A, B, C and D.
A says: \"It\'s not me\"
B says: \"It\'s D\"
C says: \"It\'s B\"
D says: \"It\'s not me\"
I ran across this problem and wanted to give it a shot :
a(K) :- K \== a.
b(d).
c(b).
d(K) :- K \== d.
solve(TruthTeller) :-
member(K, [a, b, c, d]),
xor([a(K), b(K), c(K), d(K)], Truth),
Truth =.. [TruthTeller|_].
xor([Head|Tail], Result) :-
( call(Head)
-> forall(member(X, Tail), \+ call(X)), Result = Head
; xor(Tail, Result)).