Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Conspekt.doc
Скачиваний:
11
Добавлен:
31.08.2019
Размер:
1.39 Mб
Скачать

5.5 Предикаты управления возвратом

Пусть требуется самим определить предикат abs :

x >= 0, y = x;

abs(x,y) =

x < 0, y = -x;

abs(X,Y) :- X >= 0 , Y is X ; Y is -X.

?- abs(5,Y)

Y=5

yes

ответ положителен т.к.

?- abs(-5,Y) такая запись предиката

Y=5 определяет действия во

yes всех случаях, когда не

сработала 1-ая часть.

?- abs(5,-5)

yes.

Чтобы  этого не было определим предикат abs с.о.:

abs(X,Y) :- X >= 0, Y is X.

X < 0, Y is -X.

Это же правило м.описать более компактно, воспользовавшись предикатом отсечения cut (в Arity Prolog ему соответствует знак "!" ). Предикат отсечения - ! - запрещает дальнейший выбор каких-либо альтернатив.

abs(X,Y) :- X > 0, ! , Y is X ; Y is -X.

Чтобы пояснить принцип действия определенного нами предиката abs и роль в нём предиката отсечения, построим дерево решения.

abs(5,Y)

5 > 0, !, Y is 5 Y is -5

!,Y is 5 - Показана отсеченная точка выбора

Предикат отсечения ! выполняется всегда и в результате его выполнения - отсекаются все оставшиеся точки выбора .

Y is 5

Y = 5

5.6 Программа вычисления квадратного корня

Рекурсивная формула для вычисления квадратного корня:

;

Пример: = = 2;

Нужно задать начальное значение у - приближение. Y0=1. Это значит, что уточнение осуществляется до тех пор, пока

<E

1).кв_корень(0,X) :- 0 is X, !. -Если X=0, то другие альтернативы работать не будут.

2).кв_корень(X,Корень) :- X<0, !, fail.

3).кв_корень(X,Корень) :- положит_кв_корень(X,ПКорень,1),

( Корень is ПКорень;

Корень is -ПКорень).

Здесь необходимо ввести понятие группы. Группа - последовательность версий ( вариантов), разделенных ";" и заключенных в круглые скобки.

4).положит_кв_корень(X,ПКорень,Приближение):-

Новый_корень =(Приближение + X/Приближение)/2,

( abs(Новый_корень - Приближение) < 1.0e-6,

ПКорень is Новый_корень, ! ;

положит_кв_корень(X,ПКорень,Новый_корень) ).

Здесь тоже используется группа, а т.к. группа представляет собой тело правила без имени, то вместо п.4 м.б. написать:

4*).положит_кв_корень(X,Корень,Приближение) :-

Новый_корень =(Приближение + X/Приближение)/2,

возм_дальн_вычисл(X,Корень,Приближение,Нов_корень)

5*).возм_дальн_вычисл(X,Корень,Приближение,Нов_корень)

Для того, чтобы не вводить новый предикат мы и используем группу. Кроме того, использован предикат =, который определяется следующим образом:

A=B <==> равно(A,B),

где равно(А,В):- A is B.

ЗАМЕЧАНИЯ:

Предикат (1) записан для того, чтобы расширить область применения прг.(вместо X можно подставлять выражение.

Предикат (2) - неудача при X < 0.

Предикат (3) - осуществляет вычисление.

Областью действия предиката отсечения является то имя в котором он определен. Фразы 1,2,3 нельзя поменять местами.

Дадим новое определение v :

sqrt(X,Koren):-

X > 0, !, positiv_sqrt(X,PKoren),

( Koren is PKoren ;

Koren is -PKoren );

X =:= 0, Koren is 0.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]