Prolog字符流错误

时间:2010-12-31 11:03:15

标签: prolog

我的代码应该在文件中找到停止读取时停止,但不是。我一直收到错误:

% 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.

非常感谢任何帮助!

2 个答案:

答案 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。