【发布时间】: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).
【问题讨论】: