2017-04-15 45 views
0

的总和我写了这个代码:Prolog的计算2D名单

sum_list([], 0). 
sum_list([H|T], X) :- 
    sum_list(T, Rest), 
    X is H + Rest. 

它计算所有列表元素的总和。例如,如果我打电话:

sum_list([1,2,3], X). 

它返回6.但我想也能够计算二维列表的总和。例如,如果我通过sum_list([[1,2],[3,4]], X)。我会得到10 但是,当我试图通过这个名单,我得到:

uncaught exception: error(type_error(evaluable,'.'/2),(is)/2) 

错误。这个错误有什么问题?我无法在网上找到任何有用的信息。

+0

什么是你期待'[3,4] + 0'产生?如果是这样,为什么你没有在你的原始代码中使用它? –

+0

我不明白你的意思。那么我该如何总结2D列表呢? – motleycrue

回答

1

的sum_list期待一维数组,你可以尝试这样的事:

sum2D_list([X|T],R):- 
sum2D_list(T,R2), 
sum_list(X,R3), 
R is R3+R2. 
sum2D_list([],0). 

sum2D_list([[1,2],[3,4]],X). 

试了一下,结果被

X = 10. 
+0

所以如果我想做一个总结任何深度列表的函数,我需要做很多调用一个低级函数的函数?例如sum3D_list ...调用sum2D等? – motleycrue

+1

如果你想要的东西,可以与任何深入的工作,你可以用这个代替 '总和(X,Y): - \ + is_list(X), Y是X 总和([H | T],R ):和(H,R1), sum(T,R2), R是R1 + R2。 sum([],0).' –

+0

是你需要的吗? –