Привет, я пытаюсь вставить элемент в список, но очень важно из моей программы, что результат сохраняется в исходном списке, а не в новом.
Любой код, который я написал или нашел в Интернете, преуспевает только при создании нового списка, в котором сохраняется конечный результат.
Итак, мой вопрос: может ли кто-нибудь сказать мне, как определить функцию: insert (X, L), где X - элемент, а L - список?Вставить элемент в список и вернуть тот же список обновлен
ответ
Нет, Пролог просто не работает таким образом. Нет такой вещи, как «изменение» значения. Переменная может быть унифицирована с определенным значением, но если она уже была [1,3]
, она больше не будет [1,2,3]
.
Как говорится в сообщении, вы не можете добавить или внести какие-либо изменения в правильный список, то есть список, в котором каждый элемент уже связан. Единственное «изменение», которое мы можем сделать, это объединение одного выражения с другим.
Однако есть понятие частичного списка, к которому дополнительные элементы могут быть добавлены в конце. Обычно это называется списком различий, хотя эта номенклатура может быть не сразу понятна.
Предположим, что мы начинаем не с пустого списка, а со свободной переменной X. Можно было бы, однако, подумать о вычитании X из X и получении «ничего». То есть пустой список различий представлен X - X. Минус «-» здесь является чисто формальным оператором; оценка разницы не требуется. Это просто удобный синтаксис, как вы видите из того, как списки различий могут использоваться для выполнения того, что вы (возможно) хотите сделать.
Мы можем добавить элемент в список разностной следующим образом:
insertDL(M,X-Y,X-Z) :- Y = [M|Z].
Здесь М новый элемент, мы хотим добавить, XY «старый» список разница, и XZ является «новый» разность (к которой добавлен М, путем объединения ранее свободной переменной Y с частичным списком [M | Z], так что Z становится «открытым» хвостом частичного списка X).
Когда мы, наконец, вставим вещи в наш разностный список, мы можем превратить X в правильный список, установив «свободный хвост» в этой точке в пустой список []. В этом смысле X является «той же» переменной, что и при первом запуске, просто унифицированном пошаговыми шагами от свободной переменной к соответствующему списку.
Это очень мощная техника программирования Prolog, и для ее удобства требуется определенная практика. Некоторые ссылки на дальнейшее обсуждение в Интернете:
[Из списков Пролога к разнице списков]
http://www.irisa.fr/prive/ridoux/ICLP91/node8.html
[Реализация разностных списков в Прологе]
http://www.cl.cam.ac.uk/~jpw48/difflists.pdf
[Lecture Notes: Разностные списки]
http://www.cs.cmu.edu/~fp/courses/lp/lectures/11-diff.pdf
Некоторые прологи предоставляют предикат setarg/3, чтобы изменить условия в место.
Для того, чтобы использовать его на списки, вам нужно только учитывать, что они просто хорошее представление цепочек сложных терминов с функтора '.'/2
В любом случае, если вам нужно использовать setarg/3 в Прологе, его вероятно, означает, что вы делаете что-то неправильно.
- 1. Erlang добавить элемент в тот же список
- 2. Python: Добавить список в тот же список
- 3. Обновлен список телепередач Netflix
- 4. Добавить в тот же список
- 5. Список (набор (...)) гарантированно сделает тот же список?
- 6. Как вернуть тот же список, используя функцию уменьшения в Clojure?
- 7. Список Python Индексирование и тот же элемент с другим флагом
- 8. OCaml вставить элемент в список
- 9. Вставить элемент в связанный список
- 10. Вставить элемент последним в список
- 11. Продолжайте использовать тот же список в F #
- 12. ListFragments содержит один и тот же список
- 13. Как добавить элементы в список кортежей, если элемент тот же
- 14. Добавить один элемент несколько раз в тот же список
- 15. Пользовательский список в Android повторяет тот же элемент
- 16. Связанный список удалить и вернуть первый элемент
- 17. Вставить список в список
- 18. Сравнивая тот же список без избыточности
- 19. Список фильтров в тот же список, используя Linq
- 20. Как вставить содержимое в тот же элемент группы формы?
- 21. Тот же список в двух разных контейнерах
- 22. Тот же список/словарь в нескольких функциях
- 23. Список вывода и массив numpy в тот же файл
- 24. Как вернуть элемент списка в список?
- 25. Вставить элемент в 2D список в прологе
- 26. Вставить элемент в список с помощью AsyncTask
- 27. Python вставить элемент в список поддерживающий порядок
- 28. Не удалось вставить элемент в двойной список
- 29. Вставить элемент в список, переместить существующие элементы
- 30. не удалось вставить элемент в соответствующий список
Если вам нужно обновить список на месте, то вы пытаетесь думать слишком настоятельно. Можете ли вы описать проблему, которую вы пытаетесь решить более подробно? – Juliet