Отчёт ЛР №5
.docxУФИМСКИЙ ГОСУДАРСТВЕННЫЙ АВИАЦИОННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
ФАКУЛЬТЕТ ИНФОРМАТИКИ И РОБОТОТЕХНИКИ
КАФЕДРА ВЫЧИСЛИТЕЛЬНОЙ МАТЕМАТИКИ И КИБЕРНЕТИКИ
|
|
|
||
|
УТВЕРЖДАЮ Проректор университета по научной работе ФИО |
|||
|
|
|
||
|
"___" ______________ _______г. |
|||
|
|
|
||
ОТЧЕТ О ПРОВЕДЕНИИ ЛАБОРОТОРНОЙ РАБОТЫ № 5 ВАРИАНТ № 15 |
||||
|
||||
по предмету: ФУНКЦИОНАЛЬНО И ЛОГИЧЕСКОЕ ПРОГРАММИРОВАНИЕ |
||||
Преподаватель |
|
Котельников В.А. |
||
|
|
|
||
|
|
|
||
|
|
|
||
Исполнитель |
|
Шакиров А.Р. |
||
|
|
|
||
Уфа 2020 |
ВВЕДЕНИЕ
Цель работы – научится работать с простыми механизмами и списками на логическом языке программирования Prolog.
ХОД РАБОТЫ
Напишем программы для вычисления факториала и объявим предикаты для вычисления максимального, минимального, среднего числа в списке действительных чисел.
Пример работы:
Рис. 1. - Работа с арифметическими операциями
Определим родственные отношения.
Для начала нарисуем схему родственных отношений (рис. 2). Стрелка показывать отношение «быть родителем». Также на схеме помечаем пол персонажей (F – женский, M – мужской).
Рис. 2. - Схема родственных отношений
Теперь опишем с помощью фактов всех мужчин и женщин и все связи от родителя к ребёнку согласно схеме (рис.3).
Рис. 3 – Факты.
После фактов записываем правила для определения других требуемых родственных отношений, таких как отец, мать, сын, дочь, брат, сестра, дедушка, бабушка, дядя, тетя (рис. 4).
Рис. 4 - Правила.
Программа готова, согласуем цель, протестируем на примере и покажем на рисунке 5. Согласно схеме «Name8» является племянником «Name10».
Рис. 5 – Проверка работы на примере отношения «быть племянником».
Далее определим отношение взрослый и ребенок.
Опишем людей из прошлого примера с изменением предикатов. Теперь будем присваивать возраст и по нему определять отношения child и adult.
Запросим цель, чтобы вывел всех детей и этой семьи. Для этого согласуем цель child(Child) (рис. 6).
Рис. 6 – Отношения взрослый и ребенок.
Переходим к общим заданиям.
Общее задание №1.
Рис. 7 – Согласование внешней цели p(a, Y, Z).
Рис. 8 – Согласование только первого определения предиката p(X, Y, Z).
Рис. 9 – Добавление факта p1(a, 11) и согласование цели p(a, Y, Z).
Рис. 10 – Согласование первого определения p(a, Y, Z) с добавленным фактом p1(a, 11).
Общее задание №2.
Рис. 11 – Согласование внешней цели r(X).
Рис. 12 – Согласование внешней цели r1(X).
Рис. 13 – Согласование внешней цели r2(X).
Рис. 14 – Согласование только первого определения r(X).
Общее задание №3.
Рис. 13 – Согласование цели «Получить конкатенацию списков»
Рис. 14 – Согласование цели «Получить слагаемое конкатенации списков»
Рис. 15 – Согласование цели «Является ли L3 результатом конкатенации L1 и L2».
Общее задание №4.
Рис. 16 – Согласование только первых целей каждого из предикатов pi(X).
Индивидуальное задание.
Вариант №15:
l - список, элементами которого являются списки, состоящие из чисел. Определить номер элемента списка l, содержащего наименьшее число.
Например, в случае
l = [[1, 3], [0], [6, 1]], ответ: n = 2.
Не рассматривать случай, когда такой элемент не единственный.
Для решения задачи реализованы вспомогательные предикат для нахождения минимального значения в списке и его номера, предикат для составления из списка списков чисел список минимальных значений (рис. 17).
Рис. 17 – Индивидуальное задание.
Далее реализуем задачу описания родственных отношений с использованием динамических баз данных.
Нужно предусмотреть возможность добавления, удаления и изменения данных, а также последующего сохранения внесенных изменений.
Сначала создадим структуру базы данных, которая будет хранить в себе персон и их отношения родитель-ребёнок (рис. 18).
Рис. 18. Структура будущей базы данных.
Затем добавим данные (рис. 19).
Рис. 19 - Данные.
Далее запускаем программу и создаем БД (рис. 20).
Рис. 20 – Результат создания базы.
Далее создадим новую программу для работы с нашей базой данных. Определим остальные родственные отношения.
Рис. 21 – Определения остальных отношений.
Объявим предикаты для добавления, удаления и сохранения изменений (рис. 22-23).
Рис. 22 – Определения предикатов добавления данных.
Рис. 23 – Определения предикатов удаления информации и сохранение.
ЗАКЛЮЧЕНИЕ
В ходе лабораторной работы были получены новые знания по работе на логическом языке программирования Prolog. Усвоены приемы работы с Visual Prolog 5.2.
ПРИЛОЖЕНИЕ А. Листинг кода в файле «laba5.txt»
- Арифметические операции:
domains
list = real*
predicates
nondeterm fact(real, real)
nondeterm maxList(list, real)
nondeterm minList(list, real)
nondeterm sumList(list, real)
nondeterm len(list, real)
nondeterm midList(list, real)
clauses
fact(0, 1).
fact(N, Result):- N1 = N - 1, fact(N1, X1), Result = N * X1.
maxList([X], X).
maxList([H|Tail], H):- maxList(Tail, Max), H > Max, !.
maxList([_|Tail], Max):- maxList(Tail, Max).
minList([X], X).
minList([H|Tail], H):- minList(Tail, Min), H < Min, !.
minList([_|Tail], Min):- minList(Tail, Min).
sumList([], 0).
sumList([H|T], Result) :- sumList(T, Temp), Result = Temp + H.
len([], 0).
len([_|T], Result) :- len(T, Temp), Result = Temp + 1.
midList([], 0).
midList(L, Result) :- sumList(L, S), len(L, C), Result = S / C.
goal
List = [1,2,3,-4,-5,6,7,8,-9,10,100],
fact(5, Fact5),
maxList(List, Max),
minList(List, Min),
midList(List, Mid).
- Родственные отношения:
domains
human = symbol
age = integer
predicates
nondeterm male(human, age)
nondeterm female(human, age)
nondeterm parent(human, human)
nondeterm father(human, human)
nondeterm mother(human, human)
nondeterm son(human, human)
nondeterm daughter(human, human)
nondeterm brother(human, human)
nondeterm sister(human, human)
nondeterm grandpa(human, human)
nondeterm grandma(human, human)
nondeterm uncle(human, human)
nondeterm aunt(human, human)
nondeterm nephew(human, human)
nondeterm niece(human, human)
nondeterm adult(human)
nondeterm child(human)
clauses
male("Name1", 32).
male("Name2", 50).
male("Name3", 7).
male("Name4", 5).
male("Name5", 45).
male("Name8", 17).
female("Name6", 70).
female("Name7", 65).
female("Name9", 29).
female("Name10", 44).
female("Name11", 65).
parent("Name1", "Name3").
parent("Name1", "Name4").
parent("Name9", "Name3").
parent("Name9", "Name4").
parent("Name2", "Name1").
parent("Name6", "Name2").
parent("Name6", "Name5").
parent("Name5", "Name8").
parent("Name7", "Name8").
parent("Name11", "Name7").
parent("Name11", "Name10").
father(X, Y) :- parent(X, Y), male(X, _).
mother(X, Y) :- parent(X, Y), female(X, _).
son(X, Y) :- parent(Y, X), male(X, _).
daughter(X, Y) :- parent(Y, X), female(X, _).
brother(X, Y) :- parent(Z, X), parent(Z, Y), not(X=Y), male(X, _).
sister(X, Y) :- parent(Z, X), parent(Z, Y), not(X=Y), female(X, _).
grandpa(X, Y) :- parent(X, Z), parent(Z, Y), male(X, _).
grandma(X, Y) :- parent(X, Z), parent(Z, Y), female(X, _).
uncle(X, Y) :- brother(X, Z), parent(Z, Y).
aunt(X, Y) :- sister(X, Z), parent(Z, Y).
nephew(X, Y) :- uncle(Y, X) or aunt(Y, X), male(X, _).
niece(X, Y) :- uncle(Y, X) or aunt(Y, X), female(X, _).
adult(X) :- male(X, Age), Age >= 18;
female(X, Age), Age >= 18.
child(X) :- male(X, Age), Age < 18;
female(X, Age), Age < 18.
goal
nephew(Nepew, "Name10"),
write("Who is Name10's nephew? ", Nepew), nl.
%write("All children:"), nl,
%child(Child).
- Индивидуальное задание.
Вариант №15:
l - список, элементами которого являются списки, состоящие из чисел. Определить номер элемента списка l, содержащего наименьшее число.
Например, в случае
l = [[1, 3], [0], [6, 1]], ответ: n = 2.
Не рассматривать случай, когда такой элемент не единственный
domains
l = integer*
ls = l*
predicates
nondeterm min(l, integer, integer)
nondeterm minElements(ls, l)
nondeterm minNumber(ls, integer)
clauses
minNumber([_], 1).
minNumber(L, N) :-
minElements(L, MinElements),
min(MinElements, _, N).
minElements([], []).
minElements([H|T], [MH|MT]) :-
min(H, MH, _),
minElements(T, MT).
min([X], X, 1).
min([H|T], M, N) :- min(T, M, N), H < M, !.
min([_|T], M, N) :- min(T, M, N1), N = N1+1.
goal
List = [[1,3],[0],[6,1]],
minNumber(List, N).
ПРИЛОЖЕНИЕ Б. Листинг кода в файле «laba6.txt»
- Создание БД.
domains
name = symbol
sex = symbol % male | female
age = integer
database
person(name, sex, age)
parent(name, name)
clauses
person("Name1", male, 32).
person("Name2", male, 50).
person("Name3", male, 7).
person("Name4", male, 5).
person("Name5", male, 45).
person("Name8", male, 17).
person("Name6", female, 70).
person("Name7", female, 65).
person("Name9", female, 29).
person("Name10", female, 44).
person("Name11", female, 65).
parent("Name1", "Name3").
parent("Name1", "Name4").
parent("Name9", "Name3").
parent("Name9", "Name4").
parent("Name2", "Name1").
parent("Name6", "Name2").
parent("Name6", "Name5").
parent("Name5", "Name8").
parent("Name7", "Name8").
parent("Name11", "Name7").
parent("Name11", "Name10").
goal
save("person.db").
- Работа с БД.
domains
name = symbol
gender = symbol % male | female
age = integer
database
person(name, gender, age)
parent(name, name)
predicates
nondeterm dad(name, name)
nondeterm mom(name, name)
nondeterm son(name, name)
nondeterm daughter(name, name)
nondeterm brother(name, name)
nondeterm sister(name, name)
nondeterm grandpa(name, name)
nondeterm grandma(name, name)
nondeterm menu
nondeterm end
nondeterm action(char)
constants
file = "person.db"
clauses
dad(X, Y) :- consult(file), parent(X, Y), person(X, male, _).
mom(X, Y) :- consult(file), parent(X, Y), person(X, female, _).
son(X, Y) :- consult(file), parent(Y, X), person(X, male, _).
daughter(X, Y) :- consult(file), parent(Y, X), person(X, female, _).
brother(X, Y) :- consult(file),
parent(Z, X), parent(Z, Y), not(X=Y), person(X, male, _).
sister(X, Y) :- consult(file),
parent(Z, X), parent(Z, Y), not(X=Y), person(X, female, _).
grandpa(X, Y) :- consult(file), parent(X, Z), parent(Z, Y), person(X, male, _).
grandma(X, Y) :- consult(file), parent(X, Z), parent(Z, Y), person(X, female, _).
menu :-
write("1 - Add person"), nl,
write("2 - Add parent relation"), nl,
write("3 - Delete person"), nl,
write("4 - Delete parent relation"), nl,
write("0 - Save information & Exit"), nl,
readchar(Char),
retractall(_),
consult(file),
action(Char).
end :-
save(file),
write("Change saved. Press any key to continue"), nl,
readchar(_),
menu.
action('1') :-
write("*Add person's information*"), nl,
write("Enter name:"), nl,
readln(N),
write("Enter gender:"), nl,
readln(G),
write("Enter age:"), nl,
readint(A),
assert(person(N, G, A)),
end.
action('2') :-
write("*Add parent's information*"), nl,
write("Enter parent's name:"), nl,
readln(N1),
write("Enter child's name:"), nl,
readln(N2),
assert(parent(N1, N2)),
end.
action('3') :-
write("*Delete persons's information*"), nl,
write("Enter name:"), nl,
readln(N),
retract(person(N, _, _)),
end.
action('4') :-
write("*Delete parent's information*"), nl,
write("Enter parent's name:"), nl,
readln(N1),
write("Enter child's name:"), nl,
readln(N2),
retract(parent(N1, N2)),
end.
action('0') :- save(file).
goal
menu.