помогите решить задачу через пролог ( язык программирования)

В гостинице за круглым обеденным столом встретились 5 гостей родом из Москвы, Петербурга, Новгорода, Перми и Томска. Их фамилии Юрин, Томин, Алешин, Николаев и Викторов. Москвич сидел между томичем и Викторовым , петербуржец - между Юриным и Томиным, а напротив него сидели пермяк и Алешин. Николаев никогда не был в Петербурге, Юрин бывал в Москве и Томске, а томич с Томиным регулярно переписываются. Определите, в каком городе живет каждый из постояльцев гостиницы.
12 года назад от артем крамер

1 ответ

0 голосов
Ой, я уже не помню, как там с прологом работать. Сначала определите предикаты, которые понадобятся, например City (X, Y) - определяет живёт ли X в городе Y. Between (X, Y, Z) - определяет, находится ли Y между X и Z (я не знаю, имет ли в условиях значение порядок перечисляемых персонажей, будем считать, что имет, т. е, что если сказано что Б находится между А и В, то А находится слева от Б, а В - справа) . Другой способ - определить предикаты Left и Right, либо, если по условию порядок неважен, предикат Near. Предикат Opposite (A, B, C) определяет, находятся ли B и C напротив A. Из условий опять же не совсем ясно имет ли значение порядок переменных в данном предикате. Пожалуй, этих предикатов хватит. Теперь самое главное чётко сформулировать все правила. Это, пожалуй, будет самое сложное. Например, попробуем сформулировать условие, что в каждом городе живёт только один из гостей:
 
City (H, C) :- ! City (H1, C) , H ! = H1;
Перевожу на русский: H живёт в городе С, если Н1 не живёт в городе С и Н не равен Н1 (Совсем не помню синтаксис языка пролог, так что, если что не так напишу, исправьте)
 
Довольно сложно будет описать расположение гостей за круглым столом. Попробую, например, сформулировать правило, что те, кто сидит напротив человека, не сидит ним рядом:
 
Between (X, Y, Z) :- Opposite (Y, A, B) , A! =X, A! =Y, A! =Z, B! =X, B! =Y, B! =Z;
 
Да, кстати, не забудьте сформулировать правила, по которым в Предикатах Between и Opposite никакие переменные не должны совпадать.
 
Пожалуй, попробую ещё сформулировать это правило на прологе: "Москвич сидел между томичем и Викторовым":
 
City (X, 'Москва') :- Between (Y, X, 'Викторов') , City (Y, 'Томск') ;
 
петербуржец - между Юриным и Томиным:
 
City (X, 'Петербург') :- Between ('Юрин', X, 'Томин') ;
 
а напротив него сидели пермяк и Алешин:
 
City (X, 'Петербург') :- Opposite (Y, X, 'Алёшин') , City (Y, 'Пермь') ;
 
"Николаев никогда не был в Петербурге, Юрин бывал в Москве и Томске" - из этих условий, как я понимаю, мы получаем информацию о том, что указанные города не являются родными для данных людей:
 
City ('Николаев', 'Петербург') = false;
City ('Юрин', 'Москва') = false;
City ('Юрин', 'Томск') = false;
 
"а томич с Томиным регулярно переписываются" - отсюда мы делаем вывод, что это разные люди:
 
City ('Томин', 'Томск') = false;
 
Вот, примерно в таком ключе пишется программа на прологе. Продумайте хорошенько все предикаты, все факты и все условия (я наверняка что-то забыл) и опишите их, затем в разделе goal пишете:
 
City ('Юрин', X)
City ('Томин', X)
и т. д.
 
P. S.
Как уже сказал, за точность синтаксиса не ручаюсь, но смысл примерно такой.
12 года назад от никита гщзоодл

Связанные вопросы