2013-12-25 4 views
0

Я хочу спросить об этом коде, почему List L2 сохраняет его значения, когда функции начинают возвращать его значение из Recursion, это похоже на «Холдинг», я думаю, что список L2 должен вернуться к его оригиналу стоимость !!Неожиданное поведение кода Пролога

my_reverse(L1,L2) :- my_rev(L1,L2,[]). 

my_rev([],L2,L2) :- !. 
my_rev([X|Xs],L2,Acc) :- my_rev(Xs,L2,[X|Acc]). 
+0

Выполняется должным образом. 'L2' в вашем предикате' my_rev/3' не создается до базового варианта. После создания экземпляра он не затрагивается до завершения рекурсии. – lurker

+0

@mbratch Я думаю, что следующий вопрос - это проблема, но стоит ли возвращаться к исходной ситуации «неинициализированный» –

+0

Нет, он не вернется назад. Это произойдет только при отступлении. Код не возвращается, но возвращается из рекурсий и создает экземпляр 'L2', пока ваш запрос на' my_reverse/2' не будет выполнен. – lurker

ответ

1

L2 не сохраняет свою ценность. Предполагается, что программу следует назвать следующим образом:

?- my_reverse([1,2,3,4], Z). 
Z = [4, 3, 2, 1]. 

В этом примере L2 объединен с Z. Он сохраняется неназначенным до тех пор, пока не будет согласовано первое правило my_rev. Затем аккумулятор объединяется с L2: на последнем шаге содержимое аккумулятора «назначается» на L2.

+0

в порядке, вы, экспансия, решаете мою проблему, но, кстати, о -> my_rev ([], L2, L2): -!. <- что он делает? –

+0

@ Hassan 'my_rev ([], L2, L2): -! .' пытается объединить 2-й и 3-й параметры' my_rev/3' и, если он преуспеет, сократит любое обратное отслеживание (Prolog не будет искать никаких дополнительных растворы). – lurker

+0

@mbratch, ладно, спасибо за помощь сегодня, однако, «!» знак сказать Prolog, чтобы остановить и вернуть результаты, не так ли? –

Смежные вопросы