Проблема в том, что вычисление является рекурсивным.В некоторый момент вызывается calculate([one], '03+')
, что, в свою очередь, вызывает calculate([], '03+1')
, что дает результат (4).Затем он вызывает execute и обрабатывает остальную часть ввода.
Затем , вычисление вызова выполняется успешно, и теперь продолжается применение atom_to_term
к '03+'
, что дает ошибку.
Это можно исправить, переместив преобразование в атом в отдельный предикат:
to_atom([Word], Symbol) :- word_to_number(Word, Symbol).
to_atom([Word|Rest], Term) :-
word_to_number(Word,Symbol),
to_atom(Rest, Symbol2),
concat(Symbol,Symbol2,Term).
...
calculate(List) :-
to_atom(List, NewX),
atom_to_term(NewX,Eq,[]),
...
Тогда в начале вам также не понадобится фиктивная 0.