Я сделал это так:
?- People = [alice(_, _), beto(_, _), carl(_, _)], alice(People), carl(People), beto(People), write(People), nl, fail.
alice(People) :-
member(alice(honest, innocent), People),
member(carl(liar, thief), People).
alice(People) :-
member(alice(liar, _), People),
member(carl(honest, innocent), People).
carl(People) :-
member(carl(honest, _), People),
member(beto(liar, _), People),
member(alice(_, innocent), People).
carl(People) :-
member(carl(liar, _), People),
member(beto(honest, _), People),
member(alice(_, thief), People).
beto(People) :-
member(beto(honest, innocent), People),
member(carl(_, thief), People).
beto(People) :-
member(beto(liar, thief), People),
member(carl(_, innocent), People).
Результат [alice(liar, innocent), beto(liar, thief), carl(honest, innocent)]
.
Это немного проще:
alice([alice(honest, innocent), beto(_, _), carl(liar, thief)]).
alice([alice(liar, _), beto(_, _), carl(honest, innocent)]).
carl([alice(_, innocent), beto(liar, _), carl(honest, _)]).
carl([alice(_, thief), beto(honest, _), carl(liar, _)]).
beto([alice(_, _), beto(honest, innocent), carl(_, thief)]).
beto([alice(_, _), beto(liar, thief), carl(_, innocent)]).