如何计算列表的长度
?- size_sub([[b,a,g], [9,3,7,4], [6]], X).
X = [3, 4, 1].
?- size_sub([[c,g,e,w], [7]], X).
X = [4, 1].
?- size_sub([], X).
X = [].
答案 0 :(得分:7)
要在列表列表中映射length/2
,我们可以像这样使用meta-predicate maplist/3
:
size_sub(Xss,Ls):-
maplist(length,Xss,Ls).
答案 1 :(得分:6)
好的,你需要从作为最后答案的基本案例开始
所以size_sub([],X).
如果X=[]
为真,那么首先你要写它。
size_sub([],[]).
然后,您需要执行归纳步骤,该列表比前一个更长。我将假设您有一个size / 2函数来确定单个列表的大小(如果没有请注释)。
因此,归纳步骤将在第一参数的长度上操作,因此N> N + 1。我们通过剥离列表语法的头部来表示这将是[H|T]
现在第二个参数(你的答案)将是H的长度,结果是在T上调用size_sub。因为我们不能指定规则在标题中的参数中,我们将使用N来表示H和T2的长度,以表示T上size_sub的结果。
因此,规则的第一部分变为size_sub([H|T],[N|T2]):-
现在我们使用谓词来跟随它,该谓词将断言N和T2的值。
size(H,N),
size_sub(T,T2).
将所有这些放在一起
size_sub([],[]).
size_sub([H|T],[N|T2]):-
size(H,N),
size_sub(T,T2).
size / 2是一个更简单的情况,并且遵循base + inductive的相同过程,你应该能够为它创建规则。如果您需要进一步的帮助,请发表评论。
**编辑 - 请求大小/ 2定义**
定义尺寸/ 2
从基本情况开始,空列表的大小为0。
size([],0).
现在是归纳步骤。长度列表(N + 1)的大小是长度(N)列表的大小。因此,我们将列表定义为[_|T]
我使用_来定义列表以表示头部,因为我们从不使用它,所以我们可以使用匿名变量。让我们使用N来表示T的长度,并使用M来表示N + 1.
所以
大小([_ | T],M): -
现在让我们定义N
size(T,N),
最后断言M等于N + 1
M is N+1.
所以把所有东西放在一起
size([],0).
size([_|T],N):-
size(T,M),
N is M+1.
size_sub([],[]).
size_sub([H|T],[N|T2]):-
size(H,N),
size_sub(T,T2).