Пролог Инсульт / Проблема с рассадкой - PullRequest
1 голос
/ 04 июня 2011

Это проблема.Мистер и миссис Астор, мистер и миссис Блейк, мистер и миссис Крейн, а также миссис и миссис Дэвис сидели за круглым столом. Миссис Астор оскорбляла мистер Блейк, который сидел рядом сее слева от нее. Мистер Блейк был оскорблен миссис Крейн, которая сидела напротив него через центр стола. Миссис Крейн была оскорблена хозяйкой, миссис Дэвис. Хозяйка была единственным человеком, который сидел между каждым изсупружеская пара. Хозяйка была единственным человеком, который сидел между каждой из супружеских пар. Хозяйка была оскорблена единственным человеком, который сидел между двумя мужчинами. Кто оскорбил хозяйку? Также напечатайте порядок рассадки, начиная с хозяйки. "

Итак, что я попробовал, было

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.

Я совершенно новичок в Прологе, и в этой проблеме я не уверен, правильно ли я пишу код.Любые предложения?

Я действительно не понимаю, что фраза "хозяйка была единственным человеком, чтобы сидеть между каждой из супружеской пары".Мистер Дэвис также хостесс?И хозяйка, кроме двух пар, которые сидят рядом с хозяйкой, все остальные пары сидят рядом со своими партнерами?Вроде запутанно ...

1 Ответ

0 голосов
/ 05 июня 2011

Подобные проблемы и решения вы можете найти в папке «examples» текущего дистрибутива Logtalk.Вы также можете просмотреть исходный код в режиме онлайн здесь:

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

См., Например, источник "Houses.lgt" (классический) или "camp_swampy.lgt"файлы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...