Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Отчёт ЛР №5

.docx
Скачиваний:
33
Добавлен:
31.03.2021
Размер:
490.76 Кб
Скачать

УФИМСКИЙ ГОСУДАРСТВЕННЫЙ АВИАЦИОННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

ФАКУЛЬТЕТ ИНФОРМАТИКИ И РОБОТОТЕХНИКИ

КАФЕДРА ВЫЧИСЛИТЕЛЬНОЙ МАТЕМАТИКИ И КИБЕРНЕТИКИ

УТВЕРЖДАЮ

Проректор университета по научной работе

ФИО

"___" ______________ _______г.

ОТЧЕТ О ПРОВЕДЕНИИ ЛАБОРОТОРНОЙ РАБОТЫ № 5

ВАРИАНТ № 15

по предмету: ФУНКЦИОНАЛЬНО И ЛОГИЧЕСКОЕ ПРОГРАММИРОВАНИЕ

Преподаватель

Котельников В.А.

Исполнитель

Шакиров А.Р.

Уфа 2020

ВВЕДЕНИЕ

Цель работы – научится работать с простыми механизмами и списками на логическом языке программирования Prolog.

ХОД РАБОТЫ

  1. Напишем программы для вычисления факториала и объявим предикаты для вычисления максимального, минимального, среднего числа в списке действительных чисел.

Пример работы:

Рис. 1. - Работа с арифметическими операциями

  1. Определим родственные отношения.

Для начала нарисуем схему родственных отношений (рис. 2). Стрелка показывать отношение «быть родителем». Также на схеме помечаем пол персонажей (F – женский, M – мужской).

Рис. 2. - Схема родственных отношений

Теперь опишем с помощью фактов всех мужчин и женщин и все связи от родителя к ребёнку согласно схеме (рис.3).

Рис. 3 – Факты.

После фактов записываем правила для определения других требуемых родственных отношений, таких как отец, мать, сын, дочь, брат, сестра, дедушка, бабушка, дядя, тетя (рис. 4).

Рис. 4 - Правила.

Программа готова, согласуем цель, протестируем на примере и покажем на рисунке 5. Согласно схеме «Name8» является племянником «Name10».

Рис. 5 – Проверка работы на примере отношения «быть племянником».

  1. Далее определим отношение взрослый и ребенок.

Опишем людей из прошлого примера с изменением предикатов. Теперь будем присваивать возраст и по нему определять отношения child и adult.

Запросим цель, чтобы вывел всех детей и этой семьи. Для этого согласуем цель child(Child) (рис. 6).

Рис. 6 – Отношения взрослый и ребенок.

  1. Переходим к общим заданиям.

Общее задание №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).

  1. Индивидуальное задание.

Вариант №15:

l - список, элементами которого являются списки, состоящие из чисел. Определить номер элемента списка l, содержащего наименьшее число.

Например, в случае

l = [[1, 3], [0], [6, 1]], ответ: n = 2.

Не рассматривать случай, когда такой элемент не единственный.

Для решения задачи реализованы вспомогательные предикат для нахождения минимального значения в списке и его номера, предикат для составления из списка списков чисел список минимальных значений (рис. 17).

Рис. 17 – Индивидуальное задание.

  1. Далее реализуем задачу описания родственных отношений с использованием динамических баз данных.

Нужно предусмотреть возможность добавления, удаления и изменения данных, а также последующего сохранения внесенных изменений.

Сначала создадим структуру базы данных, которая будет хранить в себе персон и их отношения родитель-ребёнок (рис. 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.

Соседние файлы в предмете Функциональное и логическое программирование