微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Prolog侮辱/就座问题

如何解决Prolog侮辱/就座问题

| 这就是问题。 “阿斯特先生和太太,布莱克先生和太太,克兰先生和太太以及戴维斯太太和太太坐在一张圆桌旁。阿斯特太太受到布雷克先生的侮辱,后者坐在旁边布莱克先生在桌子对面坐在他对面的克兰太太侮辱了布莱克先生,克雷夫太太被女主人戴维斯太太侮辱了,女主人是唯一一个坐在彼此之间的人。 \女主人是唯一一个坐在一对夫妻之间的人。女主人被唯一一个坐在两个男人之间的人侮辱了。谁侮辱了女主人?还要打印从女主人开始的座位顺序。\ ” 所以我尝试的是
insult(A,B). /*A insults B*/

seats([seat(_,1),seat(_,2),3),4),5),6),7),8)]). /*Clockwise*/

table(Seats,Who) :- seats(Seats),member(seat(mrastor,MA),Seats),member(seat(mrsastor,MRSA),member(seat(mrblake,MB),insult(MB,MB=:=MRSA+1,member(seat(mrsblake,MRSB),member(seat(mrcrane,MC),insult(MRSC,member(seat(mrscrane,MRSC),opposite(MRSC,member(seat(mrdavis,MD),member(seat(mrsdavis,MRSD),insult(MRSD,(between_men(MA,Who,MB); between_men(MA,MC); 
    between_men(MA,MD); between_men(MB,MC); 
    between_men(MB,MD); between_men(MC,MD)),print_seat(Seats),print_who(Who,mrsdavis). /*insult(Who,mrsdavis).*/

print_seat([A | B]) :- write(A),nl,print_seat(B).
print_seat([]).

print_who(Who,what) :- insult(Who,mrsdavis),write(Who).

member(X,[X | _]).
member(X,[_ | Y]) :- member(X,Y).

adjacent(X,Y) :- X =:= Y+1.
adjacent(X,Y) :- X =:= Y-1.

opposite(X,Y) :- X =:= Y+4. 
opposite(X,Y) :- X =:= Y-4.

between_men(X,Y,Z) :- X=Y+1,Y=Z+1.
between_men(X,Z) :- X=Y-1,Y=Z-1.
我在Prolog中是一个全新的人,因此我不确定是否以正确的方式进行编码。有什么建议么? 我真的不明白“女主人是唯一一对坐在一对已婚夫妇之间的人。”戴维斯先生也是女主人吗?而女主人除了坐在女主人旁边的两对夫妻之外,其他所有夫妻都坐在伴侣旁边?有点令人困惑...     

解决方法

        您可以在当前Logtalk发行版的\“ examples \”文件夹中找到类似的问题和解决方案。您也可以在此处在线浏览源代码: https://github.com/LogtalkDotOrg/logtalk3/tree/master/examples/puzzles 例如,请参见\“ houses.lgt \”(经典)或\“ camp_swampy.lgt \”源文件。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。