Prolog 人工智能语言中文论坛---打造优质Prolog学习交流园地

一个供Prolog爱好者学习与交流的地方


您没有登录。 请登录注册

帽子类问题1

浏览上一个主题 浏览下一个主题 向下  留言 [第1页/共1页]

1 帽子类问题1 于 周一 九月 24, 2012 1:38 pm

/*有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.

查阅用户资料

2 我的解決方式 于 周六 九月 29, 2012 6:17 pm

代码:

color(blackhat, black).
color(whitehat, white).
word(truth, truth).
word(lie, lie).
person('Alan', _HatOfAlan, _WordOfAlan).
person('Bob', _HatOfBob, _WordOfBob).
person('Charlie', _HatOfCharlie, _WordOfCharlie).
person('David', _HatOfDavid, _WordOfDavid).
person('Eason', _HatOfEason, _WordOfEason).
hat(Person, blackhat) :-
   person(Person, Hat, _), color(Hat, black),
   truth(Person, lie).
hat(Person, whitehat) :-
   person(Person, Hat, _), color(Hat, white),
   truth(Person, truth).
truth(Person, Truth) :-
   person(Person, _, Word), word(Word, Truth).
count([], 0, 0).
count([[_Person, Hat]|T], CountOfBlack, CountOfWhite) :-
   color(Hat, black), !,
   count(T, B1, CountOfWhite), CountOfBlack is B1 + 1.
count([[_Person, Hat]|T], CountOfBlack, CountOfWhite) :-
   color(Hat, white), !,
   count(T, CountOfBlack, W1), CountOfWhite is W1 + 1.
truth_or_not(_Person, Goal, whitehat) :- Goal.
truth_or_not(_Person, Goal, blackhat) :- not(Goal).
interweave_/(_, [], _, []) :- !.
interweave_/(_, _, [], []) :- !.
interweave_/(H, [H1|T1], [H2|T2], [[H1,H2]|T3]) :- H \= H1, !,
   interweave_/(H, T1, T2, T3).
interweave_/(H1, [H1|T1], [_|T2], T3) :-
   interweave_/(H1, T1, T2, T3).
hatOfPeople(HatsOfPeople) :-
   People = ['Alan', 'Bob', 'Charlie', 'David', 'Eason'],
   Hats = [HatOfAlan, HatOfBob, HatOfCharlie, HatOfDavid, HatOfEason],
   hat('Alan', HatOfAlan),
   hat('Bob', HatOfBob),
   hat('Charlie', HatOfCharlie),
   hat('David', HatOfDavid),
   hat('Eason', HatOfEason),
   interweave_/('Alan', People, Hats, PH1),
   truth_or_not('Alan', count(PH1, 1, 3), HatOfAlan),
   interweave_/('Bob', People, Hats, PH2),
   truth_or_not('Bob', count(PH2, 4, 0), HatOfBob),
   interweave_/('Charlie', People, Hats, PH3),
   truth_or_not('Charlie', count(PH3, 3, 1), HatOfCharlie),
   interweave_/('Eason', People, Hats, PH4),
   truth_or_not('Eason', count(PH4, 4, 0), HatOfEason),
   interweave_/([], People, Hats, HatsOfPeople).

查阅用户资料 http://yauhsien.wordpress.com

浏览上一个主题 浏览下一个主题 返回页首  留言 [第1页/共1页]

您在这个论坛的权限:
不能在这个论坛回复主题