我如何 "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).