1

私はかなり新しいプロローグで助けが必要です。私は小さな算術計算機を設計しなければなりません。評価される式は、たとえば次のようにリストとして表されます。

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

たとえば、リストを変換するためにparseと呼ばれる2つの述語を設計することで、これを実行しようとしています。

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

もう 1 つは新しい式を評価します。

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

最初の部分に問題があります。コードを手伝ってくれる人はいますか?

4

1 に答える 1

3

構文解析 (= リストを抽象構文木に変換すること) は、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.
于 2012-01-08T16:37:38.103 に答える