11
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)).