Списки в Прологе – 4

5.  Удалите данный элемент из списка

Предикат имеет три аргумента – удаляемый элемент, список, из которого удаляем, и список после удаления.

Domains

intlist = integer*

Predicates

select(integer, intlist, intlist)

Clauses

select(X, [X|L], L).

select(X, [Y|L], [Y|R]) :- select(X, L, R).

Goal

select(1,[4,2,1,3],L).

Если данное число совпадает с головой списка, то результатом удаления будет его хвост. Иначе присоединяем голову списка к результату (её удалять не надо) и ищем элемент, который необходимо удалить, в хвосте.

Этому предикату можно найти три различных применения.

Во-первых, прямое применение. Так на запрос select(1, [4,2,1,3], L) (какой список получится после удаления единицы из данного списка?) Пролог выдаст ответ:

L = [4, 2, 3]

Во-вторых, его можно использовать для извлечения элементов из списка. Так на запрос select(X, [1, 2, 3], L) (какие Х можно удалить из данного списка и что при этом получится?) ответом будет:

X = 1, L = [2, 3]

X = 2, L = [1, 3]

X = 3, L = [1, 2]

В-третьих, его же можно использовать и для вставки элемента в список.

Так результат запроса select(0, L, [1, 2, 3]) (из какого списка можно удалить ноль, чтобы получился данный список?)  имеет вид

L = [0, 1, 2, 3]

L = [1, 0, 2, 3]

L = [1, 2, 0, 3]

L = [1, 2, 3, 0]

6. Объедините два списка (припишите второй в конец первого)

Предикат имеет три аргумента – объединяемые списки и результат объединения.

Domains

intlist = integer*

Predicates

append(intlist, intlist, intlist)

Clauses

append([], L, L).

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

Goal

append([1], [2,3], L).

Если присоединить к списку пустой список, в результате получим исходный список.

Если первый аргумент не пуст, то он имеет голову и хвост, т.е. [X|L1]. Его объединение со списком L2 – список [X|L3], где список L3 получен после объединения списков L1 и L2.

Этот предикат также можно применять для решения нескольких задач.

Во-первых, для соединения списков. Например, если задать вопрос append ([1, 2], [4, 5], L),  то получим в результате L= [1, 2, 4, 5].

Во-вторых, для того, чтобы проверить, получится ли при объединении двух списков третий. Например, на вопрос append ([1, 2, 3], [4, 5], [1, 2, 5]) ответом будет, конечно, «no».

В-третьих, можно использовать этот предикат для разбиения списка на подсписки. Например, если задать следующий вопрос append ([1, 2], Y, [1, 2, 3]), то ответом будет Y=[3].

Аналогично, на вопрос append (X, [3], [1, 2, 3]) получим ответ X=[1, 2].

И, наконец, можно спросить append (X, Y, [1, 2, 3]). Получим четыре решения:

X=[], Y=[1, 2, 3]

X=[1], Y=[2, 3]

X=[1, 2], Y=[3]

X=[1, 2, 3], Y=[]

В-четвертых, можно использовать этот предикат для поиска элементов, находящихся левее и правее заданного элемента. Например, если нас интересует, какие элементы находятся левее и, соответственно, правее числа 2, можно задать следующий вопрос: append(L, [2|R], [1, 2, 3, 2, 4]). Получим два решения:

L=[1], R=[3, 2, 4].

L=[1, 2, 3], R=[4]

В-пятых, можно определить, используя append, предикат, позволяющий проверить принадлежность элемента списку. При этом воспользуемся тем, что если элемент принадлежит списку, то список может быть разбит на два подсписка так, что искомый элемент является головой второго подсписка member1(X, L):– append(_, [X|_], L).

Похожие записи

Добавить комментарий