Удаление элемента из списка

Определим отношение del(X, L, L1), где

X – удаляемый элемент;

L – исходный список;

L1 – список, полученный в результате удаления X из L.

Возможны два случая:

1) если X – голова списка, то результирующий список равен хвосту списка L. Первая часть правила (нерекурсивная):

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

2) если X принадлежит хвосту, то список L делим на голову и хвост. Для хвоста снова вызывается правило del. Вторая часть правила (рекурсивная):

del(X, [Y|L], [Y|L1]):- del(X,L,L1).

Полная запись правила удаления элемента из списка:

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

del(X, [Y|L], [Y|L1]):- del (X,L,L1).

Например, для удаления из списка [1, 2, 3, 4] элемента 3, следует составить запрос:

GOAL

del(3, [1, 2, 3, 4], L),Write (L), nl.

Результат: [1, 2, 4].

нет
При выполнении программы X сравнивается с первым элементом списка.

нет
X = 3 [1 | 2, 3, 4] - первая часть правила не выполняется, 1 заносится в стек, рекурсивный вызов для хвоста [2, 3, 4]

да
X = 3 [2 | 3, 4] - первая часть правила не выполняется, 2 заносится в стек, рекурсивный вызов для хвоста [3, 4]

X = 3 [3 | 4] первая часть правила выполняется, результирующий список принимает значение хвоста L = [4]. Элементы извлекаются из стека по одному и становятся в голову списка L.

L = [1, 2, 4]