|
НАЗАД
Декларативное описание предиката delrep формулируется следующим образом:
если первый аргумент есть пустой список, то второй и третий аргументы представляют собой один и тот же список;
если первый аргумент¾ непустой список [H|Хs], и голова Н принадлежит хвосту списка T, то процедура delrep рекурсивно вызывается с аргументами T и S1; при этом элемент H не включается в накапливающийся список S1;
если первый аргумент¾ непустой список [H|Хs], и голова Н не принадлежит хвосту списка 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]). Þуспех
ТР: 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]). Þуспех
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]}
НАЗАД
|