logo
ЛОИИ методичка 2015

Использование списков в Пролог.

Список можно описать с помощью функтора (а,(b,c)).

Эквивалентная запись [a,b,c]

Процедуры работы со списками чаще всего определяют рекурсивно, то есть определяют базовые случаи, когда результат выдается сразу, общие случаи будут определять, как свести задачу к более простой.

Пример: Определим рекурсивно процедуру сцепить два списка:

1, 2 – исходные списки; 3 – результирующий список.

Базовый случай – если первый список пуст, то 2й и 3й список одинаковы.

Общий случай – если первый список не пуст, то его голова совпадает с головой 3го списка, а хвост 3го списка будет результатом сцепления хвоста первого списка со вторым списком.

append1([],L,L).

append1([H|T1], L, [H|T]):-

append1(T1, L, T).

?- append1([a,b], [c,d], X).

X = [a,b,c,d]

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

1 – объект; 2 – список объектов.

Предикат – истина, если в списке встречается искомый объект.

Базовый случай: если элемент совпадает с головой списка, то предикат – истина.

В общем случае нужно проверить принадлежность элемента хвосту.

elem(X, [X|_]).

elem(X, [_|Xs]):- elem(X, Xs).

?- elem(b, [a,b,c]).

Yes

?- elem(d, [a,b,c]).

No

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

1 - объект, 2 – исходный список; 3 – результирующий список.

Базовый случай: если элемент совпадает с головой списка, то результат – хвост списка.

Общий случай: результатом будет список, имеющий голову исходного списка и хвост – хвост исходного списка, из которого удален заданный элемент.

delete1(X, [X|Xs], Xs).

delete1(X, [X1|Xs], [X1|L]):-

delete1(X, Xs, L).

?- delete1(b, [a,b,c], X).

X = [a,c]

?- delete1(d, [a,b,c], X).

no

Yandex.RTB R-A-252273-3
Yandex.RTB R-A-252273-4