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

4.2.3 Применение append

Процедуру арреnd можно использовать для поиска комбинаций элементов. Например можно выделить списки слева и справа от элемента

?-append(L, [3|R], [1, 2, 3, 4, 5]). L=[1, 2] R=[4, 5]

Можно удалить все, что следует за данным элементом и этот элемент тоже:

?-L1=[a, b, c, d, e], append(L2, [c|_], L1). L1=[a, b, c, d, e] L2=[a, b]

Можно определить процедуру ,выделяющую последний элемент в списке:

last(X, L):-append(_, [X], L).

4.2.4 reverse

Процедура reverse обращает список.

  1. Пустой список после обращения - пустой.

    reverse([], []).

  2. Обратить список [X|L1] и получить список L2 можно, если обратить список L1 в L3 и в хвост ему добавить X

    reverse([X|L1], L2):-reverse(L1, L3), append( L3, [X], L2).

  3. reverse([X|L1], L2):-reverse(L1, L3), append( L3, [X], L2).

4.2.5 Длина списка

Можно, используя рекурсивный вызов, легко посчитать длину списка:

length([], 0). length([X|L], N):-length(L, M), N is M+1.

?-length([a, b, c], N). N=3

4.2.6 remove

Удаление элемента X из списка L можно запрограммированть в виде отношения remove(X, L, L1). где L1 совпадает со списком L, у которого удален элемент X. Имеем два случая:

  • Если X является головой списка, тогда результатом удаления будет хвост этого списка.

  • Если X находится в хвосте списка, тогда его нужно удалить оттуда.

remove(X, [X | Tail], Tail). remove(X, [Y | Tail], [Y | Tail1]):-remove(X, Tail, Tail1).

Отношение remove по природе своей недетерминировано. Если в списке встречается несколько вхождений элемента X, то remove сможет исключить их все при помощи возвратов. Конечно, вычисление по каждой альтернативе будет удалять лишь одно вхождение X, оставляя остальные в неприкосновенности. Например:

?-remove(a, [a, b, a, a], L). L = [b,a,a]; L = [a,b,a]; L = [a,b,a]; no

При попытке исключить элемент, не содержащийся в списке, отношение remove потерпит неудачу.

Отношение remove можно использовать в обратном направлении для того, чтобы добавлять элементы в список, вставляя их в произвольные места. Например, если мы хотим во все возможные места списка [1,2,3] вставить атом a, то мы можем это сделать, задав вопрос: "Каким должен быть список L, чтобы после удаления из него элемента a получился список [1,2,3]?"

?-remove(a, L, [1,2,3]). L = [a,1,2,3]; L = [1,a,2,3]; L = [1,2,a,3]; L = [1,2,3,a]; no