Prolog - 递归计算

时间:2016-11-14 15:10:10

标签: list math recursion

你好:)我在编写谓词时遇到了一些困难,对于3个元素的列表 - [Operator,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)

我已经有了谓词来计算两个数字之间的操作:

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”谓词,但对于更复杂的列表,我不能。你能帮帮我吗?

1 个答案:

答案 0 :(得分:0)

这里的关键是确保你没有打电话给operate,直到你有参数数字;所以像这样:

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

问题当然是你没有基本案例。你能拥有的最简单的表达是什么?一个不涉及任何操作员的,只是一个数字:

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