2016-11-14 17 views
0

こんにちは:) [オペレータ、Val_A、Val_B]という3つの要素のリストのために、それは私に操作の結果を与える述語をプログラミングする際にいくつかの困難を抱えています。Prolog - 再帰計算

?-calc([*,3,2],Res). 
Res=6 

しかし同時にVal_AまたはVal_Bが同じ形式で一覧することができ、そしてそれは結果を与える必要があります:たとえば

?-calc([*,[+,2,4],5],Res). 
Res=30         ----->([*,6,5]=30) 
?-calc([+,[+,2,[-,4,3]],[*,2,4]],Res). 
Res=11         ----->([+,[+,2,1],8]=[+,3,8]=11) 

私はすでに運転を計算する述語を持っています2間の数字:

operate(Op,[H|T],Res):- 
Op == + -> Res is H+T; 
Op == - -> Res is H-T; 
Op == * -> Res is H*T; 
Op ==/-> Res is H/T. 

、と私はすでに2つの番号については、この「CALC」の述語を行うことができるんだけど、もっと複雑なリストについては、私はできません。私たちを手伝ってくれますか?

+0

'calc'は2つの引数を持ちます。あなたのコードには、3があります。 –

+0

申し訳ありませんが間違いでした、私はすでにそれを修正しました。 –

答えて

0

ここで重要な点は、引数の数がなくなるまでoperateに電話をかけないようにすることです。だからこのような何か:

calc([Op, A1, A2],Res) :- 
    calc(A1,R1), 
    calc(A2,R2), 
    operate(Op,[R1,R2],Res). 

問題はもちろん、あなたは基本ケースを持っていないということです。あなたが持つことができる最も簡単な表現は何ですか?あなたの質問の冒頭に示されているように、演算子に関係なく単なる数字です:

calc(N,N) :- number(N).