Использование рекурсии и приложения в прологе - PullRequest
4 голосов
/ 29 марта 2010

Допустим, я хотел бы создать список (L2), добавляя элементы другого списка (L) по одному. Результат должен быть точно таким же, как на входе. Это глупое задание, но оно поможет мне понять, как пройтись по списку и удалить определенные элементы.

Я собрал следующий код:

create(L, L2) :- (\+ (L == []) -> L=[H|T], append([H], create(T, L2), L2);[]).

позвонив по

create([1,2,3,4], L2)

возвращает

L2 = [1|create([2,3,4], **)\.

, что не является желаемым результатом.

1 Ответ

3 голосов
/ 29 марта 2010

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

Функции в прологе не возвращают значений, они просто создают привязки.

Когда вы говорите

append([H], create(T, L2), L2);[]).

вы пытаетесь использовать возвращаемое значение.

Попытайтесь добавить привязки create, которые вы используете в рекурсивном вызове.

...