Prolog长度列表

时间:2011-09-15 19:45:49

标签: 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 = [].

2 个答案:

答案 0 :(得分:7)

要在列表列表中映射length/2,我们可以像这样使用 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).