我正在尝试在prolog中执行一项功能,以便在列表列表中添加项目。我想要做的是在第一个列表的末尾添加1个项目,在第二个列表的末尾添加2个项目等。
我写这篇文章开始:
changerTableau(N,[Ligne|Reste],TableauVide,NouveauTableau):-
repeter(N,'.',Point),
append(Ligne,Point,NouvelleLigne),
append(TableauVide,NouvelleLigne,NouveauTableau),
writeln(N),
N2 is N+1,
writeln(NouveauTableau),
changerTableau(N2,Reste,NouveauTableau,Output).
repeter(0,_,[]):-!.
repeter(N,Item,[Item|Reste]):-
N2 is N - 1,
repeter(N2,Item, Reste).
所以我想让程序做的是,如果我从那开始:
changerTableau(1,[['x','w'],['a','b'],['l','o','l']],[ ],Resultat).
我希望输出:
Resultat = [['x','w','.'],['a','b','.','.'],['l','o','l','.','.','.']]
答案 0 :(得分:3)
您的代码包含三个错误:
从不使用变量Output
。实际上你应该得到一个关于这是一个单例变量的警告。你想要做的是让Output
成为changerTableau/4
:
changerTableau(N,[利涅| Reste],TableauVide,输出): -
您想构建一个列表列表。但是,当您将NouvelleLigne
附加到TableauVide
时,您只需将列表附加到列表中,从而生成列表,而不是列表列表。你需要这样做:
追加(TableauVide,[NouvelleLigne],NouveauTableau),
changerTableau/4
没有结束递归的子句。因此,您将始终获得no
作为答案。将其添加为changerTableau/4
:
changerTableau(_,[],TableauVide,TableauVide)。
这应该让您的代码正常工作,尽管您可以简化它以完全摆脱第2点中的append
:
changerTableau(_, [], []).
changerTableau(N,[Ligne|Reste],[NouvLigne|NouvReste]):-
repeter(N,'.',Point),
append(Ligne,Point,NouvLigne),
N2 is N+1,
changerTableau(N2,Reste,NouvReste).
答案 1 :(得分:1)
如果你的系统有一个,你也可以考虑使用maplist:
changerTableau([], []) :- !.
changerTableau(List, [Head|Result]) :-
maplist(append_(['.']), List, [Head|Tail]),
changerTableau(Tail, Result).
append_(A, B, C) :- append(B, A, C).
或者,使用lambda模块:
changerTableau([], []) :- !.
changerTableau(List, [Head|Result]) :-
maplist(\X^Y^append(X, ['.'], Y), List, [Head|Tail]),
changerTableau(Tail, Result).