|
Принадлежность списку (предикат member)
Предикат member(X,Y) определяет, принадлежит ли терм Х списку Y. Схема отношения этого предиката имеет вид:
member(<терм>,<список>).
Декларативное описание предиката member формулируется следующим образом:
«Любой терм X принадлежит списку Y, если терм Х является головой списка Y или Х принадлежит хвосту списка Y». В этих двух случаях значение предиката member(X,Y) будет истинным.
Процедура member(X,Y) состоит из двух правил:
member(X,[X|_]). %Пр.1
member(X,[_|T]):¾ member(X,T). %Пр2.
Рассмотрим пример запроса к процедуре 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]). Þ успех.
Сцепление (конкатенация). Предикат append
Для сцепления списков мы определим отношение
append( LI, L2, L3)
Здесь L1 и L2 - два списка, a L3 - список, получаемый при их сцеплении. Например,
append ([a,b],[c,d],[a,b,c,d] )
истинно, а
append ([a,b],[c,d],[a,b,a,c,d] )
ложно. Определение отношения append, как и раньше, содержит два случая в зависимости от вида первого аргумента L1:
(1) Если первый аргумент пуст, тогда второй и третий аргументы представляют собой один и тот же список (назовем его L), что выражается в виде следующего прологовского факта:
append( [], L, L ).
(2) Если первый аргумент отношения конк не пуст, то он имеет голову и хвост и выглядит так:
[X | L1]
Сформулируем декларативное описание предиката append следующим образом:
При присоединении к пустому списку любого списка результирующий список будет идентичен присоединенному списку. Если первый список не пуст, то он разделяется на голову X и хвост L1, а результирующий список L =[X|L3] , где L3 результат присоединения списка L2 к списку L1.
Процедура append(L1,L2,L3) состоит из двух правил:
append([],L,L). % Пр.1
append([X|L1],L2,[X|L3]):¾append(L1,L2,L3). % Пр.2
Рассмотрим пример запроса к процедуре append(X,Y,L).
? ¾ append([2,3],[1,4],L3).
ТР: append([2,3],[1,4],L3).
|