2016-11-12 2 views
1

私はいくつかのリストを要約しようとするといくつかの問題を抱えています。Prolog - インターン変数の合計

私は現在持っている:

[[[_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

引数が変数でない場合に成功するnonvar/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).