2016-11-12 22 views
1

У меня возникли проблемы с попыткой подвести некоторые списки, которые у меня есть.Prolog - intern variables sum

Я в настоящее время имея:

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

 Смежные вопросы

  • Нет связанных вопросов^_^