计算列表列表的元素PROLOG

时间:2018-12-18 17:06:12

标签: prolog

我正在尝试计算列表中的元素 列表。

我以这种方式实现了代码:

len1([],0).
len1([_X|Xs],N) :- len1(Xs,N1), N is N1+1.

clist([[],[]],0).
clist([Xs,Ys],N):-  len1(Xs,N1),len1(Ys,N2),N is N1+N2.
我重新使用列表中的count元素(len1谓词),并且看起来很有效。 任何人都可以说我做得好,很差或可以做,但是最好是其他人(没有len1)。

我不认为这是一个好的实现,而其他似乎也不是通用的。

广告示例仅适用于列表,列表内部包含两个列表。如果我想使通用?我认为需要使用_Xs,但是我尝试更改我的代码并且无法正常工作。 特别是我尝试更改此内容:

clist([Xs,Ys],N):-  len1(Xs,N1),len1(Ys,N2),N is N1+N2.

clist([_Xs],N):-  len1(_Xs,N1),N is N1.

显然不起作用。

3 个答案:

答案 0 :(得分:1)

您可以对clist/2谓词应用 same 技巧:您可以考虑以下两种情况,而不是解决包含两个元素的列表的问题:

  1. 一个空列表[],在这种情况下,总数当然为零;和
  2. 非空列表[H|T],其中H是列表,而T是其余列表的列表。在这种情况下,我们首先计算H的长度,然后计算(通过递归)T中列表的总和,然后将它们加在一起。

因此我们可以将其实现为:

clist([], 0).
clist([H|T], N) :-
    length(H, HN),
    clist(T, TN),
    N is HN + TN.

可以通过使用累加器来改善上述情况:我们可以定义一个谓词clist/3,该谓词具有一个变量,该变量可以存储列表 this 中的元素总数,以防万一到达列表的末尾,我们用该变量统一答案,例如:

clist(L, N) :-
    clist(L, 0, N).

clist([], N, N).
clist([H|T], N1, N) :-
    length(H, HN),
    N2 is N1 + HN,
    clist(T, N2, N).

答案 1 :(得分:0)

是的,您想概括您的定义是正确的。代替

clist([[],[]],0).

(嗯,首先应该是

clist( [] , 0).

继续...)和

clist([Xs,Ys], N):-  len1(Xs,N1), len1(Ys,N2), N is N1+N2.

处理一个列表中的两个列表,将其更改为

clist([Xs|YSs], N):-  len1(Xs,N1), len1(YSs,N2), N is N1+N2.

处理列表中任意数量的列表。但是现在第二个len1误用了。它接收一个列表列表,而不仅仅是以前的列表。面对必须处理列表(YSs)才能处理列表([Xs|YSs])的问题,我们回到了起点。我们是真的吗?

不完全是。我们已经有了处理列表列表的谓词-我们正在定义clist!等一下我们定义好了吗?我们还没有完成写下来,是的,但是我们会的。当我们完成记录后,我们将进行定义。递归是信仰的飞跃:

clist([Xs|YSs], N):-  len1(Xs,N1), clist(YSs,N2), N is N1+N2.

此外,列表YSs的第二个列表比[Xs|YSs] 是关键。

如果列表是任意深嵌套的,则递归将是

clist([XSs|YSs], N):-  clist(XSs,N1), clist(YSs,N2), N is N1+N2.

具有适当修改的基本案例。

递归是信念的飞跃:假设我们已经有了解决方案,可以使用它来处理手头问题的较小子情况,只需合并结果即可—有了就可以了!我们假定拥有的解决方案之所以存在,是因为我们将其当作已经存在的方式来使用。

recursion(   Whole, Solution ) :-
    problem( Whole,           Shell, NestedCases),
    maplist( recursion,              NestedCases, SolvedParts),
    problem(        Solution, Shell,              SolvedParts).

一个俄罗斯俄罗斯套娃一直到最下层的问题,都变成了从最深层开始一直回升的解决方案。但是关键是,我们依靠依靠递归来处理内部的套娃,但是许多 it 层次可能嵌套在她的内部。我们只拆开并重新组装 one -最顶部。

答案 2 :(得分:0)

howMany([],_,0).

howMany([Head|Tail],X,Times):-
    \+(Head = X),
    howMany(Tail,X,Times1),
    Times is Times1.

howMany([Head|Tail],X,Times):-
    Head = X,
    howMany(Tail,X,Times1),
    Times is Times1 +1.
相关问题