2011-01-10 6 views
6

Привет, я пытаюсь вставить элемент в список, но очень важно из моей программы, что результат сохраняется в исходном списке, а не в новом.
Любой код, который я написал или нашел в Интернете, преуспевает только при создании нового списка, в котором сохраняется конечный результат.
Итак, мой вопрос: может ли кто-нибудь сказать мне, как определить функцию: insert (X, L), где X - элемент, а L - список?Вставить элемент в список и вернуть тот же список обновлен

+0

Если вам нужно обновить список на месте, то вы пытаетесь думать слишком настоятельно. Можете ли вы описать проблему, которую вы пытаетесь решить более подробно? – Juliet

ответ

3

Нет, Пролог просто не работает таким образом. Нет такой вещи, как «изменение» значения. Переменная может быть унифицирована с определенным значением, но если она уже была [1,3], она больше не будет [1,2,3].

2

Как говорится в сообщении, вы не можете добавить или внести какие-либо изменения в правильный список, то есть список, в котором каждый элемент уже связан. Единственное «изменение», которое мы можем сделать, это объединение одного выражения с другим.

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

Предположим, что мы начинаем не с пустого списка, а со свободной переменной 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

1

Некоторые прологи предоставляют предикат setarg/3, чтобы изменить условия в место.

Для того, чтобы использовать его на списки, вам нужно только учитывать, что они просто хорошее представление цепочек сложных терминов с функтора '.'/2

В любом случае, если вам нужно использовать setarg/3 в Прологе, его вероятно, означает, что вы делаете что-то неправильно.

Смежные вопросы