вставить элемент в список и вернуть обновленный список - PullRequest
6 голосов
/ 10 января 2011

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

Ответы [ 3 ]

3 голосов
/ 10 января 2011

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

2 голосов
/ 10 января 2011

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

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

Предположим, что мы начинаем не с пустого списка, а со свободной переменной X. Однако можно подумать о том, чтобы вычесть X из Xи получать "ничего".То есть пустой список различий представлен X - X. Минус "-" здесь является чисто формальным оператором;оценка разницы не предназначена.Это просто удобный синтаксис, как вы видите из того, как списки различий могут использоваться для выполнения того, что вы (вероятно) хотите сделать.

Мы можем добавить элемент в список различий следующим образом:

insertDL(M,X-Y,X-Z) :- Y = [M|Z].  

Здесь M - это новый элемент, который мы хотим добавить, XY - это «старый» список различий, а XZ - «новое» отличие (к которому добавлен M, путем объединения ранее свободной переменной Y с частичным списком[M | Z], так что Z становится «открытым» хвостом частичного списка X).

Когда мы наконец закончили вставлять вещи в наш список различий, мы можем превратить X в правильный список, установив"свободный хвост" в этой точке к пустому списку [].В этом смысле X - это та же самая переменная, которая была у нас в начале, только объединенная пошаговыми шагами от свободной переменной к правильному списку.

Это очень мощный метод в программировании на Прологе, и требуется некоторая практика, чтобычувствовать себя комфортно, используя его.Некоторые ссылки для дальнейшего обсуждения в Интернете:

[От списков прологов к спискам различий]
http://www.irisa.fr/prive/ridoux/ICLP91/node8.html

[Реализация списков различий в прологе]
http://www.cl.cam.ac.uk/~jpw48/difflists.pdf

[Конспект лекций: списки различий]
http://www.cs.cmu.edu/~fp/courses/lp/lectures/11-diff.pdf

1 голос
/ 10 января 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...