В поездке пятеро друзей — Антон, Борис, Вадим, Дима и Гриша, знакомились с попутчицей - Prolog

Узнай цену своей работы

Формулировка задачи:

Уважаемые, прошу помощи в решении задачи на Прологе)) В поездке пятеро друзей — Антон, Борис, Вадим, Дима и Гриша, знакомились с попутчицей. Они предложили ей отгадать их фамилии, причём каждый из них высказал одно истинное и одно ложное утверждение: Дима сказал: "Моя фамилия — Мишин, а фамилия Бориса — Хохлов". Антон сказал: "Мишин — это моя фамилия, а фамилия Вадима — Белкин". Борис сказал: "Фамилия Вадима — Тихонов, а моя фамилия — Мишин". Вадим сказал: "Моя фамилия — Белкин, а фамилия Гриши — Чехов". Гриша сказал: "Да, моя фамилия Чехов, а фамилия Антона — Тихонов". Какую фамилию носит каждый из друзей? Заранее ОГРОМНОЕ СПАСИБО за оказанную помощь!!!

Решение задачи: «В поездке пятеро друзей — Антон, Борис, Вадим, Дима и Гриша, знакомились с попутчицей»

textual
Листинг программы
% В поездке пятеро друзей — Антон, Борис, Вадим, Дима и Гриша, знакомились с попутчицей.
friends(['Антон', 'Борис', 'Вадим', 'Дима', 'Гриша']).
sirnames(['Мишин', 'Хохлов', 'Белкин', 'Тихонов', 'Чехов']).
% Они предложили ей отгадать их фамилии,
% причём каждый из них высказал одно истинное и одно ложное утверждение:
% Дима сказал: "Моя фамилия — Мишин, а фамилия Бориса — Хохлов".
approve('Дима', 'Дима', 'Мишин').     % 2 - Дима не Мишин (1)
approve('Дима', 'Борис', 'Хохлов').   % 1 + больше про Хохлова ничего, значит Борис
% Антон сказал: "Мишин — это моя фамилия, а фамилия Вадима — Белкин".
approve('Антон', 'Антон', 'Мишин').   % 3 + может Антон Мишин
approve('Антон', 'Вадим', 'Белкин').  % 4 - тогда Вадим не Белкин
% Борис сказал: "Фамилия Вадима — Тихонов, а моя фамилия — Мишин".
approve('Борис', 'Вадим', 'Тихонов'). % 5 + может Вадим Тихонов
approve('Борис', 'Борис', 'Мишин').   % 6 - Мишин уже был Антоном (3)
% Вадим сказал: "Моя фамилия — Белкин, а фамилия Гриши — Чехов".
approve('Вадим', 'Вадим', 'Белкин').  % 7 - ещё раз Вадим не Белкин (4)
approve('Вадим', 'Гриша', 'Чехов').   % 8 + может Гриша Чехов
% Гриша сказал: "Да, моя фамилия Чехов, а фамилия Антона — Тихонов".
approve('Гриша', 'Гриша', 'Чехов').   % 9 + точно Гриша Чехов (8)
approve('Гриша', 'Антон', 'Тихонов'). % 10 - Тихонов был раньше Вадимом (5)
 
% Какую фамилию носит каждый из друзей?
about_friends(List) :-
    friends(Friends),
    sirnames(Sirnames),
    give_sirname(Friends, Sirnames, List),
    check_rules(Friends, List).
 
% раздать фамилии
give_sirname([], [], []).
give_sirname(Friends, Sirnames, [[Friend, Sirname] | Rest]) :-
    select1(Friend, Friends, Friends1),
    select1(Sirname, Sirnames, Sirnames1),
    give_sirname(Friends1, Sirnames1, Rest).
 
% проверить правила
check_rules([], _).
check_rules([Friend | Friends], List) :-
    approve(Friend, Name, Sirname),
    member1([Name, Sirname], List),
    approve(Friend, Name1, Sirname1),
    not( member1([Name1, Sirname1], List) ),
    check_rules(Friends, List).
 
% принадлежность
member1(X,[X|_]).
member1(X,[_|T]):-
    member1(X,T).
 
% выбор с удалением
select1(X, [X|Tail], Tail).
select1(Elem, [Head|Tail], [Head|Rest]) :-
    select1(Elem, Tail, Rest).

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.067 из 5
Похожие ответы