2016-11-10 2 views
0

私はプロローグで新しく、私は電卓をプログラムしたいと思います。そのためには、通常の形式(インフィクス形式)で書かれた、与えられた算術式を処理する述語をプログラムして、その接頭辞形式を得るようにする必要があります。 式の要素は、タームがターンリストに入るように、[operator、term1、term2]という形式の3つの要素を持つサブリストにグループ化されます。 解析が定義され、この例のように動作すべきであると呼ばれる述語:Prolog - 通常の形式で、数式計算のプレフィックス形式を取得するにはどうすればよいですか?

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

答えて

0

あなたは算術式のプレフィックス形を得るために、atom_to_term/3=../2を使用することができます。 atomic_list_concat/2は入力リストからアトムを作成し、次にatom_to_termは(算術式の中置表現になる)用語を作成します。次に、univ(=..)を使用して、接頭辞表記を再帰的に取得できます。

すなわち:

parse(LExp, PF):- 
    atomic_list_concat(LExp, Exp), 
    atom_to_term(Exp, Term, _), 
    parse1(Term, PF). 

parse1(Term, PF):- 
    Term =.. [PF]. 
parse1(Term, [Op, Left, Right]):- 
    Term =.. [Op, TLeft, TRight], 
    parse1(TLeft, Left), 
    parse1(TRight, Right). 

テストケース:

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

恐ろしいです。私はそれについて1つの質問しか持っていません:算術演算の正しい優先順位をどうやって知っていますか? –

+0

また、表現=何をするのですか? –

+0

@DiogoBoto:プロローグで定義された演算子を使用します。基本的には、式を持つ項を作成し、Prologは演算子の優先順位を知っています。次に、parse1はその式の接頭辞ツリーを作成するだけです。 univ(= ..)述部に関する情報については、解答のリンクを調べてください。 – gusbro

関連する問題