如何计算列表的长度
?- 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 = [].
首先需要从基本情况开始,也就是最后的答案。
因此,当 X=[]
时,size_sub([],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是一个更简单的情况,按照基本+归纳的过程,你应该能够创建它的规则。如果需要进一步帮助,请留言。
**编辑 - 请求size/2的定义**
定义size/2:
从基本情况开始,空列表的大小为0。
size([],0).
[_|T]
。我使用_来表示头部,因为我们从未使用过它,所以我们可以使用匿名变量。让我们用N来表示T的长度,用M来表示N+1。 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).
size_sub([[]],X)
或者size_sub([],X)
,答案将会是[]
。 - Bob Vale