你好:)我在编写谓词时遇到了一些困难,对于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”谓词,但对于更复杂的列表,我不能。你能帮帮我吗?
答案 0 :(得分:0)
这里的关键是确保你没有打电话给operate
,直到你有参数数字;所以像这样:
calc([Op, A1, A2],Res) :-
calc(A1,R1),
calc(A2,R2),
operate(Op,[R1,R2],Res).
问题当然是你没有基本案例。你能拥有的最简单的表达是什么?一个不涉及任何操作员的,只是一个数字:
calc(N,N) :- number(N).