我如何"减少"一对Prolog的对名单?

时间:2015-01-20 19:55:17

标签: prolog

我尝试使用PROLOG进行一些图形分析。特别是我想要一个对列表,它们表示从根开始的每个更深层次的节点数。我能够生成表格对的列表:

M = [1-[431, 441, 443, 444, 445, 447, 449], 2-[3, 5, 7, 8, 409, 451|...]].

对键是图表级别; pair值是该级别的节点列表; 而我希望配对值是节点的计数。 但我无法将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]任何指针都会非常感激。

2 个答案:

答案 0 :(得分: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), ...

答案 1 :(得分:0)

很多列表处理可以通过findall / 3执行,使用member / 2作为'cursor'。

list_bylength(KLs, KNs) :-
  findall(K-L, (member(K-Ls,KLs),length(Ls,L)), KNs).