首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >算术计算机

算术计算机
EN

Stack Overflow用户
提问于 2012-01-09 00:21:50
回答 1查看 1.1K关注 0票数 1

我需要一些prolog方面的帮助,这对我来说是很新的。我必须设计一台小型算术计算机。要计算的表达式将表示为列表,例如:

代码语言:javascript
复制
?-evaluate([2,+,4,*,5,+,1,*,2,*,3],R).

我试图通过设计两个谓词来实现这一点,其中一个谓词称为parse,用于转换我的列表,例如:

代码语言:javascript
复制
?-parse([1,+,2,*,3],PF).
PF=[+,1,[*,2,3]]

和另一个用于计算新表达式的值。

代码语言:javascript
复制
?-evpf([+,1,[*,2,3]],R).
R=7

我对第一部分有问题,有人能帮我写代码吗?

EN

回答 1

Stack Overflow用户

发布于 2012-01-09 00:37:38

使用DCGs可以轻松地解析(=将列表转换为抽象语法树):

代码语言:javascript
复制
list_ast(Ls, AST) :- phrase(expression(AST), Ls).

expression(E)       --> term(T), expression_r(T, E).

expression_r(E0, E) --> [+], term(T), expression_r(E0+T, E).
expression_r(E0, E) --> [-], term(T), expression_r(E0-T, E).
expression_r(E, E)  --> [].

term(T)       --> power(P), term_r(P, T).
term_r(T0, T) --> [*], power(P), term_r(T0*P, T).
term_r(T0, T) --> [/], power(P), term_r(T0/P, T).
term_r(T, T)  --> [].

power(P)          --> factor(F), power_r(F, P).
power_r(P0, P0^P) --> [^], factor(P1), power_r(P1, P).
power_r(P, P)     --> [].

factor(N) --> [N], { number(N) }.
factor(E) --> ['('], expression(E), [')'].

要实际计算表达式,可以使用内置谓词is/2。示例查询:

代码语言:javascript
复制
?- list_ast([2,+,4,+,5,+,1,+,2,*,3], Ast), V is Ast.
Ast = 2+4+5+1+2*3,
V = 18 ;
false.
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8779114

复制
相关文章

相似问题

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