Программирование на языке Пролог для искусственного интеллекта | страница 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, Список, БольшийСписок) :-