Пролог-процесори 2010 Пролог-процесори




















III_103b_prolog_processors.ppt
- Количество слайдов: 20
Пролог-процесори 2010 Пролог-процесори
Пролог-процесори. Огляд особливостей Детермінізм обчислень: – підстановки (правила) застосовуються до найлівішого атому у запиті (такий принцип спряжений зі стратегією обходу дерева “вглиб зліва-направо”); – при наявності кількох альтернатив (можливих до застосування правил) порядок їх вибору визначається черговістю входження у текст програми: • у разі невдачі застосування поточної альтернативи має обиратись наступна; • у разі отримання невдачі для всіх альтернатив доводиться робити відкат (повернення до попереднього стану, скасувавши виконаний крок). Пролог-процесори мають забезпечувати реалізацію відкатів. Увага! Можуть бути зациклення (нескінченні гілки), які супроводжуються ефектом переповнення стеку). Пролог-процесори 2
Пролог-процесори. Приклад виконання програми 1) Предок(X, Y): -Батько(X, Y). 2) Предок(X, Y): -Батько(X, Z), Предок(Z, Y). 3) Батько(дідІван, дядько. Лука). Запит 4) Батько(дідІван, батько. Василь). 5) Батько(батько. Василь, малий. Петрик). : - Предок(дідІван, малий. Петрик). 1 2 : - Батько(дідІван, малий. Петрик). : -Батько(дідІван, Z), Предок(Z, малий. Петрик). Невдача --> Відкат (Z = дядько. Лука) 3 4 (Z = батько. Василь) : -Предок(дядько. Лука, малий. Петрик). : -Предок(батько. Василь, малий. Петрик). 1 : -Батько(батько. Василь, малий. Петрик). : - Батько(дядько. Лука, малий. Петрик). 2 Невдача --> Відкат 5 : -Батько(дядько. Лука, Z), Предок(Z, малий. Петрик). Удача! Невдача --> Відкат Пролог-процесори 3
Приклад зациклення 11) Предок(X, Y): - Предок(X, Z), Батько(Z, Y). 21) Предок(X, Y): - Батько(X, Y). Було: 1) Предок(X, Y): -Батько(X, Y). 3) Батько(дідІван, дядько. Лука). 2) Предок(X, Y): -Батько(X, Z), Предок(Z, Y). 4) Батько(дідІван, батько. Василь). 5) Батько(батько. Василь, малий. Петрик). : - Предок(дідІван, малий. Петрик). 1 : -Предок(дідІван, Z), Батько(Z, малий. Петрик). 1 : -Предок(дідІван, Z 1), Батько(Z 1, Z), Батько(Z, малий. Петрик). 1 . . . Пролог-процесори 4
Пролог-процесори. Огляд особливостей ff(X, Y): -ff(X, Z), f(Z, Y). %forefather ff(X, Y): -f(Z, Y). f('Іван', 'Петро'). f('Петро', 'Лука'). Пролог-процесори 5
Детермінований пролог. Техніка програмування Пролог-процесори
Скорочення вигляду програм у випадку детермінованого Прологу max(X, Y, X): -X>=Y. max(X, Y, Y): -X
Управління відкатом (1/2) Стандартні предикати: • cut (скорочена форма “!”) – відсікання (відкату) або закріплення (вибору); • fail – предикат, який ніколи не виконується, а отже цей предикат спряжений з автоматичним запуском відкату. Предикат fail зручно використовувати при потребі знайти не один, а усі розв’язки деякої задачі. Стандартні Приклад. Запит для знаходження усіх синів діда Івана. предикати Батько(дідІван, X), nl, write(X), fail. Який результат буде отримаємо? Але спробуємо скористатись предикатом fail для знаходження “усіх” максимумів із пари 4, 3. max(X, Y, X): -X>=Y. Запит: max(X, Y, Y). max(4, 3, Y), nl, write(X), fail. Який результат буде тут? Пролог-процесори 8
Управління відкатом (2/2) max(X, Y, X): -X>=Y. max(X, Y, Y). Запит: max(4, 3, Z), nl, write(Z), fail. Як виправити програму? “Закріплення” вибору! max(X, Y, X): -X>=Y, !. max(X, Y, Y). Запит: max(4, 3, Z), nl, write(Z), fail. Тепер результат коректний Пролог-процесори 9
Комбінація “!, fail” Використовується для припинення обчислень (часто після перевірки даних та визначення їх некоректними). Приклад. check_cost(X): -X<=0, write(“не коректна ціна”), !, fail. goal readln(X), check_cost(X), . . . Якщо у предиката check_cost немає інших правил, то обчислення при X<=0 будуть припинятись. Пролог-процесори 10
Моделювання циклів (повтори). Предикат repeat. repeat : - repeat. 1 2 repeat 1 2 repeat 1 2 Цей предикат дозволяє відкат “розвернути” (запустити черговий крок циклічних обчислень). check_stop(“стоп”). echo: -repeat, readln(X), write(X), check_stop(X). Пролог-процесори 11
Повтори з лічильником count(0). count(N) count(X) : - count(Y), X=Y+1. 1 2 Предикат рівності. Не присвоювання! Змін-ні N=0 count(Y), N=Y+1 набувають значень (конкретизуються) 1 2 зазвичай під час уніфікацій Можна замінити на Y+1=X. Y=0, N=1 count(Z), Y=Z+1, N=Y+1 1 2 Z=0, Y=1, N=2 Знайти найменше ціле число N для якого N!>1000. fact(0, 1). fact(X, Y) : - X>0, X 1=X-1, fact(X 1, Y 1), Y=Y 1*X. goal count(N), fact(N, Y), Y>1000, write(N). Пролог-процесори 12
Приклад 1 із пошуком позицій елементів списку Знайти список позицій входжень елемента X у список L. positions(L, X, Res): - positions 1(L, X, Res, 1). positions 1([], X, [], _). positions 1([H|T], X, L, Pos): -X<>H, !, positions 1(T, X, L, Pos+1). positions 1([H|T], X, [Pos|L], Pos): -X=H, positions 1(T, X, L, Pos+1). positions 1(L, X, Res): - positions 1(L, X, Res, 1). %SWI-Prolog positions 1([], _, [], _). positions 1([H|T], X, L, Pos): -X==H, !, P 1 is Pos+1, ! positions 1(T, X, L, P 1). positions 1([H|T], X, [Pos|L], Pos): -X==H, P 1 is Pos+1, positions 1(T, X, L, P 1). Пролог-процесори 13
Приклад 2 із пошуком позицій елементів списку Знайти у списку L перший (найлівіший) елемент, більший за X, забезпечуючи пошук як значення, так і позиції (у списку) шуканого елемента. find(L, X, Zn, Pos. Zn): - find 1(L, X, Zn, Pos. Zn, 1). %SWI-Prolog Ознака відсутності find 1([], X, _, 0, _). шуканого елемента! find 1([H|T], X, H, P, P): -H>X, !. find 1([H|T], X, Zn, Pos. Zn, P): -H<=X, P 1 is P+1, find 1(T, X, Zn, Pos. Zn, P 1). Пролог-процесори 14
Приклад 3 із пошуком позицій елементів списку (1/2) Знайти у списку L останній (найправіший) елемент, більший за X, забезпечуючи пошук як значення, так і позиції (у списку) шуканого елемента. find. Last(L, X, Zn, Pos. Zn): - find. Last 1(L, X, Zn, Pos. Zn, 1). Ознака відсутності шуканого елемента! find. Last 1([], X, _, 0, _). find. Last 1([H|T], X, Zn, Pos. Zn, P): -H<=X, find. Last 1(T, X, Zn, Pos. Zn, P+1). find. Last 1([H|T], X, H, P, P): -H>X, find(T, X, _, Z), Z=0, !. find. Last 1([H|T], X, Zn, Pos. Zn, P): -H>X, find(T, X, _, Z), Z<>0, find. Last 1(T, X, Zn, Pos. Zn, P+1). З попередньої задачі! Пролог-процесори 15
Приклад 3 із пошуком позицій елементів списку (2/2) %SWI-Prolog find. Last(L, X, Zn, Pos. Zn): - find. Last 1(L, X, Zn, Pos. Zn, 1). Ознака відсутності шуканого елемента! find. Last 1([], X, _, 0, _). find. Last 1([H|T], X, Zn, Pos. Zn, P): -H=
Деякі особливості SWI-Prolog • Числові операції: +, –, *, /, ** (піднесення у степінь), // (цілочислове ділення), mod (остача цілочислового ділення). • Операції порівняння (арифметичні): X > Y, X < Y, X >= Y, X =< Y, X =: = Y, X == Y. • ? - X = 0+1 % значенням X буде терм 0+1 з інфіксним % функтором “+” ; ? - X is 0+1 % X набуває числового значення — 1. Пролог-процесори 17
Деякі особливості SWI-Prolog 2 Arithmetic smaller =/2 Unification =: =/2 Arithmetic equal =2 Arithmetic smaller or equal ==/2 Identical ==/2 Arithmetic not equal >/2 Arithmetic larger >=/2 Arithmetic larger or equal Пролог-процесори 18
Типи у Prolog PDC Стандартні типи: • integer; • спеціальна таблиця в ОП; • real; • умови на вигляд констант: 1) можуть складатися з латинських літер, цифр та • char; символу підкреслювання “_”; • symbol; 2) або починаються з малої літери, або беруться у лапки. • string; Константи – рядки у лапках. • file. Текстові файли Складені (структурні) типи: • “альтернатива” – “; ” reply=yes; no • “список” – “*” list_int=integer* • “структура” (“терм”) person=p(name, addr, . . . ) • будь-які комбінації, зокрема, й рекурсивні nat=one; p(nat) tree=nil; t(id, val, tree) Пролог-процесори 19
Структура програм у Prolog PDC domains list = integer* predicates ins_sort(list, list) ins(integer, list) clauses ins_sort([], []). ins_sort([H|T], R): - ins_sort(T, RT), ins(H, RT, R). ins(X, [], [X]). ins(X, [H|T], [X, H|T]): - X<=H. ins(X, [H|T], [H|R]): - X>H, ins(X, T, R). goal ins_sort([1, 3, 5, 2, 4, 6], X), write(X). database Пролог-процесори 20

