2016-11-12 57 views
1

我在尝试总结一些列表时遇到了一些麻烦。序言 - 实习变量总和

我目前有:

[[[_G8511,0,1,_G8520],[_G8526,1,0,0],[_G8541,_G8544,0,1]], 
[[1,1,1,_G8568],[0,1,0,1],[0,_G8592,0,1]], 
[[1,0,_G8613,_G8616],[0,1,_G8628,0],[0,_G8640,_G8643,1]]] 

我的问题是,我试图总结列表中的元素。我知道如何遍历它,但我需要忽略内部变量,或使它们变为0.

我试过使用sum_list(List,Sum),但正如我想的那样,它无法处理实习生变量。所以我的问题是如何忽略不具有值0或1的元素,或者如何将内部变量设置为0?

回答

1

当参数不是变量时,可以使用成功的非变量/ 1谓词。

你可以写的sum_list断言:

sum_list(List,Sum):-flatten(List,List2),sum_list2(List2,Sum). 

sum_list2([],0). 
sum_list2([H|T],Sum):- var(H),sum_list2(T,Sum). 
sum_list2([H|T],Sum):- nonvar(H), sum_list2(T,Sum1),Sum is Sum1+H. 

注意的是,在上述解决方案,因为你需要的总和,并列出嵌套我用压平/ 2谓词其压平嵌套列表转换成一个平坦的列表。

?- sum_list([[[_G8511,0,1,_G8520],[_G8526,1,0,0],[_G8541,_G8544,0,1]],[[1,1,1,_G8568],[0,1,0,1],[0,_G8592,0,1]],[[1,0,_G8613,_G8616],[0,1,_G8628,0],[0,_G8640,_G8643,1]]],Sum). 
Sum = 12 ; 
false. 

另一种解决方案使用(确定性)与foldl/4可以是:

add(X,Y,Sum):- (nonvar(X)-> Sum is X+Y;Sum is Y). 

sum(List,Sum):- flatten(List,L2),foldl(add,L2,0,Sum).