пролог, копирование списков - PullRequest
3 голосов
/ 16 декабря 2009

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

Я пробовал следующее -

copy(L,R) :- accCp(L,R).

accCp([],R).
accCp([H|T],R) :- accCp(T,H).

Когда я запускаю трассировку по этому вопросу - я вижу, как копируются отдельные элементы, но они «теряются» и не образуют растущий список (в R, как я и надеялся). Как я могу достичь этого?

Большое спасибо

1 Ответ

6 голосов
/ 16 декабря 2009

Ваш базовый случай должен установить список копирования пустым, когда исходный список пуст. Затем рекурсивный случай должен взять H из списка L и добавить его в начало списка R:

copy(L,R) :- accCp(L,R).
accCp([],[]).
accCp([H|T1],[H|T2]) :- accCp(T1,T2).

Когда вы вызываете copy, он возвращается к базовому случаю, где R устанавливает пустой список. Затем, когда он работает обратно, он продолжает добавлять заголовок H известного списка [H|T1] к началу списка переменных [H|T2]. Это происходит до тех пор, пока не будет достигнут исходный случай, и в этот момент R содержит полную копию L.

...