Prolog - 内部变量总和
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?
您可以使用 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.
请注意,在上面的解决方案中,由于您需要求和并且列表是嵌套的,所以我使用了 flatten/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).
我在总结我的一些列表时遇到了一些问题。
我目前有:
[[[_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?
您可以使用 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.
请注意,在上面的解决方案中,由于您需要求和并且列表是嵌套的,所以我使用了 flatten/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).