% Each person can have from one to six doughnuts.
Canhave(D) :- member(D,[1,2,3,4,5,6]).
% Helper rules
has(N,N).
Nothas(N,D) :- canhave(N), N\=D.
% In the following, the variable (upper case) with the person's name represents
% the number of doughnuts the that person had.
% Positive and negative version of statements from Jack
state(jack, Jack, Janet) :- has(Janet,2), has(Jack,1)).
State(jack, Jack, Janet) :- nothas(Janet,2), nothas(Jack,1).
% Positive and negative version of statements from Janet
state(janet, Jack, Janet) :- has(Janet,2), has(Jack, 2).
State(janet, Jack, Janet) :- nothas(Janet,2), nothas(Jack,2).
% Positive and negative version of statements from Chrissy
state(chris, Jack, Janet) :- has(Janet,2), canhave(Jack), Jack>3.
state(chris, Jack, Janet) :- nothas(Janet,2), canhave(Jack), Jack=<3.
solve(Jack, Janet, Chris) :-
state(jack, Jack, Janet),
state(janet, Jack, Janet),
state(chris, Jack, Janet),
canhave(Chris),
6 is Jack+Janet+Chris,!.
Typing
?- solve(Jack, Janet, Chris).
Produces: