Двоюродные братья и сестры - Prolog

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

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

Есть такая задача: Три брата, Пьер, Поль и Жак, во время отпуска собрали всех своих детей в загородном доме. Вот что каждый из детей сказал: Изабелла. Мне на 3 года больше, чем Жану. Тереза. Моего отца зовут Жаком. Ив. Мне на 2 года больше, чем Изабелле. Мари. Я больше люблю играть с одним из своих кузенов, чем со своим братом. Катрин. Моего отца зовут Пьером. Анна. Лучше всего мы ладим с сыновьями дяди Жака. Жан. Мой отец и каждый из его братьев имеют меньше, чем по четыре ребенка. Франсуа. А у моего отца их меньше всего. Каким образом из этого разговора можно определить имя отца каждого из двоюродных братьев и сестер? Осилил написать только вот это. Не понимаю, как использовать условия о том, что кто-то кого-то старше, у кого меньше всего детей и кто с кем лучше всего ладит. Как организовать поиск решения? Понимаю, что задача на поиск родственных связей в основном, но эти условия вводят в ступор.

Решение задачи: «Двоюродные братья и сестры»

textual
Листинг программы
solve_names(Solve) :-
    % Три брата, Пьер, Поль и Жак, во время отпуска собрали всех своих детей в загородном доме.
    Mans = ["Пьер", "Поль", "Жак"],
    Childs =
      [ ["Изабелла", "жен"], ["Жан", "муж"], ["Тереза", "жен"],
        ["Ив", "муж"], ["Мари", "жен"], ["Катрин", "жен"],
        ["Анна", "жен"], ["Франсуа", "муж"]
      ],
    % Жан. Мой отец и каждый из его братьев имеют меньше, чем по четыре ребенка.
    Solve =
      [ [Man1, [Child11, Child12, Child13]],
        [Man2, [Child21, Child22, Child23]],
        [Man3, [Child31, Child32]]
      ],
    permutation(Mans, [Man1, Man2, Man3]),
    permutation(Childs, [Child11, Child12, Child13, Child21, Child22, Child23, Child31, Child32]),
    % Изабелла. Мне на 3 года больше, чем Жану.
    member([_, FamilyIsabel], Solve),
    member(["Изабелла", _], FamilyIsabel), not( member(["Жан", _], FamilyIsabel) ),
    % Тереза. Моего отца зовут Жаком.
    member(["Жак", FamilyZhack], Solve), member(["Тереза", _], FamilyZhack),
    % Ив. Мне на 2 года больше, чем Изабелле.
    member([_, FamilyIv], Solve),
    member(["Ив", _], FamilyIv), not( member(["Изабелла", _], FamilyIv) ),
    % Мари. Я больше люблю играть с одним из своих кузенов, чем со своим братом.
    member([_, FamilyMary], Solve),
    member(["Мари", _], FamilyMary), member([_, "муж"], FamilyMary),
    % Катрин. Моего отца зовут Пьером.
    member(["Пьер", FamilyPier], Solve), member(["Катрин", _], FamilyPier),
    % Анна. Лучше всего мы ладим с сыновьями дяди Жака.
    not( member(["Анна", _], FamilyZhack) ),
    member([SonZhack1, "муж"], FamilyZhack), member([SonZhack2, "муж"], FamilyZhack),
    not( SonZhack1 = SonZhack2 ),
    % Франсуа. А у моего отца их меньше всего.
    member(["Франсуа", _], [Child31, Child32]),
    true.

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


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

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

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