2012-01-08 15 views
1

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

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

私は例えば、私のリストを変換するために、構文解析と呼ばれる2つの述部1を設計することにより、これを行うにしようとしています:

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

と別1つは新しい表現を評価する。

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

私は最初の部分に問題があります。コードに手伝ってもらえますか?

+1

ここでの主な課題は、少なくともDCG技術を適用した後で、「中置演算子」表記から「接頭辞演算子」形式に変換することです。これを正しく行うには、演算子の優先順位の規則を指定する必要があります。 *は+よりも優先順位が高いですか?操作は右から左の順序で行われますか?いずれの可能性も、リストを変換するあなたの単一の例(上記の 'PF 'を参照)と一致しています。あなたは何のルールを思いついたのですか? – hardmath

答えて

3

(抽象構文木にリストを変換=)解析が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), [')']. 

実際に式を評価するために、あなたは、組み込みの述語である/ 2を使用することができます。サンプルクエリー:

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

ありがとう、それは私が望んでいたものではありませんが、希望のリストを作成するためにあなたから提供された述語を使用することができます –

+1

はい、私は追加することを忘れました:これは、例えばASTを異なる表現、または上記のDCGを変更することによって変更することができます。 – mat