Определим отношение 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 = 3 [3 | 4] первая часть правила выполняется, результирующий список принимает значение хвоста L = [4]. Элементы извлекаются из стека по одному и становятся в голову списка L.
L = [1, 2, 4]