2016-11-12 95 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).