statements( [ say( Who, What ) | OtherStatements ] ) :-
	yes( say( Who, What ) ),
	statements( OtherStatements ).
statements( [] ).


truth( ( A , B ) ) :- !, truth( A ), truth( B ).
truth( ( A ; B ) ) :- !, ( truth( A ), truth( B );
			   lie( A ),   truth( B );
			   truth( A ), lie( B ) ).
truth( A ) :- yes( A ).


lie( ( A , B ) ) :- !, ( lie( A ),   truth( B );
		         truth( A ), lie( B );
		         lie( A ),   lie( B ) ).
lie( ( A ; B ) ) :- !, lie( A ), lie( B ).
lie( A ) :- no( A ).


no( liar-person   = honest-person ).
no( honest-person = liar-person   ).
no( say( honest-person, What ) ) :-   lie( What ). 
no( say( liar-person,   What ) ) :- truth( What ). 


yes( honest-person = honest-person ).
yes( liar-person   = liar-person   ).
yes( say( honest-person, What ) ) :- truth( What ).
yes( say( liar-person,   What ) ) :-   lie( What ).



/*********************************************/


q1(A,B,C) :-
statements( [ say( B, say( A, A = liar-person ) ),
                 say( C, B = liar-person ) ] ).


q2(A,B,C) :-
statements( [ say( B, say( A, ( ( A = liar-person,
		   		     B = liar-person,
				     C = honest-person );
				   ( A = liar-person,
				     B = honest-person,
				     C = liar-person   );
			           ( A = honest-person,
				     B = liar-person,
				     C = liar-person ) ) ) ),
	         say( C, B = liar-person ) ] ).


q3(A,B,_) :-
statements( [ say( A, ( A = liar-person ; B = liar-person ) ) ] ).


q4(A,B,_) :-
statements( [ say( A, ( A = liar-person ; B = honest-person ) ) ] ).


q5(A,B,_) :-
statements( [ say( A, ( A = liar-person , B = honest-person ) ) ] ).


q6(A,B,C) :-
statements( [ say( A, ( B = liar-person ) ),
	         say( B, ( A = C ) ) ] ).


q7(A,B,C) :-
statements( [ say( A, ( A = liar-person, B = liar-person, C = liar-person ) ),
	         say( B, ( ( A = honest-person,
			     B = liar-person,
			     C = liar-person) ;
		           ( A = liar-person,
			     B = honest-person,
			     C = liar-person) ;
			   ( A = liar-person,
			     B = liar-person,
			     C = honest-person ) ) ) ] ).


q8(A,B,C) :-
statements( [ say( A, ( A = liar-person, B = liar-person, C = liar-person ) ),
	         say( B, ( ( A = honest-person,
			     B = honest-person,
			     C = liar-person) ;
			   ( A = liar-person,
			     B = honest-person,
			     C = honest-person) ;
			   ( A = honest-person,
			     B = liar-person,
			     C = honest-person ) ) ) ] ).

