- •Лабораторне заняття № 1
- •1. Теоретичні відомості
- •2. Практична частина
- •2.1. Програма роботи та завдання.
- •Лабораторне заняття № 2
- •1. Теоретичні відомості
- •1. Теоретичні відомості
- •2. Практична частина
- •2.1. Програма роботи та завдання.
- •Лабораторне заняття № 3
- •2. Практична частина
- •2.1. Програма роботи та завдання.
- •Лабораторне заняття № 4
- •1. Теоретичні відомості
- •2. Практична частина
- •2.1. Програма роботи та завдання.
- •Лабораторне заняття № 5
- •1. Теоретичні відомості
- •2. Практична частина
- •2.1. Програма роботи та завдання.
- •Лабораторне заняття № 6
- •1. Теоретичні відомості
- •2. Практична частина
- •2.1. Програма роботи та завдання.
- •Лабораторне заняття № 7
- •1. Теоретичні відомості
- •2. Практична частина
- •2.1. Програма роботи та завдання.
- •Лабораторне заняття № 8
- •1. Теоретичні відомості
- •2. Практична частина
- •2.1. Програма роботи та завдання.
- •Лабораторне заняття № 9
- •1. Теоретичні відомості
- •2. Практична частина
- •2.1. Програма роботи та завдання.
- •Лабораторне заняття № 10
- •1. Теоретичні відомості
- •2. Практична частина
- •2.1. Програма роботи та завдання.
- •Лабораторне заняття № 11
- •1. Теоретичні відомості
- •2. Практична частина
- •2.1. Програма роботи та завдання.
- •Лабораторне заняття № 12
- •1. Теоретичні відомості
- •1. Стара графіка.
- •2. Черепахова графіка (Turtle graphics).
- •2. Практична частина
- •2.1. Програма роботи та завдання.
- •Лабораторне заняття № 13
- •1. Теоретичні відомості
- •2. Практична частина
- •2.1. Програма роботи та завдання.
- •Лабораторне заняття № 14
- •1. Теоретичні відомості
- •2. Практична частина
- •2.1. Програма роботи та завдання.
- •Лабораторне заняття № 15
- •1. Теоретичні відомості
- •2. Практична частина
- •2.1. Програма роботи та завдання.
- •Лабораторне заняття № 16
- •1. Теоретичні відомості
- •2. Практична частина
- •2.1. Програма роботи та завдання.
- •43018, М. Луцьк, вул.Львівська, 75
Лабораторне заняття № 5
Тема: Робота зі списками
Мета роботи. Ознайомитись із основними прийомами роботи зі списками та багаторівневими складними об’єктами; у звіті зафіксувати результати роботи програм; проаналізувати отримані результати.
1. Теоретичні відомості
Модифікація списку полягає у зміні уже існуючого списку. Традиційно, така зміна проводиться послідовною обробкою елементів списку. Прикладом модифікації списку може служити програма, яка додає до кожного елементу списку 1.
Обчислення, які повинна виконувати програма, можна описати наступним чином:
1.Зв'язати голову і хвіст початкового списку відповідно з Head і Tail.
2.Зв'язати голову і хвіст результату з Head1 і Tail1
(Head1 і Tail1 ще не мають значень).
3.Додаючи 1 до Head, отримаємо Head1.
4.Рекурсивно додайте 1 до всіх елементів Tail, отримаєте Tail1.
Особливість Прологу полягає у тому, що при побудові предикату для розв’язання якоїсь конкретної задачі , то він може використовуватись і для розв’язання зовсім інших задач. Продемонструємо це на наступному прикладі. Побудуємо предикат конкатенації двох списків з трьома аргументами:
append(List1,List2,List3)
де List3 є результуючим списком. Використаємо наступний рекурсивний алгоритм.
Якщо перший список порожній, тоді результуючий список буде рівний другому списку (append([],List2,List2)). Інакше, головою третього списку стає голова першого списку, а хвостом - залишок першого списку і другий список.
Часто вам потрібно зберігати комбинацію різних типів елементів всередині одного списку, як наприклад [2,3,5,12,[food,"goo"], "new"].
Складними будемо називати списки, які містять більше одного типу аргументів. Нам будуть потрібні спеціальні декларації, щоб обробити списки багатотипних елементів, тому що Пролог вимагає, щоб всі елементи списку належали одній області. Для опису різнотипних списків потрібно використовувати функтори.
2. Практична частина
Приклад 1.
domains
list=char*
lists=string*
predicates
make(string,list)
is1(list)
is2(list)
is3(list)
is4(list)
is5(list)
sym(char)
let(char)
num(char)
znak(char)
dani(string)
clauses
dani("0one09ofkjg98").
make("",[]):-!.
make(S,[H|T]):-frontchar(S,H,S1),!,
make(S1,T).
is1([H|T]):-znak(H),is2(T),write("Yes");is1(T);write("No").
is2([H|T]):-H='o',is3(T).
is3([H|T]):-H='n',is4(T).
is4([H|T]):-H='e',is5(T).
is5([H|_]):-znak(H).
is5([]).
sym(C):-C=42;C=43;C=45;C=47.
let(C):-C>=97,C<=122.
num(C):-C>=48,C<=57.
znak(C):-sym(C);num(C).
goal
clearwindow,
write("Input string"),nl,
dani(S),
write(S),
make(S,R),
nl,is1(R).
Приклад 2.
domains
list = integer*
predicates
del(integer,list, list)
ins(integer,list,list)
make(integer,list)
print(list)
clauses
ins(X,R,[X|R]).
make(0,[]):-!.
make(N,R):-N>0,!,
N1=N-1,
make(N1,R1),write("Input element of list "),
readint(X),ins(X,R1,R).
del(_,[], []).
del(X,[H|T], PT) :-
H=X, !,
del(X,T, PT).
del(X,[H|T], [H|PT]) :-
del(X,T, PT).
print([]):-!.
print([H|T]):-
write(H," "),
print(T).
goal
clearwindow,
write("Input number of list: "),
Readint(N),
make(N,R),
write("Input element for delete: "),
readint(X),
del(X,R,R1),
Write("Result : "),nl,
print(R1).
