算术计算机

发布于 2024-12-25 11:00:30 字数 355 浏览 0 评论 0原文

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

?-evaluate([2,+,4,*,5,+,1,*,2,*,3],R).

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

?-parse([1,+,2,*,3],PF).
PF=[+,1,[*,2,3]]

另一个谓词用于计算新表达式。

?-evpf([+,1,[*,2,3]],R).
R=7

我对第一部分有疑问,有人可以帮我解决代码吗?

I need some help in prolog, which is pretty new to me. I have to design a small arithmetic computer. The expression to be evaluated will be represented as a list for example:

?-evaluate([2,+,4,*,5,+,1,*,2,*,3],R).

I am trying to do this by designing two predicates one called parse to transform my list for example:

?-parse([1,+,2,*,3],PF).
PF=[+,1,[*,2,3]]

and another one to evaluate the new expression.

?-evpf([+,1,[*,2,3]],R).
R=7

I have problems with the first part, can anyone help my with the code?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

诗酒趁年少 2025-01-01 11:00:30

使用 DCG 进行解析(= 将列表转换为抽象语法树)很容易:

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。示例查询:

?- list_ast([2,+,4,+,5,+,1,+,2,*,3], Ast), V is Ast.
Ast = 2+4+5+1+2*3,
V = 18 ;
false.

Parsing (= converting a list to an abstract syntax tree) is easy with DCGs:

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), [')'].

To actually evaluate the expression, you can then use the built-in predicate is/2. Sample query:

?- list_ast([2,+,4,+,5,+,1,+,2,*,3], Ast), V is Ast.
Ast = 2+4+5+1+2*3,
V = 18 ;
false.
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文