Автор: Пользователь скрыл имя, 06 Марта 2013 в 22:25, лабораторная работа
Цель работы: Изучение фундаментальных идей программирования языка Пролог.
Задание: Составить генеалогическое древо и базу знаний Prolog, которая описывает реальные отношения в вашей семье и позволяет осуществить эти отношения посредством использования правил. Составленное генеалогическое древо должно содержать минимум 3 уровня. Для реализации отношений в семье использовать не менее 6 правил.
Министерство Образования Республики Молдова
Технический Университет Молдовы
Факультет Вычислительной Техники, Информатики и Микроэлектроники
Кафедра Автоматики и Информационных Технологий
Лабораторная работа №1
по дисциплине: «PLIA»
Тема: «Основные элементы языка программирования Prolog»
Выполнил:
студент группы TI – 093 Смагин Антон
Проверила:
старший преподаватель Лазу Виктория
Кишинев 2012
Изучение фундаментальных идей программирования языка Пролог.
Составить генеалогическое древо и базу знаний Prolog, которая описывает реальные отношения в вашей семье и позволяет осуществить эти отношения посредством использования правил. Составленное генеалогическое древо должно содержать минимум 3 уровня. Для реализации отношений в семье использовать не менее 6 правил.
Генеалогическое древо, на основании которого составлялась база знаний и правило приведено на рисунке 1.
Рисунок 1 – Генеалогическое древо
Для определения родственных связей были написаны факты вида parent(X, Y), которые определяют, что Y ребенок X. Также были написаны факты вида male(X) и female(X), которые помогают определить, является X мужчиной или женщиной.
На основании данных фактов были построены правила, помогающие определить родство членов семьи.
Вначале было написано правило roditeli(X,Y,Z) которое содержит 3 переменные, где указано, что X и Y являются родителями Z. Оно является истинным, если есть такие факты, что X является родителем для Z, Y является родителем для Z, и X и Y – пара.
Правили mama(X,Y), papa(X,Y) основываются на фактах parent(X,Y), male(X), female(X).
Отношение roditeli(X,Y,Z) используется для правил sister(X,Y), brother(X,Y): для каждого X,Y X является братом(сестрой) для Y, если у них общие родители, и X является мужчиной(женщиной). Также необходимо добавить условие, X<>Y, так как один и тот же человек не может быть братом(сестрой) себе самому.
Для нахождения дяди и тёти
я использовал отношения
В представлении отношений внук и внучка я воспользовался дополнительной переменной для указания родителя для первой переменной.
Отношение двоюродного брата на оформил в двух вариантах, так как родителем моего брата может быть как моя тётя, так и дядя.
Двоюродная сестра является
обратным отношением к двоюродному
брату, и поэтому я определил
это отношение как: dvoiursestra(X,Y):-dvoiurbrat(
Конъюнкция в правилах означает, что все подцели должны быть истинными, чтобы цель(goal) была достигнута. Если в цели значится дизъюнкция, то для достижения главной цели необходимо выполнение любой из подцелей.
Конъюнкция определяется запятой, а дизъюнкция точкой с запятой.
В качестве предложений по улучшению кода можно указывать родителем не 1 человека, а сразу двух, в связи, с чем может быть уменьшено число правил.
Результат поиска всех матерей и прадедушек в моем генеалогическом древе показан на рисунке 1.
Рисунок 1 – Результат поиска матерей и прадедушек
Результат поиска кузенов и братьев для «irina» показан на рисунке 2.
Рисунок 2 – Результат поиска кузенов и братьев
В ходе данной лабораторной работы были изучены основные элементы языка программирования Prolog. Из проделанной работы можно сделать вывод, что данный язык легок в изучении, обладает большими возможностями и может быть применен для решения разного рода задач(нечисловые решения). Для разработки и запуска программ я использовал среду TurboProlog, представляющую удобное средство программирования.
child(serghey, elena).
child(serghey, iurii).
child(irina, elena).
child(irina, iurii).
child(oleg, evgenii).
child(oleg, natalia).
child(elena, galina).
child(elena, ilia).
child(natalia, galina).
child(natalia, ilia).
child(iurii, liudmila).
child(iurii, anatolii).
child(liudmila, vera).
child(liudmila, alexandr).
child(anatolii, stepan).
child(anatolii, tatiana).
man(alexandr).
man(stepan).
man(ilia).
man(anatolii).
man(evgenii).
man(iurii).
man(serghey).
man(oleg).
woman(irina).
woman(natalia).
woman(elena).
woman(liudmila).
woman(galina).
woman(vera).
woman(tatiana).
parent(X, Y) :- child(Y, X).
parents(X, Y, Z) :- parent(X, Z), parent(Y, Z), man(X), woman(Y).
brothersister(X, Y) :- parents(Z, W, X), parents(Z, W, Y), X \= Y, X@>Y.
brother(X, Y) :- brothersister(X, Y), man(X).
sister(X, Y) :- brothersister(X, Y), woman(X).
mother(X, Y) :- parent(X, Y), woman(X).
father(X, Y) :- parent(X, Y), man(X).
son(X, Y) :- child(X, Y), man(X).
doughter(X, Y) :- child(X, Y), woman(X).
grandparent(X, Y) :- child(Y, Z), child(Z, X).
grandmother(X, Y) :- grandparent(X, Y), woman(X).
grandfather(X, Y) :- grandparent(X, Y), man(X).
grandgrandparent(X, Y) :- grandparent(X, Z), parent(Z, Y).
grandgrandfather(X, Y) :- grandgrandparent(X, Y), man(X).
grandgrandmother(X, Y) :- grandgrandparent(X, Y), woman(X).
aunt(X, Y) :- parents(Z, W, Y), (sister(X, Z) ; sister(X, W)).
uncle(X, Y) :- parents(Z, W, Y), (brother(X, Z) ; brother(X, W)).
cousin(X, Y) :- parents(Zy, Wy, Y), parents(Zx, Wx, X), grandparent(G, Y), grandparent(G, X), Zy \= Zx, Wy \= Wx, X@>Y.
Информация о работе Основные элементы языка программирования Prolog