Prolog侮辱/座位问题

时间:2011-06-04 05:01:47

标签: list prolog

这就是问题所在。 “阿斯特先生和夫人,布莱克先生和夫人,克莱恩先生和夫人以及戴维斯夫人和夫人坐在一张圆桌旁。阿斯特太太被布莱克先生侮辱,他坐在旁边。她在她的左边。布莱克先生在桌子中央坐在他对面的克莱恩夫人的侮辱下。克莱恩夫人受到女主人戴维斯夫人的侮辱。女主人是唯一坐在她们之间的人。女主人是唯一一个坐在已婚夫妇之间的人。女主人被唯一一个坐在两个男人之间的人侮辱。谁侮辱了女主人?还要从女主人那里打印座位。“ / p>

所以我试过的是

insult(A, B). /*A insults B*/

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

table(Seats,Who) :- seats(Seats),
    member(seat(mrastor,MA),Seats), 
    member(seat(mrsastor,MRSA),Seats),
    member(seat(mrblake,MB),Seats), insult(MB,MRSA), MB=:=MRSA+1,
    member(seat(mrsblake,MRSB),Seats),
    member(seat(mrcrane,MC),Seats), insult(MRSC,MB),
    member(seat(mrscrane,MRSC),Seats), opposite(MRSC, MB),
    member(seat(mrdavis,MD),Seats), 
    member(seat(mrsdavis,MRSD),Seats), insult(MRSD,MRSC),
    (between_men(MA, Who, MB); between_men(MA, Who, MC); 
    between_men(MA, Who, MD); between_men(MB, Who, MC); 
    between_men(MB, Who, MD); between_men(MC, Who, 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, Y, Z) :- X=Y-1, Y=Z-1.

我在Prolog中是全新的,这个问题我不确定我是否以正确的方式编码。有什么建议吗?

我真的不明白“女主人是唯一一个坐在已婚夫妇之间的人”这句话。戴维斯先生也是女主人吗?还有坐在女主人旁边的两对女主人,所有其他夫妻坐在他们的伴侣旁边?有点令人困惑......

1 个答案:

答案 0 :(得分:-1)

您可以在当前Logtalk发行版的“examples”文件夹中找到类似的问题和解决方案。您还可以在线浏览源代码:

https://github.com/LogtalkDotOrg/logtalk3/tree/master/examples/puzzles

例如,请参阅“hou​​ses.lgt”(经典)或“camp_swampy.lgt”源文件。