|
Предикат Sumlist
Предикат sumlist(L,Sum) определяет сумму элементов числового списка. Схема отношения этого предиката имеет вид:
sumlist(<список>,<целочисленный терм>).
Декларативное описание предиката sumlist формулируется следующим образом:
Сумма элементов пустого списка равна нулю.
Если исходный список состоит L из головы Н и хвоста Т, то сумма элементов списка L равна сумме элементов хвоста списка T плюс Н.
Процедура sumlist(L,Sum) состоит из двух правил:
sumlist([],0). %Пр1
sumlist([H|T],Sum):¾ sumlist(T,SumT),Sum is SumT+H. %Пр2
Рассмотрим пример запроса к процедуре sumlist.
? ¾ sumlist([1,2,3,4],S).
ТР: sumlist([1,2,3,4],S).
Шаг 1: ТЦ: sumlist([1,2,3,4],S).
Пр1: [1,2,3,4]=[] Þ неуспех (списки разной длины)
Пр2: sumlist([1|[2,3,4]],S):¾ sumlist([2,3,4],ST1), S is ST1+1.
ТР: sumlist([2,3,4],ST1),S is ST1+1.
Шаг 2: ТЦ: sumlist([2,3,4]).
Пр1: [2,3,4]=[] Þ неуспех (списки разной длины)
Пр2: sumlist([2|[3,4]],ST1):¾ sumlist([3,4],ST2),ST1 is ST2+2.
ТР: sumlist([3,4],ST2),ST1 is ST2+2, S is ST1+1.
Шаг 3: ТЦ: sumlist([3,4],ST2).
Пр1: [3,4]=[] Þ неуспех (списки разной длины)
Пр2: sumlist([3|[4]],ST2):¾ sumlist([4],ST3) ,ST2 is ST3+3.
ТР: sumlist([4],ST3),ST2 is ST3+3,ST1 is ST2+2, S is ST1+1.
Шаг 4: ТЦ: sumlist([4],ST3).
Пр1: [4]=[] Þ неуспех (списки разной длины)
Пр2: sumlist([4|[]],ST4):¾ sumlist([],ST4) ,ST3 is ST4+4.
ТР: sumlist([],ST4),ST3 is ST4+4,ST2 is ST3+3,ST1 is ST2+2, S is ST1+1.
Шаг 5: ТЦ: sumlist([],ST4).
Пр1: []=[]Þ успех при подстановке {ST4=0}
ТР: ST3 is 0+4,ST2 is ST3+2,ST1 is ST2+2, S is ST1+1.
Шаг 6: ТЦ: ST3 is 0+4. Þ успех при подстановке {ST3=4}
ТР: ST2 is 4+3,ST1 is ST2+2, S is ST1+1.
Шаг 7: ТЦ: ST2 is 4+3. Þ успех при подстановке {ST2=7}
ТР: ST1 is 7+2, S is ST1+1.
Шаг 8: ТЦ: ST1 is 7+2. Þ успех при подстановке {ST1=9}
ТР: S is 9+1.
Шаг 8: ТЦ: S is 9+1. Þуспех при подстановке {S=10}
ТР: ÿ¾успех.
Результат вычисления запроса sumlist([1,2,3,4],S). Þуспех при подстановке {S=10}.
Предикат Delrepeat
Предикат delrepeat (L,LS) истинен, если список получается из списка S путем удаления всех повторений элементов. Схема отношения этого предиката имеет вид:
delrepeat(<список>,<список>).
Удаление повторений элементов выполняется процедурой delrepeat с накоплением списка, состоящей из четырех предложений и содержит дополнительный предикат delrep:
delrepeat(S,SF):-delrep(S,[],SF). % Пр1
delrep([],S,S). % Пр2
delrep([H|T],S1,SF):-member(H,T),!,delrep(T,S1,SF). % Пр3
|