Prolog长度列表

Mar*_*ary 3 list prolog

如何计算列表的长度

?- 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)

Tha*_*dis 7

要映射length/2列表列表,我们可以使用这样的 maplist/3:

size_sub(Xss,Ls):-
    maplist(length,Xss,Ls).
Run Code Online (Sandbox Code Playgroud)


Bob*_*ale 6

好的,你需要从基础案例开始,这是最后的答案

所以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)