Задача «Родственные отношения»

1.1. В базе данных Пролога есть следующие факты:


родитель(Иван, Георгий).

родитель(Иван, Софья).

родитель(Иван, Галина).

родитель(Дарья, Георгий).

родитель(Дарья, Софья).

родитель(Дарья, Галина).

родитель(Геннадий, Николай).

родитель(Геннадий, Сергей).

родитель(Галина, Николай).

родитель(Галина, Сергей).

родитель(Ирина, Елена).

родитель(Николай, Елена).

родитель(Татьяна, Александр).

родитель(Сергей, Александр).


Постройте дерево родственных отношений. Для своего варианта определите соответствующие родственные отношения (C1/2, C2/2, C3/2) и составить запрос в виде:?- C1(X,Y), C2(Y,Z), C3(Z,V). (Значение переменной X или Y должно быть задано.). Продемонстрировать получение ответа на данный запрос.

В0. Найти племянницу сына зятя Дарьи.

В1. Найти правнука мужа матери Георгия.

В2. Найти жену племянника дочери Дарьи.

В3. Найти правнучку тестя отца Сергея.

В4. Найти прадедушку двоюродного брата дочери Николая.

В5. Найти отца правнучки тестя Геннадия.

Решение для варианта B0 «Найти племянницу сына зятя Дарьи».

1 шаг. Введем предложение parents (Y, X) – X родитель Y и создадим базу данных, описывающее дерево родственных отношений рисунка ___.


parents (ivan, galina).

parents (ivan, sofiya).

parents (ivan, georgi).

parents (darya, galina).

parents (darya, sofiya).

parents (darya, georgi).

parents (genadi, sergei)

parents (genadi, nikola)

parents (galina, sergei)

parents (galina, nikola)

parents (sergei, alexsandr)

parents (tatyana, alexsandr)

parents (nikola, elena)

parents (irina, elena)


2 шаг. Определяем отношение "зять". Зять – это муж дочери. В нашем случае – зять Дарьи это Геннадий. Чтобы определить это отношение нам понадобиться следующие вспомогательные отношения: дочь, супруг и отношение принадлежности человека к определенному полу.

Определяем отношение дочь (Х, У) – X является дочерью Y, если Y родитель X и X женского пола. На Прологе это отношение запишется ввиде:

daughter(X, Y):

parents (Y, X),

woman(X).

husband(X, Y) – X является мужем Y, если существует такой Z, который является общим ребенком для X и Y.

husband(X, Y):

parents (X, Z),

parents (Y, Z).

soninlow(X, Y) – X является зятем Y, если у Y имеется дочь Z у которой муж X.

soninlow(X, Y):

daughter(Z, Y),

husband(X, Z).

2 шаг. Определяем отношение "Сын":

son(X, Y) – X является сыном Y, если Y родитель X и X мужского пола.

son(X, Y):

parents (Y, X),

man(X).

Тогда сына зятя Дарьи можно определить с помощью сложного запроса:

soninlow(X, 'Дарья'), son(Z, X).

3 шаг. Определяем отношение "Племянница".

niece(X, Y) – X является племянницей Y, если X это ребенок брата или сестры Y и X женского пола.

brothe&sister(X, Y) – X является братом или сестрой Y, если у них общие родители:

brothe&sister(X, Y):-

parents (Z, X),

parents (Z, Y).

niece(X, Y):

% находим брата или сестру Y

brothe&sister(Z, Y),

% находим детей Z женского пола

parents (Z, X),

woman(X).

 

 


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: