我正试图解决我在Prolog的家庭工作中遇到的一些问题: 倍数之和:
例如:
multi_sum([[2,3],[5,4],[3,1,2]],X).
应该返回:X = 32
。但我得到了结果:false
。
multi([],1).
multi([A|B]|G):-multi(B,Z),G is A * Z.
multi_sum([],0).
multi_sum([A|B],Q):- multi(A,M) , multi_sum(B,T), Q is T + M.
答案 0 :(得分:1)
您需要将问题分为两部分:
multi/2
这样的数字列表的乘积的部分;和multi_sum/2
。对于你的multi/2
,你写了一个拼写错误:
multi([A|B]|G):-multi(B,Z),G is A * Z.
第二个管道(|
)应该是逗号(,
):
multi([A|B],G):-multi(B,Z),G is A * Z.
现在可行:
?- multi_sum([[2,3],[5,4],[3,1,2]],X).
X = 32.
尽管如此,您可以使用 accumulators 和尾递归来提高效率:
multi(L,R) :-
multi(L,1,R).
multi([],R,R).
multi([A|B],S,R) :-
T is S*A,
multi(B,T,R).
multi_sum(L,R) :-
multi_sum(L,0,R).
multi_sum([],R,R).
multi_sum([A|B],S,R)
multi(A,Sub),
T is S+Sub,
multi_sum(B,T,R).