Чистий (недетермінований) Пролог








![Приклад 1. Злиття списків (1/4) append([], U, U). Приклад 1. Злиття списків (1/4) append([], U, U).](https://present5.com/presentation/3/156597051_188552378.pdf-img/156597051_188552378.pdf-9.jpg)
![Приклад 1. Злиття списків (2/4) append([], U, U). Приклад 1. Злиття списків (2/4) append([], U, U).](https://present5.com/presentation/3/156597051_188552378.pdf-img/156597051_188552378.pdf-10.jpg)
![Приклад 1. Злиття списків (3/4) append([], U, U). append([H|T], U, [H|V]): -append(T, U, V). Приклад 1. Злиття списків (3/4) append([], U, U). append([H|T], U, [H|V]): -append(T, U, V).](https://present5.com/presentation/3/156597051_188552378.pdf-img/156597051_188552378.pdf-11.jpg)
![Приклад 1. Злиття списків (4/4) append([], U, U). append([H|T], U, [H|V]): -append(T, U, V). Приклад 1. Злиття списків (4/4) append([], U, U). append([H|T], U, [H|V]): -append(T, U, V).](https://present5.com/presentation/3/156597051_188552378.pdf-img/156597051_188552378.pdf-12.jpg)
![Приклад 2. Розстановка ферзів (1/4) Розстановка([1/Y 1, … , 8/Y 8]). Приклад 2. Розстановка ферзів (1/4) Розстановка([1/Y 1, … , 8/Y 8]).](https://present5.com/presentation/3/156597051_188552378.pdf-img/156597051_188552378.pdf-13.jpg)




![member (X, L), append(L 1, L 2, UL). (PDC) member(X, [X|T]). member(X, [Y|T]) member (X, L), append(L 1, L 2, UL). (PDC) member(X, [X|T]). member(X, [Y|T])](https://present5.com/presentation/3/156597051_188552378.pdf-img/156597051_188552378.pdf-18.jpg)





![Сортування списків. SWI-Prolog (1/3) ins_sort([], []). % SWI-Prolog ins_sort([H|T], Сортування списків. SWI-Prolog (1/3) ins_sort([], []). % SWI-Prolog ins_sort([H|T],](https://present5.com/presentation/3/156597051_188552378.pdf-img/156597051_188552378.pdf-24.jpg)

![Сортування списків. SWI-Prolog (3/3) quick([], []). quick([H|T], L) : -split(T, H, L Сортування списків. SWI-Prolog (3/3) quick([], []). quick([H|T], L) : -split(T, H, L](https://present5.com/presentation/3/156597051_188552378.pdf-img/156597051_188552378.pdf-26.jpg)
III_102a_nondet_prolog.ppt
- Количество слайдов: 26
Чистий (недетермінований) Пролог
Синтаксис • Правила: B 0 : - B 1 , B 2 , …, Bn. (n >= 0). Усі Bi є атомами. (Правило можна інтерпретувати як імплікацію B 1 & B 2 & … &Bn B 0). При n = 0 (відсутня права частина правила) маємо “факт”. • Запит (може бути тільки один, у ньому відсутня ліва частина правила): : - C 1 , C 2 , …, Cm. (Можна інтерпретувати як кон'юнкцію C 1 & C 2 & … & Cm ). Чистий (недетермінований) Пролог 2
Логічна семантика • Логічна семантика Пролог-програм пов'язується із виявленням, чи є запит : - C 1 , C 2 , …, Cm (як формула-кон'юнкція C 1 & C 2 & … & Cm) логічним наслідком сукупності правил програми (як формул-імплікацій). При наявності у запиті змінних треба знайти, при яких значеннях цих змінних запит буде логічним наслідком сукупності правил програми. Чистий (недетермінований) Пролог 3
Операційна семантика Крок виконання. Нехай у поточному запиті : - C 1 , C 2 , …, Cm для деякого Ci та лівої частини B 0 деякого правила B 0 : - B 1 , B 2 , …, Bn існує НЗУ , тоді можна отримати (недетермінованість кроку виконання!) новий запит: : - C 1 , C 2 , …, Ci-1 , B 2 , …, Bn , Ci+1 , …, Cm . Можливі результати покрокового недетермінованого виконання: порожній запит тупикова ситуація, зацикленість. , Чистий (недетермінований) Пролог 4
Крок виконання. Дослідження з використанням математичної логіки (1/3) Нехай у поточному запиті : - C 1 , C 2 , …, Cm для деякого Ci та лівої частини B 0 деякого правила (B 0 : - B 1 , B 2 , …, Bn) існує НЗУ , тоді можна отримати (недетермінованість кроку виконання!) новий запит: : - C 1, C 2, …, Ci-1, B 2, …, Bn, Ci+1, …, Cm або : - (C 1, C 2, …, Ci-1, B 2, …, Bn, Ci+1, …, Cm). “Старий” запит — C 1&C 2&…&Cm. — НЗУ Ci та B 0 Його заперечення — ¬(C 1&C 2&…&Cm)= = (¬C 1 v¬C 2 v…v¬Ci-1 v ¬Ci+1 v…v ¬Cm Правило — B 1&B 2&…&Bn B 0 = ¬B 1 v¬B 2 v…v¬Bnv B 0 “Новий” запит — (C 1&C 2&…&Ci-1&B 2&…&Bn&Ci+1&…&Cm) , його заперечення — (¬C 1 v¬C 2 v…v¬Ci-1 v ¬B 1 v¬B 2 v…v¬Bnv ¬ Ci+1 v…v ¬Cm) Чистий (недетермінований) Пролог 5
Крок виконання. Дослідження з використанням математичної логіки (2/3) “Старий” запит —C 1&C 2&…&Cm. — НЗУ Ci та B 0 Його заперечення — ¬(C 1&C 2&…&Cm)= = ¬C 1 v¬C 2 v…v¬Ci-1 v ¬Ci+1 v…v ¬Cm 1 Правило — B 1&B 2&…&Bn B 0 = ¬B 1 v¬B 2 v…v¬Bnv B 0 2 “Новий” запит — (C 1&C 2&…&Ci-1&B 2&…&Bn&Ci+1&…&Cm) , його заперечення — (¬C 1 v¬C 2 v…v¬Ci-1 v ¬B 1 v¬B 2 v…v¬Bnv ¬Ci+1 v…v ¬Cm) 3 1 ¬C 1 v¬C 2 v…v¬Ci-1 v ¬Ci+1 v…v ¬Cm — НЗУ Ci та B 0 2 ¬B 1 v¬B 2 v…v¬Bnv B 0 ? 3 (¬C 1 v¬C 2 v…v¬Ci-1 v ¬B 1 v¬B 2 v…v¬Bnv ¬Ci+1 v…v ¬Cm) Чистий (недетермінований) Пролог 6
Крок виконання. Дослідження з використанням математичної логіки (1/3) 1 ¬C 1 v¬C 2 v…v¬Ci-1 v ¬Ci+1 v…v ¬Cm — НЗУ Ci та B 0 2 ¬B 1 v¬B 2 v…v¬Bnv B 0 3 (¬C 1 v¬C 2 v…v¬Ci-1 v ¬B 1 v¬B 2 v…v¬Bnv ¬Ci+1 v…v ¬Cm) (¬C 1 v¬C 2 v…v¬Ci-1¬B 1 v¬B 2 v…v¬Bnv ¬Ci+1 v…v ¬Cm) є бінарною резольвентою заперечення “старого” запиту (у вигляді диз'юнкту) та застосованого правила (у вигляді диз'юнкту). Чистий (недетермінований) Пролог 7
Операційна семантика. Можливі результати покрокового недетермінованого виконання – Можливі результати покрокового недетермінованого виконання: • порожній запит; • тупикова ситуація; • зацикленість. – Отримання порожнього запиту можна розглядати як успіх (у відповідності із трактуванням логічної семантики): кон'юнкція C 1 & C 2 & … & Cm у такому випадку є логічним наслідком сукупності правил програми (як формул-імплікацій). Чистий (недетермінований) Пролог 8
Приклад 1. Злиття списків (1/4) append([], U, U). (Правило 1) append([H|T], U, [H|V]): -append(T, U, V). (Правило 2) : -append([a, b], [b], Z). (Запит 1) Покрокове виконання: : - append([b], Z 1). (Правило 2 при H a, T [b], U [b], V Z 1, Z [a|Z 1]) : - append([], [b], Z 2). (Правило 2 при H b, T [], U [b], V Z 2, Z 1 [b|Z 2]) : - (Правило 1, Z 2 [b]) . Z=[a, b, b] Чистий (недетермінований) Пролог 9
Приклад 1. Злиття списків (2/4) append([], U, U). (Правило 1) append([H|T], U, [H|V]): -append(T, U, V). (Правило 2) : -append(X, Y, [a, b]). (Запит 2) П 1 : - (Правило 1, X [], Y [a, b]) . П 2 : - append(X 1, Y, [b]). (Правило 2, X [a|X 1]) П 2 П 1 : - (Правило 1, X 1 [], Y [b]) X=[a] . П 2 П 2 : - append(X 2, Y, []). (Правило 2, X 1 [b|X 2]) П 2 П 2 П 1 : - (Правило 1, X 2 [], Y [] X=[a, b] . : -append(X, Y, [a, b]). : - . : -append(X 1, Y, [b]). : - . : -append(X 2, Y, []). Чистий (недетермінований) Пролог 10 : - .
Приклад 1. Злиття списків (3/4) append([], U, U). append([H|T], U, [H|V]): -append(T, U, V). Чистий (недетермінований) Пролог 11
Приклад 1. Злиття списків (4/4) append([], U, U). append([H|T], U, [H|V]): -append(T, U, V). Чистий (недетермінований) Пролог 12
Приклад 2. Розстановка ферзів (1/4) Розстановка([1/Y 1, … , 8/Y 8]). Узагальн_розв([X/Y|T]): -Узагальн_розв(T), Елемент(Y, [1, 2, … , 8]), Не_загрожує(X/Y, T). Елемент(X, [X|T]). Елемент(X, [Y|T]) : -Елемент(X, T). Не_загрожує(X/Y, []). Не_загрожує(X/Y, [X 1/Y 1|T]) : - Не_загрожує(X/Y, T), Y<>Y 1, X-X 1<>Y-Y 1, X-X 1<>Y 1 -Y. Запит: : -Розстановка(L), Узагальн_розв(L). Чистий (недетермінований) Пролог 13
Приклад 2. Розстановка ферзів. (2/4). Розстановка 4 ферзів на дошці 4 4 member(X, [X 1|T]): -X=X 1; member(X, T). % Q 4 v 2 no_dang(_, []). no_dang(Z, [H|T]) : - Z=pos(X, Y), H=pos(X 1, Y 1), no_dang(Z, T), Y==Y 1, X-X 1==Y-Y 1, X-X 1==Y 1 -Y. p([pos(1, _), pos(2, _), pos(3, _), pos(4, _)]). % Розстановка r([]). % Узагальн_розв r([Z|T]): -r(T), Z=pos(_, Y), member(Y, [1, 2, 3, 4]), no_dang(Z, T). q(L): -p(L), r(L). Чистий (недетермінований) Пролог 14
Приклад 2. Розстановка ферзів. (3/4). Розстановка 4 ферзів на дошці 4 4 member(X, [X 1|T]): -X=X 1; member(X, T). % Q 4 v 1 no_dang(_, []). no_dang(Z, [H|T]) : - Z=pos(X, Y), H=pos(X 1, Y 1), no_dang(Z, T), Y==Y 1, X-X 1==Y-Y 1, X-X 1==Y 1 -Y. p([pos(1, _), pos(2, _), pos(3, _), pos(4, _)]). % Розстановка r([]). % Узагальн_розв r([Z|T]): -r(T), Z=pos(_, Y), member(Y, [1, 2, 3, 4]), no_dang(Z, T). q(L): -p(L), r(L), writeln(L), fail. Чистий (недетермінований) Пролог 15
Приклад 2. Розстановка ферзів. (4/4). Розстановка 8 ферзів на дошці 8 8 member(X, [X 1|T]): -X=X 1; member(X, T). no_dang(_, []). no_dang(Z, [H|T]): -Z=pos(X, Y), H=pos(X 1, Y 1), no_dang(Z, T), Y==Y 1, X-X 1==Y-Y 1, X-X 1==Y 1 -Y. pp([pos(1, _), pos(2, _), pos(3, _), pos(4, _), pos(5, _), pos(6, _), pos(7, _), pos(8, _)]). rr([Z|T]): -rr(T), Z=pos(_, Y), member(Y, [1, 2, 3, 4, 5, 6, 7, 8]), no_dang(Z, T). qq(L): -pp(L), rr(L), writeln(L), fail. Чистий (недетермінований) Пролог 16
Приклад 2. Розстановка ферзів. (4/4). Розстановка 8 ферзів на дошці 8 8 qq(L): -assertz(count(0)), pp(L), rr(L), count(Temp), retract(count(_)), New. Temp is Temp+1, assertz(count(New. Temp)), writeln(New. Temp), writeln(L), fail. Чистий (недетермінований) Пролог 17
member (X, L), append(L 1, L 2, UL). (PDC) member(X, [X|T]). member(X, [Y|T]) : - X<>Y, member(X, T). append([], U, U). append([H|T], U, [H|V]): -append(T, U, V). Чистий (недетермінований) Пролог 18
Родинні зв’язки Подружжя(F, M). Особа_ЧС(M). Особа_ЖС(F). Батьківство(P, Ch). Мати(X, Ch): -Батьківство(X, Ch), Особа_ЖС(X). Син(S, X): - Батьківство(X, S), Особа_ЧС(S). Брат(B, X): - B<>X, Батьківство(P, B), Батьківство(P, X), Особа_ЧС(B). Теща(ML, X): - Батьківство(ML, F), Подружжя(F, X), Особа_ЖС(ML). Дід(GF, X): - Онучка Племінниця Тітка Невістка Чистий (недетермінований) Пролог 19
Задача про Марію (1/3) 1) parent('Ганна', 'Іван'). 11 husband_mother 2) parent('Ганна', 'Лука'). Ганна 3) parent('Іван', 'Марія'). 1 4) parent('Оксана', 'Марія'). 5) woman('Оксана'). 9 marriage Оксана Іван 6) woman('Ганна'). 4 3 7) woman('Марія'). 8) mother(X, Y): -woman(X), parent(X, Y). Марія 9) marriage('Оксана', 'Іван'). 10) mother_in_law 1(X, Y): -woman(X), mother(X, Z), marriage(Y, Z). 11) husband_mother(X, Y): -woman(X), mother(X, Z), marriage(Y, Z). 12) q(X): - mother(M 1, X), mother(M 2, 'Марія'), husband_mother(M 1, M 2). Марія: ”Його мати є свекрухою моєї матері” Чистий (недетермінований) Пролог 20
Задача про Марію (2/3) 1) parent('Ганна', 'Іван'). 11 husband_mother 2) parent('Ганна', 'Лука'). Ганна 3) parent('Іван', 'Марія'). 1 4) parent('Оксана', 'Марія'). 5) woman('Оксана'). 9 marriage Оксана Іван 6) woman('Ганна'). 7) woman('Марія'). 4 3 8) mother(X, Y): -woman(X), parent(X, Y). 9) marriage('Оксана', 'Іван'). Марія 10) mother_in_law 1(X, Y): -woman(X), mother(X, Z), marriage(Y, Z). 11) husband_mother(X, Y): -woman(X), mother(X, Z), marriage(Y, Z). 12) q(X): - mother(M 1, X), mother(M 2, 'Марія'), husband_mother(M 1, M 2). Марія: ”Його мати є свекрухою моєї матері” Чистий (недетермінований) Пролог 21
Задача про Марію (3/3) 1) parent('Ганна', 'Іван'). 11 husband_mother 2) parent('Ганна', 'Лука'). Ганна 3) parent('Іван', 'Марія'). 1 2 4) parent('Оксана', 'Марія'). 5) woman('Оксана'). 9 marriage Оксана Іван Лука 6) woman('Ганна'). 4 3 7) woman('Марія'). 8) mother(X, Y): -woman(X), parent(X, Y). Марія 9) marriage('Оксана', 'Іван'). 10) mother_in_law 1(X, Y): -woman(X), mother(X, Z), marriage(Y, Z). 11) husband_mother(X, Y): -woman(X), mother(X, Z), marriage(Y, Z). 12) q(X): - mother(M 1, X), mother(M 2, 'Марія'), husband_mother(M 1, M 2). ? - trace, q(X). ? - gtrace, q(X). Чистий (недетермінований) Пролог 22
split (X, X 1, X 2), split 2 (X, X 1, X 2) split([], []). split([X], []). split([X, Y|T], [X|R 1}, [Y|R 2]): -split(T, R 1, R 2). split([], []). split([H|T], [H|R 1], R 2): -split 2(T, R 1, R 2). split 2([], []). split 2([H|T], R 1, [H|R 2]): -split(T, R 1, R 2). Чистий (недетермінований) Пролог 23
Сортування списків. SWI-Prolog (1/3) ins_sort([], []). % SWI-Prolog 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). 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). Чистий (недетермінований) Пролог 24
Сортування списків. SWI-Prolog (2/3) bubl(L, LSort) : -trans(L, L 1), !, bubl(L 1, LSort). bubl(L, L). trans([X, Y|Tail], [Y, X|Tail]) : - X>Y. trans([X|T], [X|T 1]) : - trans(T, T 1). bubl 2(L, LSort) : -trans(L, L 1), bubl 2(L 1, LSort). bubl 2(L, LR): - not(trans(L, _)), LR=L. До конкретизації trans([X, Y|Tail], [Y, X|Tail]) : - X>Y. змінних. . . trans([X|T], [X|T 1]) : - trans(T, T 1). bubl 3(L, LSort) : -trans(L, L 1), bubl 3(L 1, LSort). bubl 3(L, L): - not(trans(L, _)). trans([X, Y|Tail], [Y, X|Tail]) : - X>Y. trans([X|T], [X|T 1]) : - trans(T, T 1). Чистий (недетермінований) Пролог 25
Сортування списків. SWI-Prolog (3/3) quick([], []). quick([H|T], L) : -split(T, H, L 1, L 2), quick(L 1, L 1 Sort), quick(L 2, L 2 Sort), append(L 1 Sort, [H|L 2 Sort], L). split([], _, []). split([H|T], X, [H|L 1], L 2): -H=

