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

3. Прибавьте единицу к каждому элементу списка

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

Domains

intlist = integer*

Predicates

new(intlist, intlist)

Clauses

new([],[]).

new([H|T],[K|L]):-K=H+1,new(T,L).

Goal

new([3,4,1,2,5],L).

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

4.  Напишите предикат, определяющий принадлежность элемента списку

Предикат имеет два аргумента – искомое значение и список, в котором производится поиск.

Domains

intlist = integer*

Predicates

member(integer, intlist)

Clauses

member(X, [X|_]).

member(X, [_|T]):- member(X,T).

Goal

member(1, [3,4,1]).

Число принадлежит списку, если совпадает с головой списка, иначе, если принадлежит его хвосту.

Заметим, что в первом случае (когда первый элемент списка совпадает с исходным элементом), нам неважно, какой у списка хвост, и можно в качестве хвоста указать анонимную переменную. Аналогично, во втором случае, если искомый элемент принадлежит хвосту, нам не важно, какой элемент первый.

Описанный предикат можно использовать двояко.

Во-первых, конечно, для того, для чего мы его и создавали, т.е. для проверки, имеется ли в списке конкретное значение. Мы можем, например, поинтересоваться, принадлежит ли единица списку, member(1, [3,4,1]). Получим ответ «yes».

Во-вторых, данный предикат можно использовать, чтобы получить по списку его элементы. Для этого нужно в качестве первого аргумента предиката указать свободную переменную. Например, member(X, [3,4,1]). Тем самым, мы попросим вывести все такие X, которые принадлежат указанному списку. Результатом будет:

X=3

X=4

X=1

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

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