Основные понятия Пролога. Рекурсия на Прологе

Содержание

Слайд 2

Предложения

Факты
Правила
Вопросы
Общий вид:
A :- B1, ... , Bn.

Предложения Факты Правила Вопросы Общий вид: A :- B1, ... , Bn.

Слайд 3

Факты и правила

Пример факта:
мама(«Наташа», «Даша»).
Пример правил:
бабушка(X,Y) :- мама(X,Z), мама(Z,Y).
бабушка(X,Y) :- мама(X,Z), папа(Z,Y).

процедура

константа,

Факты и правила Пример факта: мама(«Наташа», «Даша»). Пример правил: бабушка(X,Y) :- мама(X,Z),
переменная, составной объект

Слайд 4

Переменные

Неявно связаны квантором всеобщности
Не поддерживается механизм деструктивного присваивания
Идентификатор указывает не на адрес

Переменные Неявно связаны квантором всеобщности Не поддерживается механизм деструктивного присваивания Идентификатор указывает
ячейки памяти, а на объект
Свободные (неконкретизированные) и связанные (конкретизированные)
Область определения – одно предложение
Все анонимные переменные – отдельные объекты

Слайд 5

Вопросы. Вычисление цели

мама("Наташа","Даша").
мама("Даша","Маша").
goal
%мама("Наташа","Даша").
%мама("Наташа","Маша").
%мама(X, "Даша").
%мама("Наташа",X).
%мама(X,Y).
%мама(X,_).
%мама(_,_).

Возможные результаты работы программы:
Цель достигнута (Yes): либо значения переменных,

Вопросы. Вычисление цели мама("Наташа","Даша"). мама("Даша","Маша"). goal %мама("Наташа","Даша"). %мама("Наташа","Маша"). %мама(X, "Даша"). %мама("Наташа",X). %мама(X,Y).
либо No solutions
Цель не достигнута (No): либо отношение не выполняется, либо нет достаточной информации

Слайд 6

Вычисление цели

мама("Наташа","Даша").
мама("Даша","Маша").
бабушка(X,Y) :- мама(X,Z),
мама(Z,Y).
goal
бабушка("Наташа",X).

Вычисление цели мама("Наташа","Даша"). мама("Даша","Маша"). бабушка(X,Y) :- мама(X,Z), мама(Z,Y). goal бабушка("Наташа",X).

Слайд 7

Нахождение максимума из двух чисел

max(X,Y,X) :-
X>Y. /* если первое число больше

Нахождение максимума из двух чисел max(X,Y,X) :- X>Y. /* если первое число
второго,
то первое число - максимум */
max(X,Y,Y) :-
X то второе число - максимум */
max(X,Y,Y) :-
X=Y. /* если первое число равно второму,
возьмем в качестве максимума
второе число */

Слайд 8

Нахождение максимума из двух чисел - 2

max(X,Y,X):-
X>Y. /* если первое число

Нахождение максимума из двух чисел - 2 max(X,Y,X):- X>Y. /* если первое
больше второго,
то первое число - максимум */
max(X,Y,Y):-
X<=Y./* если первое число меньше или равно
второму, возьмем в качестве максимума второе число */

Слайд 9

Нахождение максимума из двух чисел (отсечение)

max2(X,Y,X):-
X>Y,!./* если первое число больше второго,

Нахождение максимума из двух чисел (отсечение) max2(X,Y,X):- X>Y,!./* если первое число больше

то первое число - максимум */
max2(_,Y,Y). /* в противном случае максимумом будет второе число */

Слайд 10

Условия

S:-
<условие>,!,P.
S :-
P2.
if <условие> then P else P2

Условия S:- ,!,P. S :- P2. if then P else P2

Слайд 11

Нахождение максимума из трех чисел

max3a(X,Y,Z,X):-
X>=Y,X>=Z.
/* если первое число больше

Нахождение максимума из трех чисел max3a(X,Y,Z,X):- X>=Y,X>=Z. /* если первое число больше
или равно второму
и третьему, то первое число - максимум */
max3a(X,Y,Z,Y):-
Y>=X,Y>=Z.
/* если второе число больше или равно первому
и третьему, то второе число является
максимумом */
max3a(X,Y,Z,Z):-
Z>=X,Z>=Y.
/* если третье число больше или равно первому
и второму, то максимум - это третье число */

Слайд 12

Нахождение максимума из трех чисел (отсечение)

max3b(X,Y,Z,X):-
X>Y,X>Z,!.
/* если первое

Нахождение максимума из трех чисел (отсечение) max3b(X,Y,Z,X):- X>Y,X>Z,!. /* если первое число
число больше второго и третьего,
то первое число - максимум */
max3b(_,Y,Z,Y):-
Y>=Z,!.
/* иначе, если второе число больше третьего,
то второе число является максимумом */
max3b(_,_,Z,Z).
/* иначе максимум - это третье число */

Слайд 13

Нахождение максимума из трех чисел (с помощью max2)

max3(X,Y,Z,M):-
max2(X,Y,XY), /* XY -

Нахождение максимума из трех чисел (с помощью max2) max3(X,Y,Z,M):- max2(X,Y,XY), /* XY
максимум из X и Y */
max2(XY,Z,M). /* M - максимум из XY и Z */

Слайд 14

Рекурсия на Прологе

Рекурсия на Прологе

Слайд 15

Программа «Родственники»

предок(Предок,Потомок):-
родитель(Предок,Потомок).
/* предком является родитель */
предок(Предок,Потомок):-
родитель(Предок,Человек),
предок(Человек,Потомок).

Программа «Родственники» предок(Предок,Потомок):- родитель(Предок,Потомок). /* предком является родитель */ предок(Предок,Потомок):- родитель(Предок,Человек), предок(Человек,Потомок).
/* предком является родитель предка */

Слайд 16

Правило, реализующее шаг рекурсии

<имя определяемого предиката>:-
[<подцели>],
[<условие выхода из рекурсии>],
[<подцели>],

Правило, реализующее шаг рекурсии :- [ ], [ ], [ ], , [ ].
<имя определяемого предиката>,
[<подцели>].

Слайд 17

Программа «Факториал»

1!=1 /* факториал единицы равен единице */
N!=(N-1)!*N /* для того, чтобы

Программа «Факториал» 1!=1 /* факториал единицы равен единице */ N!=(N-1)!*N /* для
вычислить факториал некоторого числа, нужно вычислить факториал числа на единицу меньшего и умножить его на исходное число */

Слайд 18

Факториал

fact(1,1). /* факториал единицы равен единице */
fact(N,F):-
N1=N-1,
fact(N1,F1), /* F1 равен

Факториал fact(1,1). /* факториал единицы равен единице */ fact(N,F):- N1=N-1, fact(N1,F1), /*
факториалу числа
на единицу меньшего исходного
числа */
F=F1*N. /* факториал исходного числа равен
произведению F1 на само число */

Слайд 19

Факториал

fact(1,1). /* факториал единицы равен единице */
fact(N,F):-
N>1, /* убедимся, что

Факториал fact(1,1). /* факториал единицы равен единице */ fact(N,F):- N>1, /* убедимся,
число больше единицы */
N1=N-1,
fact(N1,F1), /* F1 равен факториалу числа,
на единицу меньшего исходного
числа */
F=F1*N. /* факториал исходного числа равен
произведению F1 на само число */

Слайд 20

Факториал

fact(1,1):-!. /* условие останова рекурсии */
fact(N,F):-
N1=N-1,
fact(N1,F1), /* F1 равен факториалу

Факториал fact(1,1):-!. /* условие останова рекурсии */ fact(N,F):- N1=N-1, fact(N1,F1), /* F1
числа,
на единицу меньшего исходного
числа */
F=F1*N. /* факториал исходного числа равен
произведению F1 на само число */

Слайд 21

Факториал Правосторонняя рекурсия

fact2(N,F,N,F):-!. /* останавливаем рекурсию, когда третий
аргумент равен первому*/
fact2(N,F,N1,F1):-
N2=N1+1,

Факториал Правосторонняя рекурсия fact2(N,F,N,F):-!. /* останавливаем рекурсию, когда третий аргумент равен первому*/
/* N2 - следующее натуральное число
после числа N1 */
F2=F1*N2, /* F2 - факториал N2 */
fact2(N,F,N2,F2).
/* рекурсивный вызов с новым натуральным
числом N2 и соответствующим ему
посчитанным факториалом F2 */

Слайд 22

Факториал

factM(N,F):-
fact2(N,F,1,1). /* вызываем предикат с уже
заданными начальными
значениями

Факториал factM(N,F):- fact2(N,F,1,1). /* вызываем предикат с уже заданными начальными значениями */
*/

Слайд 23

Цикл с предусловием

w :-
<условие>, p, w.
w :- !.
while <условие> do

Цикл с предусловием w :- , p, w. w :- !. while do P
P