Двоюродные братья и сестры - Prolog
Формулировка задачи:
Есть такая задача:
Три брата, Пьер, Поль и Жак, во время отпуска собрали всех своих детей в загородном доме. Вот что каждый из детей сказал:
Изабелла. Мне на 3 года больше, чем Жану.
Тереза. Моего отца зовут Жаком.
Ив. Мне на 2 года больше, чем Изабелле.
Мари. Я больше люблю играть с одним из своих кузенов, чем со своим братом.
Катрин. Моего отца зовут Пьером.
Анна. Лучше всего мы ладим с сыновьями дяди Жака.
Жан. Мой отец и каждый из его братьев имеют меньше, чем по четыре ребенка.
Франсуа. А у моего отца их меньше всего.
Каким образом из этого разговора можно определить имя отца каждого из двоюродных братьев и сестер?
Осилил написать только вот это.
Не понимаю, как использовать условия о том, что кто-то кого-то старше, у кого меньше всего детей и кто с кем лучше всего ладит. Как организовать поиск решения? Понимаю, что задача на поиск родственных связей в основном, но эти условия вводят в ступор.
Листинг программы
- DOMAINS
- имя = symbol
- PREDICATES
- nondeterm ребенок(имя)
- nondeterm мужчина(имя)
- nondeterm родитель(имя, имя)
- CLAUSES
- ребенок("Изабелла").
- ребенок("Тереза").
- ребенок("Ив").
- ребенок("Мари").
- ребенок("Катрин").
- ребенок("Анна").
- ребенок("Жан").
- ребенок("Франсуа").
- мужчина("Жак").
- мужчина("Пьер").
- мужчина("Поль").
- родитель("Жак","Тереза").
- родитель("Пьер", "Катрин").
Решение задачи: «Двоюродные братья и сестры»
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.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д