|
НАЗАД
Предикат first. Предикат last. Предикат next.
Предикат first(X,Y) определяет, является ли терм Х первым элементом списка Y. Схема отношения этого предиката имеет вид:
first(<терм>,<список>).
Декларативное описание предиката first формулируется следующим образом:
Терм X является головой списка Y, если терм Х сопоставим с первым элементом списка Y.
Процедура first(X,Y) состоит из факта:
first(X,[X|_]).
Предикат last
Предикат last(X,Y) определяет, является ли терм Х последним элементом списка Y. Схема отношения этого предиката имеет вид:
last(<терм>,<список>).
Декларативное описание предиката last формулируется следующим образом:
Если список Y включает только один элемент, и этот элемент сопоставим с термом X, то предикат last(X,Y) истинен. Если список Y можно разделить на голову и непустой хвост и терм Х является последним элементом хвоста списка Y, то предикат last(X,Y) истинен. Если терм Х отсутствует в списке Y, то значение предиката last(X,Y) ¾ложь.
Процедура last(X,Y) состоит из двух правил:
last(X,[Y|[]]):¾X=Y. % Пр1
last(X,[Z|T]):¾last(X,T). % Пр2
Рассмотрим пример запроса к процедуре last.
? ¾ last(4,[1,2,3,4]).
ТР: last(4,[1,2,3,4]).
Шаг 1: ТЦ: last(4,[1,2,3,4]).
Пр1: last(4,[1|[2,3,4]]) Þ неуспех ([2,3,4] не сопоставим с [])
Пр2: last(4,[1|[2,3,4]]):¾ last(4,[2,3,4]).
ТР: last(4,[2,3,4]).
Шаг 2: ТЦ: last(4,[2,3,4]).
Пр1: last(4,[2|[3,4]]) Þ неуспех ([3,4] не сопоставим с [])
Пр2: last(4,[2|[3,4]]):¾ last(4,[3,4]).
ТР: last(4,[3,4]).
Шаг 3: ТЦ: last(4,[3,4]).
Пр1: last(4,[3|[4]]) Þ неуспех ([4] несопоставим с [])
ТР: last(4,[4]).
Шаг 4: ТЦ: last(4,[4]).
Пр1: last(4,[4|[]]) Þ успех ([] сопоставим с [])
Переход на шаг 3. Истинность ТЦ на шаге 4 влечет истинность цели на шаге 3 last(4,[3,4]).
Переход на шаг 2. Истинность ТЦ на шаге 3 влечет истинность цели на шаге 2 last(4,[2,3,4]).
Переход на шаг 1. Истинность ТЦ на шаге 2 влечет истинность цели на шаге 1 last(4,[1,2,3,4]).
ТР:.
Результат вычисления запроса last(4,[1,2,3,4]) Þ успех.
Предикат next.
Предикат next(X,Y,L) принимает значение “истина”, если терм Х непосредственно следует за термом Y в списке L. Схема отношения этого предиката имеет вид:
next(<терм>,<терм>,<список>).
Декларативное описание предиката next формулируется следующим образом:
Если в списке L первые два элемента ¾ X и Y, то предикат next(X,Y,L) истинен, иначе предикат next(X,Y,L) истинен, если термы Х и Y являются первыми элементами хвоста списка L.
Процедура next(X,Y,L) состоит из двух правил:
next(X,Y,[X,Y|L]). % Пр1
next(X,Y,[U|L]):¾next(X,Y,L). % Пр2
Рассмотрим пример запроса к процедуре next(X,Y,L).
? ¾ next(2,3,[1,2,3,4]).
ТР: next(2,3,[1,2,3,4]).
Шаг 1: ТЦ: next(2,3,[1,2,3,4]).
Пр1: next(2,3,[1,2|[3,4]]) Þ неуспех (2 не сопоставимо с 1, 3 не сопоставимо с 2)
Пр2: next(2,3,[1|[2,3,4]):¾ next(2,3,[2,3,4]).
ТР: next(2,3,[2,3,4]).
Шаг 2: ТЦ: next(2,3,[2,3|[3,4]).
Пр1: next(2,3,[2,3|L)(4,[2|[3,4]]) Þ успех (2 сопоставимо с 2, 3 сопоставимо с 3)
ТР:
Переход на шаг 1, Истинность ТЦ на шаге 2 влечет истинность цели на шаге 1 next(2,3,[1,2,3,4]).
Результат вычисления запроса: next(2,3,[1,2,3,4]). Þ успех.
Программист может предотвратить ошибки Пролога, проверив тип аргумента предиката с помощью следующих встроенных в Пролог-систему предикатов:
НАЗАД
|