2016-11-14 118 views
0

你好:)我在節目中的其中3個元素列表謂語一些困難 - [話務員,Val_A,Val_B],它給我操作的結果。例如:序言 - 遞歸計算

?-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號做這個「計算」斷言,但對於更復雜的列表我不能。你可以幫幫我嗎?

+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).