Prolog列表长度

3

如何计算列表的长度

?- 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 = [].

1
那最后一个正确吗?为了保持一致,应该是 size_sub([[]],X) 或者 size_sub([],X),答案将会是 [] - Bob Vale
2个回答

6

首先需要从基本情况开始,也就是最后的答案。

因此,当 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).

现在是归纳步骤。长度为(N+1)的列表大小等于长度为N的列表大小。因此,让我们定义一个列表[_|T]。我使用_来表示头部,因为我们从未使用过它,所以我们可以使用匿名变量。让我们用N来表示T的长度,用M来表示N+1。
因此,
size([_|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).

我不知道如何创建size/2。 - Mary

6

要将 length/2 映射到一个列表的列表上,我们可以使用 maplist/3,如下所示:

size_sub(Xss,Ls):-
    maplist(length,Xss,Ls).

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接