2012-02-07 97 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).