Как говорит 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