我如何 "reduce" Prolog 对列表?
How do I "reduce" a Prolog list of pairs?
我正在尝试使用 PROLOG 进行一些图形分析。特别是我想要一个对列表,它指示从根开始的每个更深级别的节点数。我能够生成以下形式的对列表:
M = [1-[431, 441, 443, 444, 445, 447, 449], 2-[3, 5, 7, 8, 409, 451|...]].
pair key为图级;对值是该级别的节点列表;
而我希望对值是节点的计数。
但我想不出将 M
减少到 N
.
N = [1-7],[2,20,],...........[8-398]
其中 N
表示第 1 级有 7 个节点等....也许我需要一组很好的成对示例。
更简单的数据可以是 M=[1-[a,b,c],],2-[d,e]]
应该减少到 N=[1-3,2-2]
任何指针将不胜感激。
您想将此类对的列表映射到另一个元素列表,如下所示
list_bylength(KLs, KNs) :-
maplist(el_len, KLs, KNs).
el_len(I-L,I-N) :-
length(L, N).
或者:
list_bylength2([], []).
list_bylength2([I-L|ILs], [I-N|INs]) :-
length(L, N),
list_bylength2(ILs, INs).
最紧凑的是,使用 library(lambda)
:
..., maplist(\ (I-L)^(I-N)^length(L,N), ILs, INs), ...
很多列表处理可以通过findall/3,使用member/2作为'cursor'。
list_bylength(KLs, KNs) :-
findall(K-L, (member(K-Ls,KLs),length(Ls,L)), KNs).
我正在尝试使用 PROLOG 进行一些图形分析。特别是我想要一个对列表,它指示从根开始的每个更深级别的节点数。我能够生成以下形式的对列表:
M = [1-[431, 441, 443, 444, 445, 447, 449], 2-[3, 5, 7, 8, 409, 451|...]].
pair key为图级;对值是该级别的节点列表;
而我希望对值是节点的计数。
但我想不出将 M
减少到 N
.
N = [1-7],[2,20,],...........[8-398]
其中 N
表示第 1 级有 7 个节点等....也许我需要一组很好的成对示例。
更简单的数据可以是 M=[1-[a,b,c],],2-[d,e]]
应该减少到 N=[1-3,2-2]
任何指针将不胜感激。
您想将此类对的列表映射到另一个元素列表,如下所示
list_bylength(KLs, KNs) :- maplist(el_len, KLs, KNs). el_len(I-L,I-N) :- length(L, N).
或者:
list_bylength2([], []).
list_bylength2([I-L|ILs], [I-N|INs]) :-
length(L, N),
list_bylength2(ILs, INs).
最紧凑的是,使用 library(lambda)
:
..., maplist(\ (I-L)^(I-N)^length(L,N), ILs, INs), ...
很多列表处理可以通过findall/3,使用member/2作为'cursor'。
list_bylength(KLs, KNs) :-
findall(K-L, (member(K-Ls,KLs),length(Ls,L)), KNs).