【问题标题】:checking common letters in a certain index in a list of lists检查列表列表中某个索引中的常用字母
【发布时间】:2020-04-26 16:10:21
【问题描述】:

所以我有这个谓词letras_comuns(Lst,Common_ltrs),其中 Lst 是像 [[a,n,o],[a,c,o],[a,t,o]] 这样的单词列表,Commons_ltrs 是所有这些单词中的公共字母在某个索引处的结果。

例子:

Lst_Pals = [[a,t,o], [a, c, o], [a,n,o], [a,l,o]], letras_comuns(Lst_Pals, Letras_comuns).
Lst_Pals = [[a,t,o], [a, c, o], [a,n,o], [a,l,o]],
Letras_comuns = [(1, a),(3, o)].

所以这个[(1, a), (3, o)]. 的意思是所有单词在第一个索引处都有一个a,并且所有单词在第三个索引处都有一个o

为此我做了这个辅助谓词letras_comuns_aux(Lst,Letra_comum,Index).,其中Lst与以前相同,Letra_comum 是给定索引处所有单词中的通用字母,如[(1, a)] 并索引特定索引。

例子:

?- letras_comuns_aux([[a,t,o], [a, c, o], [a,n,o], [a,l,o]],Letra_comum,1).
Letra_comum = [(1, a)].

?- letras_comuns_aux([[a,t,o], [a, c, o], [a,n,o], [a,l,o]],Letra_comum,3).
Letra_comum = [(3, o)].

所以基本上这是在给定索引处给出我想要的结果,并且这个谓词工作正常,话虽如此,我试图做的是对 Lst 中的所有索引进行此验证。

问题是,由于某种原因,这会产生无限循环,我不明白为什么。

程序:

letras_comuns_aux([],AC,_,_,AC) :- !.
letras_comuns_aux([P|R],Letra_comum,Index,El,_) :-
         nth1(Index,P,Ind_P),
         Ind_P == El,!,
         NAC = [(Index,El)],
         letras_comuns_aux(R,Letra_comum,Index,El,NAC).
letras_comuns_aux(_,Letra_comum,Index,El,_) :-
         NAC = [],!,
         letras_comuns_aux([],Letra_comum,Index,El,NAC).

letras_comuns(Lst_Pals, Letras_comuns) :-
   length(Lst_Pals,C),
   NC is C + 1,
   letras_comuns(Lst_Pals,Letras_comuns,[],NC,1).

letras_comuns(_, AC,AC,Comp,Comp).
letras_comuns(Lst_Pals, Letras_comuns,AC,Comp,Cont) :-
   letras_comuns_aux(Lst_Pals,Letra_comum,Cont),
   append(AC,Letra_comum,NAC),
   NCont is Cont +1,
   letras_comuns(Lst_Pals, Letras_comuns,NAC,Comp,NCont).

【问题讨论】:

    标签: list prolog


    【解决方案1】:

    这显然是一个无限循环:

    letras_comuns_aux(_,Letra_comum,Index,El,_) :-
             NAC = [],!,
             letras_comuns_aux([],Letra_comum,Index,El,NAC).
    

    在每次调用时,NAC 是一个新变量,它显然会绑定空列表,然后递归调用将接收这样的空列表作为最后一个参数。它的目的是什么?

    现在请原谅我的懒惰,但要理解您的程序显然比提出一种更简单的惯用方式要多:

    letras_comuns(Lst_Pals, Letras_comuns) :-
        findall((L,I), foreach(member(X,Lst_Pals),nth1(I,X,L)), Letras_comuns).
    

    这给了

    ?- Lst_Pals = [[a,t,o], [a, c, o], [a,n,o], [a,l,o]],
    |        letras_comuns(Lst_Pals, Letras_comuns).
    Lst_Pals = [[a, t, o], [a, c, o], [a, n, o], [a, l, o]],
    Letras_comuns = [(a, 1),  (o, 3)].
    

    并且由foreach/2 实现,它在Generator 的连续调用中保持变量绑定。

    【讨论】:

      猜你喜欢
      • 2022-01-18
      • 1970-01-01
      • 1970-01-01
      • 2017-03-13
      • 1970-01-01
      • 2019-02-28
      • 1970-01-01
      • 1970-01-01
      • 2014-12-08
      相关资源
      最近更新 更多