Список Голова Хвост

[1,2,3,4,5] 1 [2,3,4,5]

[6.9,4.3,8.4,1.2] 6.9 [4.3,8.4,1.2]

[cat,dog,horse] cat [dog,horse]

['S','K','Y'] 'S' ['K','Y']

["PIG"] "PIG" []

[] не определена не определен

_____________________________________________________________

Операции над списками.

Рассмотрим основные предикаты для обработки списков.

 

Вывод элементов списка.

Необходимо описать предикат, который позволял бы выводить последовательно все элементы списка, по одному в каждой строке. Применим для этого рекурсию. Пусть writelist(L) - предикат, реализующий вывод списка, L - список:

writelist([]).

writelist([H|T]):- write(H), nl, writelist(T).

 

Первое предложение является граничным условием, т.е. оно говорит, что необходимо прекратить вывод в том случае, когда список уже пуст.

Второе предложение задает вывод головы списка, переход к новой строке
(nl -стандартный предикат перевода строки) и рекурсивный вызов предиката, выводящего хвост списка.

Проверка принадлежности элемента списку (member).

 

Отношение принадлежности записывается в виде двух предложений:

member(X,[X|Tail]).

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

Оно основано на следующих соображениях: либо X - голова списка, либо X принадлежит хвосту этого списка.

 

Например запишем предикат

member(X,L).

Здесь L - некоторый список, Х - объект того же типа, что и элементы списка L. Составление предиката может быть основано на следующих соображениях: X есть либо голова списка L, либо X принадлежит хвосту. Это может быть записано в виде двух предложений, первое из которых есть простой факт, ограничивающий вычисления, а второй - рекурсивное правило:

member(X, [X|_]).

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

 

Напомним, что знаком подчерка здесь обозначена анонимная переменная, значение которой в данном предложении неважно.

Работа предиката следующая: при каждом рекурсивном вызове список будет короче, т.к. аргументом заголовка является структура[_|T], а в рекурсивном вызове - список Т. Рекурсивные вызовы продолжаются до тех пор, пока не будет достигнуто совпадение значения переменной X с головой списка Т, или если окажется пустой список, тогда предикат завершается ложно, так как для пустого списка нет своего правила.

Обычно этот предикат используют в двух вариантах:

1) Переменная X неконкретизирована, а список L конкретизирован. В этом случае в результате работы предиката переменная X конкретизируется элементом списка L. Используя механизм возвратов, можно переменной X последовательно придавать значения всех элементов списка L.

2) Переменная X и список L конкретизированы. Значением предиката будет “истина”, если X совпадает с одним из элементов списка, и "ложь" в противном случае.








Дата добавления: 2016-05-05; просмотров: 609;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.006 сек.