Пролог-процесори. Огляд особливостей

Содержание

Слайд 2

Пролог-процесори Детермінізм обчислень: Пролог-процесори. Огляд особливостей (1/2) послідовний перегляд атомів запиту;

Пролог-процесори
Детермінізм обчислень:

Пролог-процесори. Огляд особливостей (1/2)

послідовний перегляд атомів запиту;
послідовний перегляд (перебір) правил;
реалізація

відкатів (backtracking).
Слайд 3

Пролог-процесори Детермінізм обчислень: підстановки (правила) застосовуються до найлівішого атому у запиті

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

Детермінізм обчислень:
підстановки (правила) застосовуються до найлівішого атому у запиті (такий принцип

спряжений зі стратегією обходу дерева “вглиб зліва-направо”);
при наявності кількох альтернатив порядок їх застосування визначається порядком входження у текст програми:
у разі невдачі застосування поточної альтернативи має обиратись наступна;
у разі отримання невдачі для усіх альтернатив доводиться робити відкат (повернення до попереднього кроку із відновленням стану).
Пролог-процесори мають забезпечувати реалізацію відкатів.
Увага! Можуть бути “зациклення” (з’являється нескінчена гілка)! (Ефект – переповнення стеку).

Пролог-процесори. Огляд особливостей (2/2)

Слайд 4

Пролог-процесори 1) Предок(X,Y):-Батько(X,Y). 2) Предок(X,Y):-Батько(X,Z), Предок(Z,Y). 3) Батько(дідІван, дядькоЛука). 4) Батько(дідІван,

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

1) Предок(X,Y):-Батько(X,Y).
2) Предок(X,Y):-Батько(X,Z), Предок(Z,Y).
3) Батько(дідІван, дядькоЛука).
4) Батько(дідІван, батькоВасиль).
5) Батько(батькоВасиль, малийПетрик).

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

Ілюстрація до виконання програм

:- Предок(дідІван, малийПетрик).

:- Батько(дідІван, малийПетрик).

:-Батько(дідІван,Z),Предок(Z, малийПетрик).

1

2

:-Предок(дядькоЛука, малийПетрик).

(Z = дядькоЛука) 3

:- Батько(дядькоЛука, малийПетрик).

1

Невдача --> Відкат

Невдача --> Відкат

:-Предок(батькоВасиль, малийПетрик).

4 (Z = батькоВасиль)

2

:-Батько(дядькоЛука,Z),Предок(Z, малийПетрик).

Невдача --> Відкат

:-Батько(батькоВасиль, малийПетрик).

1

5

Удача!

Запит

Слайд 5

Пролог-процесори 11) Предок(X,Y):- Предок(X,Z),Батько(Z,Y). 21) Предок(X,Y):- Батько(X,Y). 3) Батько(дідІван, дядькоЛука). 4)

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

11) Предок(X,Y):- Предок(X,Z),Батько(Z,Y).
21) Предок(X,Y):- Батько(X,Y).
3) Батько(дідІван, дядькоЛука).
4) Батько(дідІван, батькоВасиль).
5)

Батько(батькоВасиль, малийПетрик).

Пролог-процесори. Приклад зациклення (1/2)

:- Предок(дідІван, малийПетрик).

:-Предок(дідІван,Z), Батько(Z, малийПетрик).

1

:-Предок(дідІван,Z1), Батько(Z1, Z), Батько(Z, малийПетрик).

1

1

. . .

Було:
1) Предок(X,Y):-Батько(X,Y).
2) Предок(X,Y):-Батько(X,Z), Предок(Z,Y).

Слайд 6

Пролог-процесори ff(X,Y):-ff(X,Z),f(Z,Y). %forefather, ancestor ff(X,Y):-f(X,Y). f('Іван','Петро'). f('Петро','Лука'). Пролог-процесори. Приклад зациклення (2/2)

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

ff(X,Y):-ff(X,Z),f(Z,Y). %forefather, ancestor
ff(X,Y):-f(X,Y).
f('Іван','Петро').
f('Петро','Лука').

Пролог-процесори. Приклад зациклення (2/2)

Слайд 7

Пролог-процесори Стандартні предикати: cut (є скорочена форма “!”) – відсікання (або

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

Стандартні предикати:
cut (є скорочена форма “!”) – відсікання (або закріплення вибору);
fail

– предикат, спряжений із примусовим запуском відкату.

Управління відкатом

Слайд 8

До техніки Prolog-програмування. Пошук множин розв’язків

До техніки Prolog-програмування. Пошук множин розв’язків

Слайд 9

Пролог-процесори SWI-Prolog ?- append(X,Y, [a,b,c]). Натискання клавіші “Space” дозволяє отримувати черговий розв’язок (при його наявності).

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

SWI-Prolog

?- append(X,Y, [a,b,c]).

Натискання клавіші “Space” дозволяє отримувати черговий розв’язок

(при його наявності).
Слайд 10

Пролог-процесори Пошук усіх розв’язків із використанням предикату fail Предикат fail зручно

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

Пошук усіх розв’язків із використанням предикату fail

Предикат fail зручно використовувати

при потребі знайти не один, а усі розв’язки деякої задачі.
Приклад. Запит для знаходження усіх синів діда Івана.

Батько(дідІван, X), nl, write(X), fail.

Стандартні предикати

1) Предок(X,Y):-Батько(X,Y).
2) Предок(X,Y):-Батько(X,Z), Предок(Z,Y).
3) Батько(дідІван, дядькоЛука).
4) Батько(дідІван, батькоВасиль).
5) Батько(батькоВасиль, малийПетрик).

SWI-Prolog

Слайд 11

Пролог-процесори Пошук усіх розв’язків із використанням предикату fail ?- append(X,Y,[a,b,c]),nl,write(X),write(Y),fail.

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

Пошук усіх розв’язків із використанням предикату fail

?- append(X,Y,[a,b,c]),nl,write(X),write(Y),fail.

Слайд 12

До техніки Prolog-програмування. Скорочувані правила

До техніки Prolog-програмування. Скорочувані правила

Слайд 13

Пролог-процесори Скорочувані правила (1/3) my_max(A,B,A):-A>=B. my_max(A,B,B):-A Чи потрібна перевірка X my_max(A,B,A):-A>=B.

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

Скорочувані правила (1/3)

my_max(A,B,A):-A>=B.
my_max(A,B,B):-A

Чи потрібна перевірка X

my_max(A,B,A):-A>=B.
my_max(A,B,B).

Але спробуємо скористатись предикатом fail

за рецептом пошуку “усіх” можливих розв’язків.
Запит:

my_max(3,2,Z), write(Z), nl, fail.

Який буде результат роботи програми?

SWI-Prolog

Слайд 14

Пролог-процесори Скорочувані правила (2/3) my_max(A,B,A):-A>=B. my_max(A,B,B). Запит: my_max(3,2,Z), nl, write(Z), fail. SWI-Prolog

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

Скорочувані правила (2/3)

my_max(A,B,A):-A>=B.
my_max(A,B,B).

Запит:

my_max(3,2,Z), nl, write(Z), fail.

SWI-Prolog

Слайд 15

Пролог-процесори Скорочувані правила та відсікання cut (!) (3/3) Як же підправити

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

Скорочувані правила та відсікання cut (!) (3/3)

Як же підправити програму?

my_max(A,B,A):-A>=B,

! .
my_max(A,B,B).

“Закріплення вибору”.

my_max(A,B,A):-A>=B.
my_max(A,B,B).

Запит:

my_max(3,2,Z), write(Z), nl, fail.

member(X,[X|T]):-!.
member(X,[Y|T]) :- member(X,T).

member(X,[X|T]).
member(X,[Y|T]) :- X=\=Y, member(X,T).

Слайд 16

Пролог-процесори Використовується для припинення обчислень для заданої “гілки” (часто після перевірки

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

Використовується для припинення обчислень для заданої “гілки” (часто після перевірки даних

та визначення їх не коректними).
Приклад.

Комбінація “!, fail”. (SWI-Prolog)

check_cost(X):- X =< 0, write(“не коректна ціна”), !, fail.

Слайд 17

Пролог-процесори Цей предикат дозволяє відкат “розвернути” (запустити черговий крок циклічних обчислень).

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

Цей предикат дозволяє відкат “розвернути” (запустити черговий крок циклічних обчислень).

Моделювання циклів

(повтори). Предикат repeat

repeat.
repeat :- repeat.

check_stop(“стоп”).
echo:-repeat, readln(X), write(X), check_stop(X).

repeat

1

2

repeat

1

2

repeat

1

2

. . .

Слайд 18

Пролог-процесори Повтори з лічильником. (SWI-Prolog) count(0). count(X) :- count(Y), X is

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

Повтори з лічильником. (SWI-Prolog)

count(0).
count(X) :- count(Y), X is Y+1.

Знайти найменше ціле

число N, для якого N!>1000.

fact(0,1).
fact(X,Y) :- X>0, X1 is X-1, fact(X1,Y1), Y is Y1*X.
goal count(N), fact(N,Y), Y>1000, !, write(N).

count(N)

1

2

count(Y), N is Y+1

1

2

count(Z),Y is Z+1, N is Y+1

1

N=0

Y=0,N=1

Z=0,Y=1, N=2

. . .

2

Слайд 19

Пролог-процесори Пошук (перевірка) елемента за його позицією у списку % 8.

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

Пошук (перевірка) елемента за його позицією у списку

    % 8. Той,

хто мешкає в центральному будинку, п'є молоко.
H=[_,_,house(_,_,_,_,milk,_),_,_]
pos(3, H, house(_,_,_,_,milk,_)) % ще один варіант умови

member(X,[X|T]).
member(X,[Y|T]) :- X=\=Y, member(X,T).

pos(1, [H | _], H).
pos(N, [_ | T], Elem) :- N > 1, K is N-1, pos(K, T, Elem).

Слайд 20

Пролог-процесори Знайти список позицій входжень елемента X у список L. Приклад

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

Знайти список позицій входжень елемента X у список L.

Приклад 1 із

пошуком позицій елементів списку. SWI-Prolog

% L — список, X — елемент, LRes — шуканий список
p(L,X,LRes):- positions1(L,X,LRes,1).
% 1 - лічильник C (позиція поточної голови у початковому списку)
% positions1(L,X,LRes,C).
positions1([],_,[],_).
positions1([H|T],X,L,Pos) :- X=\=H,!,Y is Pos+1, positions1(T,X,L,Y).
positions1([H|T],X,[Pos|L],Pos):-X=H, Y is Pos+1, positions1(T,X,L,Y).

Слайд 21

Пролог-процесори Знайти у списку L перший (найлівіший) елемент, більший за X,

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

Знайти у списку L перший (найлівіший) елемент, більший за X, забезпечуючи

пошук як значення, так і його позицію у списку.

find(L,X,Zn,PosZn) % L - список, X - задане значення, % Zn - шуканий елемент та PosZn - його позиція
find(L,X,Zn,PosZn):- find1(L,X,Zn,PosZn,1). %SWI-Prolog
% 1 - лічильник C(позиція поточної голови у початковому списку)
find1([],X,_,0,_).
find1([H|T],X,H,P,P):-H>X,!.
find1([H|T],X,Zn,PosZn,P):-H<=X, Y is Pos+1, find1(T,X,Zn,PosZn,Y).

Приклад 2 із пошуком позицій елементів списку (1/2)

Ознака відсутності шуканого елемента!

Слайд 22

Пролог-процесори find1([H|T],X,H,P,P):-H>X,!. find1([H|T],X,Zn,PosZn,P):-H Приклад 2 із пошуком позицій елементів списку (2/2)

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

find1([H|T],X,H,P,P):-H>X,!.
find1([H|T],X,Zn,PosZn,P):-H<=X, Y is Pos+1, find1(T,X,Zn,PosZn,Y).

Приклад 2 із пошуком позицій елементів списку

(2/2)

Перестрахувались навіть двічі!

find1_([H|T],X,H,P,P):-H>X.
find1_([H|T],X,Zn,PosZn,P):-Y is Pos+1, find1_(T,X,Zn,PosZn,Y).

Слайд 23

Пролог-процесори Знайти у списку L останній (найправіший) з елементів, більших за

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

Знайти у списку L останній (найправіший) з елементів, більших за X,

забезпечуючи пошук як значення, так і його позицію у списку.

findLast(L,X,Zn,PosZn):- findLast1(L,X,Zn,PosZn,1).
findLast1([],X,_,0,_).
findLast1([H|T],X,Zn,PosZn,P):-H<=X, P1 is P+1,
findLast1(T,X,Zn,PosZn,P1).
findLast1([H|T],X,H,P,P):-H>X,find(T,X,_,Z),Z=0,!.
findLast1([H|T],X,Zn,PosZn,P):-H>X,find(T,X,_,Z),Z<>0, P1 is P+1, findLast1(T,X,Zn,PosZn,P1).

Приклад 3 із пошуком позицій елементів списку

Ознака відсутності шуканого елемента!

З попередньої задачі!

Ознака відсутності шуканого елемента!

Слайд 24

Пролог-процесори Повставляти елементи одного списку у впорядкований за зростанням другий список.

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

Повставляти елементи одного списку у впорядкований за зростанням другий список. Сформувати

список із номерами позицій, які займають вставлені елементи в новому списку. (Задача на зразок 50).

bubl(L,LSort) :-trans(L,L1),!,bubl(L1,LSort).
bubl(L,L).
trans([X,Y|Tail], [Y,X|Tail]) :- greater(X,Y).
trans([X|T], [X|T1]) :- trans(T,T1).
greater([X,_],[Y,_]):-X>Y.
cod([],[],_). % для "розмітки" списків (за 3 параметром): % 1 - для першого списку, 2 - для другого
cod([H|T],[[H,X]|RT],X):-cod(T,RT,X).
decod([],[]).
decod([[H,_]|T],[H|RT]):-decod(T,RT).
append([],L,L).
append([H|T],L,[H|R]):-append(T,L,R).
res(L,LR):-res1(L,LR,1). % вибір елементів з міткою 1 % (з бувшого 1-го списку) та фіксація їх позицій
res1([],[],_).
res1([[_,2]|T],R,P):-P1 is P+1, res1(T,R,P1).
res1([[X,1]|T],[[X,P]|R],P):-P1 is P+1, res1(T,R,P1),.

Приклад 4 (1/3)

Слайд 25

Пролог-процесори Повставляти елементи одного списку у впорядкований за зростанням другий список.

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

Повставляти елементи одного списку у впорядкований за зростанням другий список. Сформувати

список із номерами позицій, які займають вставлені елементи в новому списку.

query(L1,L2,R1Sort,R2):-
cod(L1,LL1,1), writeln(LL1),
cod(L2,LL2,2), writeln(LL2),
append(LL1,LL2,LL), writeln(LL),
bubl(LL,LLS), writeln(LLS),
decod(LLS, R1Sort), writeln(R1Sort),
res(LLS,R2).
% test: query([7,3,5,1,9],[2,4,6,8,10],R1Sort,R2).

Приклад 4 (2/3)

Можна закоментувати

Слайд 26

Пролог-процесори Приклад 4 (3/3) Повставляти елементи одного списку у впорядкований за

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

Приклад 4 (3/3)

Повставляти елементи одного списку у впорядкований за зростанням другий

список. Сформувати список із номерами позицій, які займають вставлені елементи в новому списку.
Слайд 27

Пролог-процесори inv([],[]). % 1 - вх список, 2 - рез список

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

inv([],[]). % 1 - вх список, 2 - рез список
inv(L_in,L_out):-inv1(L_in,L_out,[]).
inv1([],L,L). %

1 - вх список, 3 - список-додаток,
% 2 - рез список
inv1([H|T],X,Y):-inv1(T,X,[H|Y]).

Приклад. Перевертання списку

Слайд 28

Додаток 1

Додаток 1

Слайд 29

Пролог-процесори fib(1,0). fib(2,1). fib(N,F) :- N>2, N2 is N-2, N1 is

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

fib(1,0).
fib(2,1).
fib(N,F) :- N>2, N2 is N-2, N1 is N-1, fib(N2,F2), fib(N1,F1),

F is F1+F2.
count(0).
count(X) :- count(Y), X is Y+1.
isFib(N) :- N>=0, count(X), fib(X,F), F>=N, !, F=:=N.

fib, isFib

Слайд 30

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

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

isFib

Слайд 31

Пролог-процесори % genToN1(N, [2,3, …, N-1]) - true, N>3 genToN1(2,[]). genToN1(N,

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

% genToN1(N, [2,3, …, N-1]) - true, N>3
genToN1(2,[]).
genToN1(N, [N1|T]):-N>2, N1 is

N-1, genToN1(N1,T).
% checkDiv(N,Lst)=true if N mod Xi =\= 0 for all Xi from Lst
checkDiv(N, []).
checkDiv(N, [H|T]) :- N mod H =\= 0, checkDiv(N,T).
isPrime(2).
isPrime(N) :- N>2, genToN1(N,L), checkDiv(N,L).

genToN1, isPrime

Слайд 32

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

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

genToN1

Слайд 33

Пролог-процесори countFrom2(2). countFrom2(X) :- countFrom2(Y), X is Y+1. isPrimeByCount(2). isPrimeByCount(N) :-

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

countFrom2(2).
countFrom2(X) :- countFrom2(Y), X is Y+1.
isPrimeByCount(2).
isPrimeByCount(N) :- N>2,countFrom2(X), N mod X

=:= 0, !, X=:=N.

isPrimeByCount

Слайд 34

Пролог-процесори countFrom2(2). countFrom2(X) :- countFrom2(Y), X is Y+1. progon(N):- N1 is

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

countFrom2(2).
countFrom2(X) :- countFrom2(Y), X is Y+1.
progon(N):- N1 is N-1, countFrom2(X), NX

is (N mod X), (NX =:= 0 -> asserta(flag(X)); true), X=:=N1.
isPrime_II(2).
isPrime_II(N):- N>2, clear_flags, asserta(flag(0)), progon(N), retract(flag(F)), F=:=0.
clear_flags:-retract(flag(_)), fail.
clear_flags.

isPrime II

Слайд 35

Додаток 2

Додаток 2

Слайд 36

Пролог-процесори SWI-Prolog-Editor. Завантаження та запуск 1 2

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

SWI-Prolog-Editor. Завантаження та запуск

1

2

Слайд 37

Пролог-процесори SWI-Prolog-Editor. Параметри трасування 2 1 3

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

SWI-Prolog-Editor. Параметри трасування

2

1

3

Слайд 38

Пролог-процесори SWI-Prolog-Editor. Виконання (із трасуванням) Клавіша “Enter” розпочинає виконання, клавіша “Space”

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

SWI-Prolog-Editor. Виконання (із трасуванням)

Клавіша “Enter” розпочинає виконання, клавіша “Space” може бути

використана для ініціювання чергового кроку
Слайд 39

Пролог-процесори SWI-Prolog-Editor. Трасування. Додаткове вікно (1/2) Черговий крок – клавіша “Space”

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

SWI-Prolog-Editor. Трасування. Додаткове вікно (1/2)

Черговий крок – клавіша “Space”

Слайд 40

Пролог-процесори SWI-Prolog-Editor. Трасування. Додаткове вікно (2/2)

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

SWI-Prolog-Editor. Трасування. Додаткове вікно (2/2)

Слайд 41

Пролог-процесори SWI-Prolog-Editor. Результат виконання

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

SWI-Prolog-Editor. Результат виконання

Слайд 42

Додаток 3

Додаток 3

Слайд 43

Пролог-процесори Prolog. Online

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

Prolog. Online

Слайд 44

Пролог-процесори Prolog. Online

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

Prolog. Online