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

5.4.11. Предикат sumlist.

Предикат sumlist(L,Sum) определяет сумму элементов числового списка. Схема отношения этого предиката имеет вид:

sumlist(<список>,<целочисленный терм>).

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

  • Сумма элементов пустого списка равна нулю.

  • Если исходный список состоит L из головы Н и хвоста Т, то сумма элементов списка L равна сумме элементов хвоста списка T плюс Н.

Процедура sumlist(L,Sum) состоит из двух правил:

sumlist([],0).

sumlist([H|T],Sum): sumlist(T,SumT),Sum is SumT+H.

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

5.4.12. Предикат delrepeat.

Предикат delrepeat (L,LS) истинен, если список получается из списка S путем удаления всех повторений элементов. Схема отношения этого предиката имеет вид:

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

Удаление повторений элементов выполняется процедурой delrepeat с накоплением списка, состоящей из четырех предложений и содержит дополнительный предикат delrep:

delrepeat(S,SF):-delrep(S,[],SF).

delrep([],S,S).

delrep([H|T],S1,SF):-member(H,T),!,delrep(T,S1,SF).

delrep([H|T],S1,SF):-append(S1,[H],S2),delrep(T,S2,SF).

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

  • если первый аргумент есть пустой список, то второй и третий аргументы представляют собой один и тот же список;

  • если первый аргумент непустой список [Hs], и голова Н принадлежит хвосту списка T, то процедура delrep рекурсивно вызывается с аргументами T и S1; при этом элемент H не включается в накапливающийся список S1;

  • если первый аргумент непустой список [Hs], и голова Н не принадлежит хвосту списка T, то элемент H включается в накапливающийся список S1 и получается список S2. Затем процедура delrep рекурсивно вызывается с аргументами T и S2.

Процедура delrepeat выполняется следующим образом:

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

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

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

Пр1: delrepeat ([1,1,2,3,2,4,3],S): delrep([1,1,2,3,2,4,3],[],S).  успех

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

Шаг 2: ТЦ: delrep([1,1,2,3,2,4,3],[],S)

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

Пр3:

delrep([1|[1,2,3,2,4,3]],[],S):member(1,[1,2,3,2,4,3]),delrep([1,2,3,2,4,3],[],S).

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

Шаг 3: ТЦ: member(1,[1,2,3,2,4,3]).  успех1

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

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

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

Пр3:

delrep([1|[2,3,2,4,3]],[],S):member(1,[2,3,2,4,3]),delrep([2,3,2,4,3],[],S).

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

Шаг 5: ТЦ: member(1,[2,3,2,4,3]).  неуспех

Возврат.

Пр4:

delrep([1|[2,3,2,4,3]],[],S):append([],[1],S2]),delrep([2,3,2,4,3],S2,S).

ТР: append([],[1],S2]),delrep([2,3,2,4,3],S2,S).

Шаг 6: ТЦ: append([],[1],S2]).  успех2

S2=[1]

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

Шаг 7: ТЦ: delrep([2,3,2,4,3],[1],S)

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

Пр3:

delrep([2|[3,2,4,3]],[],S):member(2,[3,2,4,3]),delrep([3,2,4,3],[1],S).

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

Шаг 8: ТЦ: member(2,[3,2,4,3]).  успех

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

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

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

Пр3:

delrep([3|[2,4,3]],[1],S):member(3,[2,4,3]),delrep(2,4,3],[1],S).

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

Шаг 10: ТЦ: member(3,[2,4,3]).  успех

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

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

Пр3:

delrep([2|[4,3]],[],S):member(2,[4,3]),delrep([4,3],[1],S).

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

Шаг 12: ТЦ: member(2,[4,3]).  неуспех

Возврат.

Пр4:

delrep([2|[4,3]],[],S):append([1],[2],S2]),delrep([4,3],S2,S).

ТР: append([1],[2],S2]),delrep([4,3],S2,S).

Шаг 13: ТЦ: append([1],[2],S2]).  успех

S2=[1,2]

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

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

Пр3:

delrep([4|[3]],[1,2],S):member(4,[3]),delrep([3],[1,2],S).

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

Шаг 14: ТЦ: member(2,[4,3]).  неуспех

Возврат.

Пр4:

delrep([4|[3]],[],S):append([1,2],[4],S2]),delrep([3],S2,S).

Шаг 15: ТЦ: append([1,2],[4],S2]).  успех

S2=[1,2,4]

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

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

Пр3:

delrep([3|[]],[1,2,4],S):member(3,[]),delrep([],[1,2,4],S).

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

Шаг 16: ТЦ: member(3,[]).  неуспех

Возврат.

Пр4:

delrep([3|[]],[1,2,4],S):append([1,2,4],[3],S2]),delrep([],S2,S).

Шаг 17:ТЦ: append([1,2,4],[3],S2]).  успех

S2=[1,2,4,3]

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

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

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

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

ТР: .

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