Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
УРОК 3. БАЗА ЗНАНИЙ "РУССКАЯ ПАТРИАРХАЛЬНАЯ СЕМЬЯ"
ЧАСТЬ 1. СЛОЖНО-СОСТАВНЫЕ ВОПРОСЫ
Загрузите файл lab_3.pl.
Напишем программу, анализирующую родственные отношения в большой семье.
Допустим, есть семья, состоящая из пяти человек, и родственные связи между ними можно представить следующей схемой:
Начать описание такой семьи можно с описания отношения "родитель".
Имена принято писать с большой буквы, но Пролог воспринимает объекты написанные с большой буквы, как переменные. Решаем эту проблему с помощью заключения имени в апострофы (одинарные кавычки).
родитель(Иван_Петрович, Маша).
родитель(Иван_Петрович, Миша).
родитель(Ольга_Николаевн, Миша).
родитель(Ольга_Николаевна, Маша).
Используя эту начальную группу фактов, попытаемся определить правило для отношения отец. Отец это, во-первых, родитель, а, во-вторых, мужчина. Учитывая все вышесказанное:
отец(_некто,_ребенок):-родитель(_некто,_ребенок), пол(_некто,мужской).
Однако, задав вопрос типа ?-отец(Иван_Петрович, Маша) мы получим ответ false, поскольку вторая подцель в правиле является ложно (предложение с именем "мужчина" вообще отсутствует в программе). Поэтому для полноты картины введем аналогичные факты для всех членов семьи.
пол(Петр_Петрович,мужской).
пол(Иван_Петрович,мужской).
пол(Ольга_Николаевна,женский).
пол(Миша,мужской).
пол(Маша,женский).
Теперь отношение отец стало вполне корректным. Аналогично можно определить отношение мать.
мать(_некто,_ребенок):-родитель(_некто,_ребенок), пол(_некто,женский).
Правила для отношений "дочь" и "сын" очень похожи на два предыдущих правила. Например, правило для отношения "дочь": _x - дочь _y, если _y - родитель _х, и _х принадлежит к женской половине человечества.
дочь(_X,_Y) :- родитель(_Y,_X),пол(_X,женский).
сын(_X,_Y) :- родитель(_Y,_X),пол(_X,мужской).
Если два человека являются родителями кого-то, то логично предположить (берем стандартную семью), что они являются также и супругами.
муж(_он,_она) :- отец(_он,_Реб),мать(_она,_Реб).
жена(_она,_он) :- мать(_она,_Реб),отец(_он,_Реб).
Следующие отношения, которые мы рассмотрим, есть брат и сестра.
брат(_X,_Y):-мать(_Z,_X),мать(_Z,_Y),пол(_X,мужской),_X \= _Y.
сестра(_X,_Y):-мать(_Z,_X),мать(_Z,_Y),пол(_X,женский),_X \= _Y.
Первое правило гласит, что _X является братом _Y, если они оба имеют одних и тех же родителей (мать в частности), и _X обязательно должен быть мужчиной (иначе какой же он брат?). Последнее условие необходимо, чтобы _Х не оказался братом самому себе. Второе правило целиком аналогично первому и никаких новых пояснений здесь не требуется. Это правило не описывает полностью всех братьев данной семьи. Осталось еще ввести два факта:
брат(Петр_Петрович, Иван_Петрович).
брат(Иван_Петрович,Петр_Петрович).
То, что их два, связано с тем, что первый аргумент означает "кто есть брат", а второй - "для кого". Теперь можно поэкспериментировать с вопросами к построенной базе данных. Например, выясним - кто имеет брата, женатого на Ольге Николаевне? Такой вопрос можно задать следующим образом:
?-брат(_X,_Y),муж(_Y, Ольга_Николаевна).
Это - сложный вопрос, состоящий из двух подцелей. Поиск ответа на него соответствует поиску по И-дереву, то есть такая цель будет считаться достигнутой, если будут достигнуты сначала первая, а затем и вторая подцели.
Естественно, _X = Петр Петрович, а _Y = Иван Петрович, то есть у Петра Петровича есть брат, удовлетворяющий условиям запроса. Кстати, обратите внимание на то что, если после вывода первого ответа вы нажмете клавишу «;», то получите два совершенно одинаковых ответа.
Задание 3.1
Выясните, почему именно два одинаковых ответа (нарисуйте дерево вывода).
На данный момент у нас имеется следующая база данных:
родитель(Иван_Петрович, Маша).
родитель(Иван_Петрович, Миша).
родитель(Ольга_Николаевна, Миша).
родитель(Ольга_Николаевна, Маша).
пол(Петр_Петрович,мужской).
пол(Иван_Петрович,мужской).
пол(Ольга_Николаевна,женский).
пол(Маша,женский).
пол(Миша,мужской).
мать(_X,_Y):-родитель(_X,_Y),пол(_X,женский).
отец(_X,_Y):-родитель(_X,_Y),пол(_X,мужской).
дочь(_X,_Y):-родитель(_Y,_X),пол(_X,женский).
сын(_X,_Y):-родитель(_Y,_X),пол(_X,мужской).
муж(_X,_Y):-отец(_X,_Z),мать(_Y,_Z).
жена(_X,_Y):-мать(_X,_Z),отец(_Y,_Z).
брат(_X,_Y):-мать(_Z,_X),мать(_Z,_Y),пол(_X,мужской),_X \= _Y.
сестра(_X,_Y):-мать(_Z,_X),мать(_Z,_Y),пол(_X,женский),_X \= _Y.
брат(Петр_Петрович, Иван_Петрович).
брат(Иван_Петрович, Петр_Петрович).
Продолжим рассмотрение генеалогического дерева и начнем с того, какое положение занимает Петр Петрович по отношению к другим членам семьи. Для Маши с Мишей он является дядей. Отразим этот факт в виде правила:
дядя(_X,_Y) :- родитель(_Z,_Y),брат(_X,_Z).
Для хозяйки он приходится деверем (об этом уже знают значительно меньшее число людей).
деверь(_X,_Y) :- брат(_X,_Z),муж(_Z,_Y).
Иными словами, деверь - это брат мужа. Последнее, что осталось описать, - это кто кем является для Петра Петровича.
племянник(_X,_Y):-родитель(_Z,_X),брат(_Y,_Z),пол(_X,мужской).
племянник(_X,_Y):-родитель(_Z,_X),сестра(_Y,_Z),пол(_X,мужской).
племянница(_X,_Y):-родитель(_Z,_X),брат(_Y,_Z),пол(_X,женский).
племянница(_X,_Y):-родитель(_Z,_X),сестра(_Y,_Z),пол(_X,женский).
Так как мы уже ввели понятие дяди, мы можем его использовать для определения племянника:
племянник(_X,_Y):-дядя(_Y,_X),пол(_X,мужской).
племянница(_X,_Y):-дядя(_Y,_X), пол(_X, женский).
Невестка - жена брата (обратное отношение для деверя).
невестка(_X,_Y):-жена(_X,_Z),брат(_Z,_Y).
Теперь мы полностью описали отношения, которые наблюдаются в этой небольшой семье.
Задание 3.2
В качестве небольшого упражнения, выясните: Верно ли, что если _X является деверем _Y, то _Y является невесткой _X, и если верно, то найти все пары _X и _Y. Задайте соответствующие вопросы.
_______________________________________________________________
Самостоятельное задание:
На этом уроке мы решили задачу описания семейных отношений для небольшой семьи из пяти человек.
родитель(Иван_Петрович, Маша).
родитель(Иван_Петрович, Миша).
родитель(Ольга_Николаевна, Маша).
родитель(Ольга_Николаевна, Миша).
пол(Петр_Петрович,мужской).
пол(Иван_Петрович,мужской).
пол(Ольга_Николаевна,женский).
пол(Миша,мужской).
пол(Маша,женский).
брат(Петр_Петрович, Иван_Петрович).
брат(Иван_Петрович, Петр_Петрович).
мать(_X,_Y):-родитель(_X,_Y),пол(_X,женский).
отец(_X,_Y):-родитель(_X,_Y),пол(_X,мужской).
дочь(_X,_Y):-родитель(_Y,_X),пол(_X,женский).
сын(_X,_Y):-родитель(_Y,_X),пол(_X,мужской).
муж(_X,_Y):-отец(_X,_Z),мать(_Y,_Z).
жена(_X,_Y):-мать(_X,_Z),отец(_Y,_Z).
брат(_X,_Y):-мать(_Z,_X),мать(_Z,_Y),пол(_X,мужской),_X \= _Y.
сестра(_X,_Y):-мать(_Z,_X),мать(_Z,_Y),пол(_X,женский),_X \= _Y.
дядя(_X,_Y):-родитель(_Z,_Y),брат(_X,_Z).
деверь(_X,_Y):-брат(_X,_Z),муж(_Z,_Y).
племянник(_X,_Y):-родитель(_Z,_X),брат(_Y,_Z),пол(_X,мужской).
племянник(_X,_Y):-родитель(_Z,_X),сестра(_Y,_Z),пол(_X,мужской).
племянница(_X,_Y):-родитель( _Z,_X),брат(_Y,_Z),пол(_X,женский).
племянница(_X,_Y):-родитель(_Z,_X),сестра(_Y,_Z),пол(_X,женский).
невестка(_X,_Y):-жена(_X,_Z),брат(_Z,_Y).
Сейчас мы расширим их число.
Рассмотрите следующую схему:
Сохраним текст программы под новым именем. Откроем текст программы во встроенном редакторе.( Для этого в диалоговом окне выберите пункт меню File, в выпавшем меню выберите Navigator. Откроется окно, в котором отображен список файлов, зеленым цветом обозначены открытые файлы. Для просмотра и редактирования файла необходимо выбрать необходимый файл одинарным нажатием мышью и нажать на значок карандаша, изображенный вверху окна (крайний правый).) Далее в окне редактора выбираете пункт меню File, в выпавшем списке выбираете пункт Save as. Будет открыто окно, в котором при желании вы сможете изменить путь к файлу, это нам сейчас не нужно, просто в конце строки вводим желаемое имя, например, lab_2last.pl и нажимаете кнопку Ok.
Задание 3.3
Добавьте к написанной программе множество фактов, необходимых для описания отношений в этой семье. Найдите по полученной программе всех мужчин, которые являются отцами.
Задание 3.4
Объедините две семьи следующим образом: Пусть Миша женится на Люсе и у них родится сын - Андрейка.
Задание 3.5
После этого в связи с появлением большого количества новых кровных и некровных родственников напишите правила, определяющие следующие отношения:
а) внук,дед,бабушка;
б) тетя,племянник,племянница (используя определение тети);
в) шурин - брат жены;
г) зять - муж сестры или дочери;
д) свекор - отец мужа;
е) свекровь - мать мужа;
ж) тесть - отец жены;
з) теща - мать жены;
и) сноха - жена сына для отца;
к) невестка - жена сына для матери;
л) золовка - сестра мужа;
м) свояченица - сестра жены;
н) сват - отец одного из супругов для родителей другого;
о) сватья - мать одного из супругов для родителей другого;
Задайте вопросы для каждого нового отношения.