/*有a,b,c,d,e5个人,每人头戴一顶黑色或者白色的帽子,每个人只能看到其他人头上帽子的颜色,看不见自己的。
戴白帽子的当且仅当他说真话,戴黑帽子的当且仅当他说假话。已知
a:我看见三顶白帽子和一顶黑帽子
b:我看见四顶黑帽子
c:我看见一顶白帽子和三顶黑帽子
e:我看见四顶黑帽子
求五个人各自戴何种颜色的帽子
*/
a(1).
a(0).
b(1).
b(0).
c(1).
c(0).
d(1).
d(0).
e(1).
e(0).
a_says(A,B,C,D,E):-A+B+C+D+E=:=4,A=1.
a_says(A,B,C,D,E):-not((A+B+C+D+E=:=3)),A=0.
b_says(A,B,C,D,E):-A+B+C+D+E=:=1,B=1.
b_says(A,B,C,D,E):-not((A+B+C+D+E=:=0)),B=0.
c_says(A,B,C,D,E):-A+B+C+D+E=:=2,C=1.
c_says(A,B,C,D,E):-not((A+B+C+D+E=:=1)),C=0.
e_says(A,B,C,D,E):-A+B+C+D+E=:=1,E=1.
e_says(A,B,C,D,E):-not((A+B+C+D+E=:=0)),E=0.
hatcondition(A,B,C,D,E):-a(A),b(B),c(C),d(D),e(E),a_says(A,B,C,D,E),b_says(A,B,C,D,E),c_says(A,B,C,D,E),
e_says(A,B,C,D,E),
assert(count(0)),count(N),retract(count(0)),NN is N+1,write(NN),asserta(count(NN)),(NN>1->retract(count(N));true),
write((a(A),b(B),c(C),d(D),e(E))),nl,fail.
hatcondition(A,B,C,D,E):-retract(count(N)),fail.
戴白帽子的当且仅当他说真话,戴黑帽子的当且仅当他说假话。已知
a:我看见三顶白帽子和一顶黑帽子
b:我看见四顶黑帽子
c:我看见一顶白帽子和三顶黑帽子
e:我看见四顶黑帽子
求五个人各自戴何种颜色的帽子
*/
a(1).
a(0).
b(1).
b(0).
c(1).
c(0).
d(1).
d(0).
e(1).
e(0).
a_says(A,B,C,D,E):-A+B+C+D+E=:=4,A=1.
a_says(A,B,C,D,E):-not((A+B+C+D+E=:=3)),A=0.
b_says(A,B,C,D,E):-A+B+C+D+E=:=1,B=1.
b_says(A,B,C,D,E):-not((A+B+C+D+E=:=0)),B=0.
c_says(A,B,C,D,E):-A+B+C+D+E=:=2,C=1.
c_says(A,B,C,D,E):-not((A+B+C+D+E=:=1)),C=0.
e_says(A,B,C,D,E):-A+B+C+D+E=:=1,E=1.
e_says(A,B,C,D,E):-not((A+B+C+D+E=:=0)),E=0.
hatcondition(A,B,C,D,E):-a(A),b(B),c(C),d(D),e(E),a_says(A,B,C,D,E),b_says(A,B,C,D,E),c_says(A,B,C,D,E),
e_says(A,B,C,D,E),
assert(count(0)),count(N),retract(count(0)),NN is N+1,write(NN),asserta(count(NN)),(NN>1->retract(count(N));true),
write((a(A),b(B),c(C),d(D),e(E))),nl,fail.
hatcondition(A,B,C,D,E):-retract(count(N)),fail.