Prolog 序言倍数和(递归)

Prolog 序言倍数和(递归),prolog,Prolog,我正试图用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. 您需要将问题分为两部分: 计算一系列数字乘积

我正试图用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.

您需要将问题分为两部分:

  • 计算一系列数字乘积的部件,如
    multi/2
    ;及
  • 计算这些乘积之和的部件,如
    多维求和/2
对于您的
multi/2
,您输入了一个打字错误:

multi([A|B]|G):-multi(B,Z),G is A * Z. 现在它可以工作了:

?- multi_sum([[2,3],[5,4],[3,1,2]],X).
X = 32.
不过,您可以通过使用累加器和尾部递归来提高效率:


@鲍里斯:我想他打错了:注意第二行开头的管道(
)而不是逗号(
)。@WillemVanOnsem是的,那是个打字错误。
多([2],R)
已经失败了。@Boris是的,谢谢!我不确定效率主张。它将在具有尾部递归优化的常量内存中发生,但我不确定它是否会更快(在许多情况下,累加器+尾部递归实际上更慢!)
?- multi_sum([[2,3],[5,4],[3,1,2]],X).
X = 32.
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).