Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
пособие_Пролог_часть1.doc
Скачиваний:
40
Добавлен:
13.11.2019
Размер:
1.36 Mб
Скачать

5.4.2. Предикат member.

Предикат member(X,Y) определяет, принадлежит ли терм Х списку Y. Схема отношения этого предиката имеет вид:

member(<терм>,<список>).

Декларативное описание предиката member формулируется следующим образом:

Любой терм X принадлежит списку Y, если терм Х является головой списка Y или Х принадлежит хвосту списка Y. В этих двух случаях значение предиката member(X,Y) будет истинным.

Процедура member(X,Y) состоит из двух правил:

member(X,[X|_]).

member(X,[_|T]): member(X,T).

Рассмотрим пример запроса к процедуре member.

?  member(3,[1,2,3,4]).

ТР: member(3,[1,2,3,4]).

Шаг 1: ТЦ: member(3,[1,2,3,4]).

Пр1: member(3,[1|[2,3,4]])  неуспех (3 не сопоставимо с 1)

Пр2: member(3,[1|[2,3,4]]): member(3,[2,3,4]).

ТР: member(3,[2,3,4]).

Шаг 2: ТЦ: member(3,[2,3,4]).

Пр1: member(3,[2|[3,4]])  неуспех (3 не сопоставимо с 2)

Пр2: member(3,[2|[3,4]]): member(3,[3,4]).

ТР: member(3,[3,4]).

Шаг 3: ТЦ: member(3,[3,4]).

Пр1: member(3,[3|[4]])  успех (3 сопоставимо с 3)

Переход на шаг 2. Истинность ТЦ на шаге 3 влечет истинность цели на шаге 2 member(3,[2,3,4]).

Переход на шаг 1. Истинность ТЦ на шаге 2 влечет истинность цели на шаге 1 member(3,[1,2,3,4]).

ТР:  успех.

Результат вычисления запроса member(3,[1,2,3,4]).  успех.

      1. Предикат first.

Предикат first(X,Y) определяет, является ли терм Х первым элементом списка Y. Схема отношения этого предиката имеет вид:

first(<терм>,<список>).

Декларативное описание предиката first формулируется следующим образом: Терм X является головой списка Y, если терм Х сопоставим с первым элементом списка Y.

Процедура first(X,Y) состоит из факта:

first(X,[X|_]).

      1. Предикат 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.

last(X,[Z|T]):last(X,T).

Рассмотрим пример запроса к процедуре 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])  успех.