Prolog-内部变量和

Prolog-内部变量和,prolog,list-manipulation,Prolog,List Manipulation,我在总结我的一些清单时遇到了一些困难 我目前有: [[[_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]]] 我的问题是我试图总结列表中的元素。我知道如何遍历它,但我需要忽略intern变量,或者将它们转换为0 我尝试使用sum_li

我在总结我的一些清单时遇到了一些困难

我目前有:

[[[_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]]]
我的问题是我试图总结列表中的元素。我知道如何遍历它,但我需要忽略intern变量,或者将它们转换为0


我尝试使用sum_list(list,sum),但我发现它不能处理实习生变量。因此,我的问题是,如何忽略值不为0或1的元素,或者如何将内部变量转换为0?

可以使用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.  
注意,在上面的解决方案中,由于需要求和,列表是嵌套的,所以我使用了flant/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).