Пролог: добавить список к себе - PullRequest
0 голосов
/ 06 сентября 2011

предположим, у меня есть список ListSum, и я хочу рекурсивно добавить новый список в ListSum, например

appList(ListSum):-
    %%generate a list: ListTemp,
    append(ListTemp,ListSum,ListSum),
    appList(ListSum).

, но метод добавления (ListTemp, ListSum, ListSum) не работает так, как я хотел.

Кто-нибудь может мне помочь?

Приветствия

Ответы [ 2 ]

2 голосов
/ 06 сентября 2011

Вы должны понимать концепцию объединения (или фактически «сопоставления», как это реализовано в Прологе). Вы не можете привязать два или более значений к одной и той же переменной. Переменные в Прологе после сопоставления сохраняли свое значение до тех пор, пока не достигли конечной цели или не потерпели неудачу где-то. После этого, если возможностей больше, переменная повторно создается с другим значением и т. Д.

Например, если я запрашиваю appList ([]), то добавление будет проверено на соответствие:

append(ListTemp,[],[])

Если ListTemp не является пустым списком, это условие не будет выполнено, потому что семантика добавления - «добавить первый аргумент вторым, оба являются списками, в результате чего третий». Рекурсивный вызов appList(ListSum) будет называться appList([]), поскольку ListSum ранее сопоставляется с [], что приводит к бесконечной рекурсии (к счастью, если ListTemp не [], это не будет достигнуто).

В предложении должно быть два аргумента, один из которых является исходным списком, а другой - результирующим списком. Первые два аргумента append - это ListSum и ListTemp (зависит от того, какой порядок добавления вы хотите), а третий - результирующий список. Готово, рекурсия не требуется.

0 голосов
/ 17 апреля 2013

вот нерекурсивное решение, не знаю, зачем вам нужна рекурсия:

appself(L,X) :- append(L,L,X).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...