我尝试使用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]
任何指针都会非常感激。
答案 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).