Программирование на языке Пролог для искусственного интеллекта | страница 50



3.2. Определите отношение

>последний( Элемент, Список)

так, чтобы >Элемент являлся последним элементом списка >Список. Напишите два варианта определения: (а) с использованием отношения >конк, (b) без использования этого отношения.

3.2.3. Добавление элемента

Наиболее простой способ добавить элемент в список — это вставить его в самое начало так, чтобы он стал его новой головой. Если X — это новый элемент, а список, в который X добавляется — L, тогда результирующий список — это просто

>[X | L]

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

>добавить( X, L, [X | L] ).

3.2.4. Удаление элемента

Удаление элемента X из списка L можно запрограммировать в виде отношения

>удалить( X, L, L1)

где L1 совпадает со списком L, у которого удален элемент X. Отношение >удалить можно определить аналогично отношению принадлежности. Имеем снова два случая:

(1) Если X является головой списка, тогда результатом удаления будет хвост этого списка.

(2) Если X находится в хвосте списка, тогда его нужно удалить оттуда.

>удалить( X, [X | Хвост], Хвост).

>удалить( X, [Y | Хвост], [Y | Хвост1] ) :-

> удалить( X, Хвост, Хвост1).

как и >принадлежит, отношение >удалить по природе своей недетерминировано. Если в списке встречается несколько вхождений элемента X, то >удалить сможет исключить их все при помощи возвратов. Конечно, вычисление по каждой альтернативе будет удалять лишь одно вхождение X, оставляя остальные в неприкосновенности. Например:

>?- удалить( а, [а, b, а, а], L].


>L = [b, а, а];

>L = [а, b, а];

>L = [а, b, а];

>no            (нет)

При попытке исключить элемент, не содержащийся в списке, отношение >удалить потерпит неудачу.

Отношение >удалить можно использовать в обратном направлении для того, чтобы добавлять элементы в список, вставляя их в произвольные места. Например, если мы хотим во все возможные места списка >[1, 2, 3] вставить атом , то мы можем это сделать, задав вопрос: "Каким должен быть список L, чтобы после удаления из него элемента  получился список >[1, 2, 3]?"

>?- удалить( а, L, [1, 2, 3] ).


>L = [а, 1, 2, 3];

>L = [1, а, 2, 3];

>L = [1, 2, а, 3];

>L = [1, 2, 3, а];

>nо               (нет)

Вообще операция по внесению X в произвольное место некоторого списка >Список, дающее в результате >БольшийСписок, может быть определена предложением:

>внести( X, Список, БольшийСписок) :-