Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Компютерні системи штучного інтелекту_методичні...doc
Скачиваний:
2
Добавлен:
01.05.2025
Размер:
522 Кб
Скачать
☆

Лабораторне заняття № 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).