Книга: Программирование на языке Пролог для искусственного интеллекта
3.2.4. Удаление элемента
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, Список, БольшийСписок) :-
удалить( X, БольшийСписок, Список).
В принадлежит1
мы изящно реализовали отношение принадлежности через конк
. Для проверки на принадлежность можно также использовать и удалить
. Идея простая: некоторый X принадлежит списку Список
, если X можно из него удалить:
принадлежит2( X, Список) :-
удалить( X, Список, _ ).
- 3.2.3. Добавление элемента
- Письма с элементами графики и вложениями
- Выбор элемента с помощью переключателя
- 19.2.5. Чтение и запись содержимого элемента
- Встраивание сценариев в рамках элемента SCRIPT
- Глава 4 Элементарные сокеты TCP
- 14.4.3. Ввод элемента в дерево: tsearch()
- Операции с элементами каталогов
- Получение и задание размеров и местоположения элемента Web-страницы
- Структура элемента списка
- Обработка событий, генерируемых элементами управления формы
- 5.1. Унификация и элементарные действия