Ім'я файлу: FLP7.docx
Розширення: docx
Розмір: 60кб.
Дата: 26.09.2022
скачати
Пов'язані файли:
Розробка лексичного аналiзатора (сканеру, scanner).doc
Дослідження_особистість у сусплісьстві.doc
KR2.docx
Конспект_ОНД_2018.docx
Salabai_magistr.pdf

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ

НАЦІОНАЛЬНИЙ АВІАЦІЙНИЙ УНІВЕРСИТЕТ

Навчально-науковий інститут

комп’ютерних інформаційних технологій

Кафедра комп’ютеризованих систем управління

Лабораторна робота № 2.2


з дисципліни «Функціональне та логічне програмування»

на тему «Керування процесом виконання

програми в мові Пролог»

Виконала: студентка групи СП-324

Фурсаєва А.С.

Прийняв:

Глазок О. М.

Київ 2016

Завдання 1. Методи організації циклічних процесів в мові Пролог.

Розберіться в роботі програм gCycle0.pro, hCycle1.pro, iCycle2.pro.  Після ознайомлення з роботою цих програм доробіть одну з них (на Ваш вибір) так, щоб виконувався не лише цикл for(1,5,1), а і цикл з від’ємним кроком (наприклад: for (5,1,-1), for (-1,-5,-1), тощо). Переконайтеся, що дороблена Вами програма працює коректно – наприклад, запит for (-1,-5, 1) не має виконуватися взагалі (в противному випадку його виконання привело б до зациклювання), і т.д.

predicates

for(integer, integer, integer)

repeat(integer, integer, integer)

cyclebody(integer)

clauses

for(Cur, Max, Step):- repeat(Cur, Max, Step).

repeat(Cur, Max, Step):- Step = 0;

Step > 0, Cur > Max;

Step < 0, Cur < Max.

repeat(Cur, Max, Step):- cyclebody(Cur),

Cur1 = Cur + Step, repeat(Cur1, Max, Step).

cyclebody(Cur):- write(Cur, ' ').



Розробіть програму «хрестики-нулики». Необхідно скласти програму, яка за за двома циклами – по Х і по Y – обійде всі поля і, використовуючи наведені факти про krestik, роздрукує (за допомогою літер Х і О) зображення ігрового поля.

domains

int=integer

predicates

krestic(int,int)

nolik(int,int)

for(int,int,int)

forX(int,int,int)

forY(int,int,int)

cyclebody(int)

body(int,int)

print(int,int)

clauses

krestic(1,1).

krestic(1,2).

krestic(2,2).

krestic(3,1).

krestic(3,3).

nolik(X, Y):-not(krestic(X, Y)).

for(Cur, Max, Step):- forX(Cur, Max, Step).

forX(Cur, Max, Step):- Step = 0;

Step > 0, Cur > Max;

Step < 0, Cur < Max.

forX(Cur, Max, Step):- cyclebody(Cur),

Cur1 = Cur + Step, forX(Cur1, Max, Step).

cyclebody(Cur):- forY(1, 3, Cur).

forY(Cur, Max, _):- Cur > Max, nl.

forY(J, Finish, Cur):- body(Cur, J),

J1 = J + 1,forY(J1, Finish, Cur).

body(Cur, J):- print(Cur, J).

print(Cur,J):- krestic(Cur,J), write("X");write("0").

goal

for(1,3,1).



Завдання 2. Предикат відсікання.

Розгляньте та дослідіть приклади програм на застосування відсікання. Реалізуйте приклад програми підрахунку факторіалу з відсіканням (див. лекції). Дослідіть роботу цієї програми.

predicates

f(integer,real)

factorial (integer,real, integer,real)

clauses

f(N,F) :-

factorial (N,F,1,1). % rule 1

factorial(N,F,N,F) :- !. % rule 2

factorial(N,F,J,P) :- NewJ=J+1, NewP = P * NewJ,

factorial(N,F,NewJ,NewP).



Завдання 3: Використання прийомів керування ходом виконання програми при розв’язанні практичних задач.

Розгляньте приклад предметної області. Реалізуйте предикати, які виконують вказані запити.

Дано перелік товарів, що продаються в магазині. Про кожен товар відома його назва і ціна. Напишіть предикати, що реалізують запити:

1) Надрукуйте перелік товарів в порядку номерів у списку.

2) Надрукуйте перелік товарів у зворотньому порядку номерів у списку.

3) Визначте сумарну ціну всх товарів у списку.

4а) Визначте найдорожчий товар.

4б) Визначте найдешевший товар.

5а) Опишіть предикат, який визначить кількість товарів, що задовольняють певній умові. Наприклад, мають ціну від 100 до 400.

5б) Опишіть предикат, який визначить сумарну ціну товарів, що задовольняють тій же умові (з пункту завдання 5а).

6а) Надрукуйте список товарів в порядку збільшення ціни.

6б) Надрукуйте список товарів в порядку зменшення ціни.

7) Опишіть предикат, який отримає число N і визначить N-й за ціною товар (в порядку зменшення ціни).

8) Опишіть предикат, який отримає ціну C і визначить, скільки є в списку товарів, дешевших за введену ціну.

Лістинг програми наведено нижче:

domains

nomer = integer

nazva = symbol

cina = integer

list = integer*

predicates

tovar(nomer, nazva, cina)

sum(integer)

sum(integer, integer)

ndor(list)

ndesh(list)

tovarInRange(list, integer, integer, integer, integer)

printIncWrite(List)

printDecWrite(List)

printInc(List)

printDec(List)

printAll

printAll(integer)

printAllReverse

printAllReverse(integer)

getPt(list, integer)

DeshC(List)

crList(list)

crList(integer, list, list)

add(integer, list, list)

sort(list, list).

partition(list, integer, list, list).

conc(list, list, list).

amount(integer, integer)

moreThanAmount(List, integer, integer, integer, integer)

lessThanAmount(List, integer, integer, integer, integer)

vidsikania(integer, list, integer)

clauses

tovar(1, lampochka, 8).

tovar(2, velosiped, 4000).

tovar(3, tapochki, 80).

tovar(4, kastrulya, 200).

tovar(5, kedy, 300).

amount(N, Result):-tovar(N, _, _), !, N1 = N + 1, amount(N1, Result).

amount(N, Result):- Result = N - 1.

printAll:- write("Tovary v poriadky nomeriv v spusky:\n"),printAll(1).

printAll(N):-

tovar(N, Name, Price), write(N, ' ', Name, ' ', Price), nl,

N1 = N + 1, printAll(N1).

printAllReverse:-write("Tovary v zvorotniomu poriadky nomeriv v spusky:\n"),

amount(1, N), printAllReverse(N).

printAllReverse(0).

printAllReverse(N):-

tovar(N, Name, Price), write(N, ' ', Name, ' ', Price),

nl, N1 = N - 1, printAllReverse(N1).

sum(Sum):- amount(1, Amount), sum(Amount, Sum),write("Suma vsich tovariv=",Sum).

sum(0, 0):- !.

sum(N, Sum):- N1 = N - 1, sum(N1, Sum1), tovar(N, _, Price),

Sum = Sum1 + Price.

ndor([H|[]]):- tovar(H, Name, Price),

write("Naydorozchuy tovar: ",Name, " cina=", Price), nl.

ndor([_|T]):- ndor(T).

ndesh([H|_]):- tovar(H, Name, Price),

write("Naydeshevsuy tovar: ",Name, " cina=", Price), nl.

tovarInRange(List, Min, Max, Amount, Price):-

write("Vvedit min ciny="),readint(Min),write("Vvedit max ciny="),readint(Max),

moreThanAmount(List, Min, Max, Amount, Price),

write("K-st tovariv v mezhah danuych cin: ", Amount,"\n"),

write("Suma tovariv v mezhah danuych cin: ", Price,"\n").

printIncWrite(List2):-write("Spusok tovariv v poriadky zbilshennia ciny\n"),printInc(List2).

printInc([]).

printInc([H|T]):-

tovar(H, Name, Price), write(Name, " cina=", Price), nl,printInc(T).

printDecWrite(List2):-write("Spusok tovariv v poriadky zmenshennia ciny\n"),printDec(List2).

printDec([]).

printDec([H|T]):-

printDec(T), tovar(H, Name, Price),

write(Name, " cina=", Price), nl.

getPt(List, N):-write("Vvedit chuslo N: "), readint(N),

amount(1, Amount), Nom = Amount - N, vidsikania(Nom, List, Res),

tovar(Res, Name, Price), write(N," za cinoyu tovar v poriadky zmenshennia ciny:\n"),

write(Name, " cina=", Price).

DeshC(List):- write("Vvedit cinu: "), readint(C),

moreThanAmount(List, 0, C, Amount, _),

write("K-st tovariv deshevshuch za vvedenu cinu: ", Amount), nl.

add(El, L, [EL|L]).

crList(List):- amount(1, Amount), N = Amount - 1, crList(N, [Amount], List).

crList(0, List, List):- !.

crList(Amount, List, NList):-add(Amount, List, List1), N = Amount - 1,

crList(N, List1, NList).

sort([], []).

sort([H|T], O):-

partition(T, H, L, G),

sort(L, L_s),

sort(G, G_s),

conc(L_s, [H|G_s], O).

partition([], _, [], []).

partition([X|T], Y, [X|T1], Bs):-

tovar(X, _, PriceX) ,tovar(Y, _, PriceY), PriceX < PriceY, !,

partition(T, Y, T1, Bs).

partition([X|T], Y, T1, [X|Bs]):-

partition(T, Y, T1, Bs).

conc([], L, L).

conc([H|L1], L2, [H|L3]):-

conc(L1, L2, L3).

moreThanAmount([], _, _, 0, 0):- !.

moreThanAmount([H|T], Min, Max, Amount, P):-

tovar(H, _, Price), Price > Min,

lessThanAmount([H|T], Min, Max, Amount, P).

moreThanAmount([_|T], Min, Max, Amount, P):-moreThanAmount(T, Min, Max, Amount, P).

lessThanAmount([H|T], Min, Max, Amount, P):-

tovar(H, _, Price), Price < Max, lessThanAmount(T, Min, Max, Amount1, P1),

Amount = Amount1 + 1, P = P1 + Price.

lessThanAmount(_, _, _, 0, 0).

vidsikania(0, [Elem|_], Elem):- !.

vidsikania(Index, _, _):-

Index < 0, !, fail.

vidsikania(Index, [_|Tail], Elem):-

NextIndex = Index - 1,

vidsikania(NextIndex, Tail, Elem).

goal

makewindow(1,15,3,"Magazyn",1,0,17,50),

crList(List),sort(List,List2),

%printAll,nl. %1 Tovary v poriadky nomeriv v spusku

%printAllReverse,nl. %2 Tovary v zvorotniomu poriadky nomeriv v spusku

%Sum(X),nl. %3 Suma vsich tovariv

%ndor(List2),ndesh(List2),nl. %4 Naydoro/deshev tovar

%tovarInRange(List2, Min, Max, Amount, Price). %5 K-st tovariv deshevshuch za vvedenu cinu

%printIncWrite(List2),nl, printDecWrite(List2). %6 tovar v poriadky zrost/spadan

%getPt(List2, N). %7 tovar v poriadky zmenshennia ciny

%DeshC(List2),nl. %8 K-st tovariv deshevshuch za vvedenu cinu

Реалізуйте аналогічні запити для предметної області за своїм індивідуальним варіантом. В моєму випадку це «Магазин гантелей», де представлено 15 одиниць товару, 5 фiрм-виробникiв та 4 ваговi категорії.

domains

int=integer

list = int*

predicates

dumbbells(int,symbol,symbol,real)

sum(real)

sum(real, real)

ndor(list)

ndesh(list)

tovarInRange(list, real, real, int, real)

printIncWrite(List)

printDecWrite(List)

printInc(List)

printAll

printAll(int)

printAllReverse

printAllReverse(int)

printDec(List)

getPt(list, int)

DeshC(List)

crList(list)

crList(int, list, list)

add(int, list, list)

sort(list, list).

partition(list, int, list, list).

conc(list, list, list).

amount(int, int)

moreThanAmount(List, real, real, int, real)

lessThanAmount(List, real, real, int, real)

otsechenie(int, list, int)

clauses

dumbbells (1,"Nautilus","6kg",4500).

dumbbells (2,"Nautilus","4kg",3700).

dumbbells (3,"FreeMotion","4kg",2700).

dumbbells (4,"FreeMotion","6kg",3500).

dumbbells (5,"Medusa","8kg",6800).

dumbbells (6,"SportBeast","2kg",2300).

dumbbells (7,"SportBeast","4kg",4000).

dumbbells (8,"Nautilus","8kg",5700).

dumbbells (9,"Gem","4kg",5000).

dumbbells (10,"Medusa","2kg",3750).

dumbbells (11,"SportBeast","6kg",3750).

dumbbells (12,"Nautilus","2kg",2750).

dumbbells (13,"Medusa","6kg",5550).

dumbbells (14,"Gem","6kg",6750).

dumbbells (15,"Gem","2kg",3300).

printAll:- write("Dumbbells in list as they are:\n"),printAll(1).

printAll(N):- dumbbells(N, Mark,Weight, Price), write(N,' ',Mark,' ',Weight,' ',Price), nl,

N1 = N + 1, printAll(N1).

printAllReverse:-write("Dumbbells in a reverse list:\n"),

amount(1, N), printAllReverse(N).

printAllReverse(0).

printAllReverse(N):-

dumbbells(N, Mark,Weight, Price), write(N,' ',Mark,' ',Weight,' ',Price),

nl, N1 = N - 1, printAllReverse(N1).

amount(N, Result):-dumbbells(N,_, _,_),!, N1 = N + 1, amount(N1, Result).

amount(N, Result):- Result = N - 1.

sum(Sum):- amount(1, Amount), sum(Amount, Sum),write("Total price=",Sum).

sum(0, 0):- !.

sum(N, Sum):- N1 = N - 1, sum(N1, Sum1), dumbbells(N, _,_, Price),Sum = Sum1 + Price.

ndor([H|[]]):- dumbbells(H, Mark,Weight, Price),

write("Most expensive: ",Mark,' ',Weight," price=", Price), nl.

ndor([_|T]):- ndor(T).

ndesh([H|_]):- dumbbells(H, Mark,Weight, Price),

write("Least expensive: ",Mark,' ',Weight," price=", Price), nl.

tovarInRange(List, Min, Max, Amount, Price):-

write("Enter minimal price="),readint(Min),write("Enter maximal price="),readint(Max),

moreThanAmount(List, Min, Max, Amount, Price),

write("Amount of dummbbells within this price: ", Amount,"\n"),

write("Total price of dumbbells within the limits: ", Price,"\n").

printIncWrite(List2):-write("Sort from cheapest to most expensive\n"),printInc(List2).

printInc([]).

printInc([H|T]):-

dumbbells(H, Mark,Weight, Price), write(Mark,' ',Weight,' ',Price), nl,printInc(T).

printDecWrite(List2):-write("Sort from most expensive to the cheapest\n"),printDec(List2).

printDec([]).

printDec([H|T]):-

printDec(T), dumbbells(H, Mark,Weight, Price), write(Mark,' ',Weight,' ',Price),nl.

getPt(List, N):-write("Enter N: "), readint(N),

amount(1, Amount), Nom = Amount - N, otsechenie(Nom, List, Res),

dumbbells(Res, Mark,Weight, Price), write(N," th dumbbells sorted by price:\n"),

write(Mark,' ',Weight,' ',Price).

DeshC(List):- write("Enter price: "), readint(C),

moreThanAmount(List, 0, C, Amount, _),

write("Amount of dumbbells cheaper than entered price: ", Amount), nl.

crList(List):- amount(1, Amount), N = Amount - 1,

crList(N, [Amount], List).

crList(0, List, List):- !.

crList(Amount, List, NList):-

add(Amount, List, List1), N = Amount - 1,

crList(N, List1, NList).

add(El, L, [EL|L]).

sort([], []).

sort([H|T], O):-

partition(T, H, L, G),

sort(L, L_s),

sort(G, G_s),

conc(L_s, [H|G_s], O).

partition([], _, [], []).

partition([X|T], Y, [X|T1], Bs):-

dumbbells (X,_, _, PriceX) , dumbbells(Y,_,_, PriceY), PriceX < PriceY, !,

partition(T, Y, T1, Bs).

partition([X|T], Y, T1, [X|Bs]):-

partition(T, Y, T1, Bs).

conc([], L, L).

conc([H|L1], L2, [H|L3]):-

conc(L1, L2, L3).

moreThanAmount([], _, _, 0, 0):- !.

moreThanAmount([H|T], Min, Max, Amount, P):-

dumbbells(H,_, _, Price), Price > Min,

lessThanAmount([H|T], Min, Max, Amount, P).

moreThanAmount([_|T], Min, Max, Amount, P):-moreThanAmount(T, Min, Max, Amount, P).

lessThanAmount([H|T], Min, Max, Amount, P):-

dumbbells(H,_, _, Price), Price < Max, lessThanAmount(T, Min, Max, Amount1, P1),

Amount = Amount1 + 1, P = P1 + Price.

lessThanAmount(_, _, _, 0, 0).

otsechenie(0, [Elem|_], Elem):- !.

otsechenie(Index, _, _):-Index < 0, !, fail.

otsechenie(Index, [_|Tail], Elem):- NextIndex = Index - 1, otsechenie(NextIndex, Tail, Elem).

goal

makewindow(1,15,3,"Dumbbells Store",0,0,25,80),

crList(List),sort(List,List2),

%printAll,nl. %1 print all in the way they are sorted

%printAllReverse,nl. %2 print all in the reversed way

%Sum(X),nl. %3 total price

%ndor(List2),ndesh(List2),nl. %4 most/least expensive dumbbells

%tovarInRange(List2, Min, Max, Amount, Price). %5 amount of dumbbells within limited price

%printIncWrite(List2). %6 print from cheapest to most expensive

%printDecWrite(List2). %6 from most expensive to cheapest

%getPt(List2, N). %7 specific number in list sorted by price

%DeshC(List2),nl. %8 amount of dumbbells cheaper than entered price











Висновок: У ході виконання лабораторної роботи вивчено методи організації циклічних процесів в мові Пролог; ознайомлено з предикатом відсікання; набуто навички застосування прийомів керування ходом виконання Prolog-програми при розв’язанні практичних задач.
скачати

© Усі права захищені
написати до нас