2012-02-07 96 views
0

我想在prolog中做一个函数来添加列表中的项目。我想要做的是在第一个列表,在第二列表的最后2项等Prolog函数输出

我写的末尾添加1个项目是否启动:

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','.','.','.']] 

回答

3

您的代码包含s三个错误:

  1. 从不使用变量Output。你实际上应该得到一个关于这是一个单身变量的警告。你想要做的是使OutputchangerTableau/4头的最后一个参数:

    changerTableau(N,[利涅| Reste],TableauVide,输出): -

  2. 要构造一个列表的列表。但是,当您将NouvelleLigne附加到TableauVide时,您只需将一个列表附加到列表中,即可生成列表,而不是列表的列表。你需要做的是这样的:

    追加(TableauVide,[NouvelleLigne],NouveauTableau),

  3. 有表示结束递归没有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). 
+0

非常感谢。这正是我想要做的:) – Ichiban 2012-02-08 00:54:06

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).