首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Prolog字符流错误

Prolog字符流错误
EN

Stack Overflow用户
提问于 2010-12-31 19:03:15
回答 2查看 233关注 0票数 2

我的代码应该在它读取的文件中发现stop时停止,但事实并非如此。我一直收到一个错误:

代码语言:javascript
复制
% 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.

任何帮助都将不胜感激!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-12-31 20:05:49

问题是calculate是递归的。在某个时刻,calculate([one], '03+')调用了,而后者又调用了calculate([], '03+1'),后者给出了一个结果(4)。然后,它调用execute并处理输入的其余部分。

然后,调用calculate成功,现在继续对'03+'应用atom_to_term,这会产生错误。

您可以通过将到atom的转换移动到单独的谓词来修复此问题:

代码语言:javascript
复制
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。

票数 1
EN

Stack Overflow用户

发布于 2010-12-31 19:53:48

将“加号”、“减号”和“次数”声明为运算符,您可以使用read/1直接读取Prolog术语,因为输入的是有效的Prolog语法。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4569685

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档