Задача:

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

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

# j = our generation; i = john's father; k = jane's daughter

male(john). # our protagonist
male(ian).
female(jane).
female(kate).

family(john, jane).
family(ian, kate).

parent(ian,  john).
parent(jane, kate).
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).

# and these couples have children
parent(john, keegan).
parent(ian, jake).

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

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

Под катом подробно закомментированный вариант.

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

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

Leave a Reply

Your email address will not be published. Required fields are marked *