【问题标题】:Prolog function outputProlog函数输出
【发布时间】:2012-10-26 04:59:27
【问题描述】:

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

【问题讨论】:

    标签: lambda prolog


    【解决方案1】:

    您的代码包含三个错误:

    1. 变量Output 从未使用过。实际上,您应该收到关于这是一个单例变量的警告。你要做的就是让Output成为changerTableau/4头部的最后一个参数:

      changerTableau(N,[Ligne|Reste],TableauVide,Output):-

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

    【讨论】:

    • 非常感谢。这正是我想要做的:)
    【解决方案2】:

    如果您的系统有 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).
    

    【讨论】:

      猜你喜欢
      • 2019-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-10
      • 1970-01-01
      相关资源
      最近更新 更多