Vulpo One

Prolog: Я свой собственный дедушка

Задача:

Два мужика встретились в баре и разговорились. Через некоторое время один из них сказал: “Ты думаешь только у тебя семейные проблемы? Послушай про мою ситуацию: Несколько лет назад я встретил молодую вдову со взрослой дочерью, и мы поженились. Недавно мой отец женился на моей падчерице. Это сделало мою падчерицу моей мачехой, мой отец стал моим пасынком. Кроме того, моя жена стала тещей собственного свекра. Идем дальше, у дочери моей жены (моей мачехи) родился сын. Этот мальчик мой единокровный брат, потому что он сын моего отца, но он также сын дочери моей жены, что делает его внуком моей жены. Это делает меня дедушкой моего единокровного брата. Это было бы еще терпимо, пока у нас с женой не родился сын. Теперь сестра моего сына, моя теща, стала еще и бабушкой. Это делает моего отца шурином моего ребенка, сводная сестра которого — жена моего отца. Я шурин моей мачехи, моя жена — тетя ее обственного ребенка, мой сын — племянник моего отца, а я свой собственный дедушка, а ты тут жалуешься на семейные проблемы!”

Поскольку вводить кучу семейных отношений ломает, докажем лишь дедушку.

## Семейные хитросплетения:
## 1 буква имени, чтоб не запутаться:
#
# J  наше поколение
# I  поколение родителей
# K  поколение детей

male(john). # Несколько лет назад я
female(jane). # встретил молодую вдову
female(kate). # со взрослой дочерью
parent(jane, kate).
family(john, jane). # и мы поженились.
male(ian). # Недавно мой отец
parent(ian, john).
family(ian, kate). # женился на моей падчерице.

parent(ian, jake). # Идем дальше, у дочери моей жены (моей мачехи) родился сын. // ну не сам же собой родился ^^
# на самом деле он тут для совместимости с текстом. в выводе по нашей задаче он роли не играет

parent(john, keegan). # Это было бы еще терпимо, пока у нас с женой не родился сын.
# пол детей роли не играет, поэтому не мусорим в памяти

#
## все в сборе, начианем веселье
#

# супруг(а) родителя тоже родитель!!!
parent(X, Y) :- family(X, Z), parent(Z, Y). # осторожно, если поменять местами, будет бесконечная рекурсия // сам напоролся
parent(X, Y) :- family(Z, X), parent(Z, Y). # на самом деле в задаче не требуется

# отец  это родитель мужского пола.
father(X, Y) :- parent(X, Y), male(X).

# дед  это отец родителя
grandfather(X, Y) :- father(X, Z), parent(Z, Y).

#
## всего три правила, а какая семейная трагедия!

Где Джон — это и есть наш мужик. Для проверки вводим или grandfather(john, john) — выдаст True, или grandfather(X,X) — выдаст X=john.

При решении задачи использовался компилятор SWI-Prolog 5.6.59

Вот такой вот prololg.