Prolog 查找与第一个输入元素成对的列表的长度

Prolog 查找与第一个输入元素成对的列表的长度,prolog,Prolog,我需要实现一个可以 size_sub([[a,a,a],[b,b]],X). and returns [a,3],[b,2] 到目前为止,我所取得的成就 size_sub(A,Ls):- maplist(length,A,Ls). returns [3,2] 如何修改现有功能以返回值-数字对。您可以向maplist传递一个谓词,执行适当的操作,如 size_sub(A,Ls):- maplist(list_sym_len,A,Ls). list_sym_len([Sym|Rest

我需要实现一个可以

size_sub([[a,a,a],[b,b]],X).
and returns 
[a,3],[b,2]
到目前为止,我所取得的成就

size_sub(A,Ls):-
maplist(length,A,Ls).
returns 
[3,2]

如何修改现有功能以返回值-数字对。

您可以向maplist传递一个谓词,执行适当的操作,如

size_sub(A,Ls):-
    maplist(list_sym_len,A,Ls).
list_sym_len([Sym|Rest], [Sym, Len]) :- length([Sym|Rest], Len).
或者使用库lambda。在SWI Prolog中,您可以使用

?- pack_install(lambda).
安装后,您有时可以简写您的定义

:- use_module(library(lambda)).
?- maplist(\[Sym|Rest]^[Sym,Len]^length([Sym|Rest], Len), [[a,a,a],[b,c]],R).
R = [[a, 3], [b, 2]].

您需要将不同的谓词传递给
maplist
,而不是
length
。编写一个谓词,比如,
reduce([a,a,a],[a,3]):-…
,在给定
[a,a,a]
时生成
[a,3]
。如果已经假设所有元素都相同,那么这应该很容易。然后调用
映射列表(reduce,A,Ls)。