我的代码应该在文件中找到停止读取时停止,但不是。我一直收到错误:
% reads in a character and then checks whether this character is a blank,
% a carriage return or the end of the stream. In any of these cases a
% complete word has been read otherwise the next character is read.
calculate([stop],_) :- !.
calculate([],_):-!.
calculate([Word|Rest],X) :-
word_to_number(Word,Symbol),
concat(X,Symbol,NewX),
calculate(Rest,NewX),
atom_to_term(NewX,Eq,[]),
print('Calculating '),print(NewX),print(' The result is: '),
Result is Eq,
print(Result),nl,
execute.
非常感谢任何帮助!
答案 0 :(得分:2)
将“plus”,“minus”和“times”声明为运算符,并且可以使用read / 1直接读取Prolog术语,因为输入是有效的Prolog语法。
答案 1 :(得分:1)
问题是计算是递归的。在某些时候,调用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。