Я написал программу для вычисления выражения post-fix в прологе рекурсивно из списка выражений. Например, учитывая следующий список:Postfix expression list
[+,1,2]
Он должен вернуться 3. Они, как я построил мой предикат называть себя рекурсивно до тех пор, пока не достигнет конца списка, так что он считывает значения в обратном направлении. (так же, как чтение этого списка слева направо: [2,1, +]).
Моя проблема заключается в том, что когда я пытаюсь вернуть более одного значения через рекурсивные вызовы, все значения внезапно исчезают.
Вот код:
eval_list([Head|Tail],_,Result):-
Tail==[], % last element of list
Result=Head,
write(Head),
write(' was stored in Result!\n').
eval_list([Head|Tail],Store1,Result):-
eval_list(Tail,Store2, NewResult),
(\+integer(Store2))
->
% if no integer is bound to Store2, bind Store1 to Head
Store1=Head,
Result is NewResult,
write(Head),
write(' is stored value!\n')
; (integer(Store2)) ->
% if an integer is bound to store2, we perform operation specified by the Head with the stored number
X is Store2+NewResult,
Result is X,
write('performed operation!\n')
;
% if doesnt catch either of these states the program is broken
( print('something broke\n'),
print(Store1),
nl,
print(Store2),
nl,
print(Head),
nl,
print(Result),
nl
).
я получаю следующий результат:
?- eval_list([+,1,2],X,Result).
2 was stored in Result!
1 is stored value!
something broke
_G1162
_L147
+
_G1163
true.
Я не понимаю, почему мои ценности исчезают, или, если есть лучший способ оценить список.
Подход, который я пытался сделать, это обратить вспять постфиксное выражение, чтобы моя рекурсивная программа могла читать его назад справа налево: P Пример, который я дал, - это сделать вещи простыми ха-ха. Я хочу иметь возможность обрабатывать выражения любого размера. Как я понимаю, ваша версия программы сохраняет реорганизацию выражения до тех пор, пока оно не соответствует одному из предикатов eval_stack, где он затем заменяет раздел выражения результатом? Спасибо за ваш ответ, я пытался понять это на пару дней :) – thegalah
@thegalah У меня это чувство тоже .... :), если нет ** очень ** веской причины для этого , всегда пытайтесь найти решение, которое читает список Prolog слева направо. Затем вы можете использовать унификацию, сопоставление и хвостовую рекурсию для естественной итерации по спискам. И да, но посмотрите мое редактирование на ответ (и проголосуйте, чтобы другие могли его использовать). – 2013-04-11 12:38:20
[tag: DCG] кто-нибудь? – false