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

next(X,Y,[U|L]):next(X,Y,L).

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

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

Предикат append(L1,L2,L3) принимает значение “истина”, если список L3 получается путем приписывания все элементов списка L2 после последнего элемента списка L1, как показано на рисунке 5.1. Схема отношения этого предиката имеет вид:

append(<список>,<список,<список>).

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

При присоединении к пустому списку любого списка результирующий список будет идентичен присоединенному списку. Если первый список не пуст, то он разделяется на голову X и хвост T1, а результирующий список L3 =[X|T3] , где Т3 результат присоединения списка L2 к списку Т1.

Процедура append(L1,L2,L3) состоит из двух правил:

append([],L,L).

append([X|T1],L2,[X|T3]):append(T1,L2,T3).

Рассмотрим пример запроса к процедуре append(X,Y,L).

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

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

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

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

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

где L3=[2|T31].

ТР: append([3],[1,4],T31).

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

Пр1: [3] не сопоставим [] неуспех

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

где T31=[3|T32].

Шаг 3: ТЦ: append([],[1,4],T32).

Пр1: [] сопоставим [] успех

Получается подстановка {T32=[1,4]}.

Переход на шаг 2, и конкретизация переменной T31 значением [3|[1,4]] или [3,1,4].

Переход на шаг 1, и конкретизация переменной L3 значением [2|[3,1,4]] или [2,3,1,4].

ТР: .

Результат вычисления запроса: append([2,3],[1,4],L3). успех при подстановке {L3=[2,3,1,4]}.

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

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

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

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

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

add(X,Y,[X|Y]).