如何计算列表的长度
?- 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 = [].
Run Code Online (Sandbox Code Playgroud)
要映射length/2列表列表,我们可以使用这样的元谓词 maplist/3:
size_sub(Xss,Ls):-
maplist(length,Xss,Ls).
Run Code Online (Sandbox Code Playgroud)
好的,你需要从基础案例开始,这是最后的答案
所以size_sub([],X).如果是这样的话X=[],首先你要把它写成规则.
size_sub([],[]).
Run Code Online (Sandbox Code Playgroud)
然后,您需要执行归纳步骤,该列表比前一个更长.我将假设您有一个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).
Run Code Online (Sandbox Code Playgroud)
把它们放在一起就可以了
size_sub([],[]).
size_sub([H|T],[N|T2]):-
size(H,N),
size_sub(T,T2).
Run Code Online (Sandbox Code Playgroud)
size/2是一个更简单的情况,并且遵循base + inductive的相同过程,你应该能够为它创建规则.如果您需要进一步的帮助,请评论.
**编辑 - 要求尺寸/ 2定义**
定义大小/ 2
从基本情况开始,空列表的大小为0.
size([],0).
Run Code Online (Sandbox Code Playgroud)
现在是归纳步骤.长度列表(N + 1)的大小是长度(N)列表的大小.所以我们定义我们的列表,因为[_|T]我已经使用_来定义列表来表示头部,因为我们从不使用它,所以我们可以使用匿名变量.让我们使用N来表示T的长度,并使用M来表示N + 1.
所以
大小([_ | T],M): -
现在让我们定义N.
size(T,N),
Run Code Online (Sandbox Code Playgroud)
最后断言M等于N + 1
M is N+1.
Run Code Online (Sandbox Code Playgroud)
把所有东西放在一起
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).
Run Code Online (Sandbox Code Playgroud)