Prolog功能输出

时间:2012-02-07 02:00:36

标签: lambda prolog

我正在尝试在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','.','.','.']]

2 个答案:

答案 0 :(得分:3)

您的代码包含三个错误:

  1. 从不使用变量Output。实际上你应该得到一个关于这是一个单例变量的警告。你想要做的是让Output成为changerTableau/4

    头部的最后一个参数

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

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

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

  3. changerTableau/4没有结束递归的子句。因此,您将始终获得no作为答案。将其添加为changerTableau/4

    的第一个子句

    changerTableau(_,[],TableauVide,TableauVide)。

  4. 这应该让您的代码正常工作,尽管您可以简化它以完全摆脱第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).