0

したがって、リスト [[]、[1]、[2,3]] のリストがあり、これを 1 つのリストにマージしたいと考えています。

これは私がこれまでに試したGNU Prologです:

function([],[]).
function([Varlist|Vars],Var):-
  function(Varlist,Var1),
  function(Vars,Var2),
  append(Var1,Var2,Var).

しかし、これは私がナンバー1を出すと失敗し、今何時間も試みています。

あなたが助けてくれることを願っています:)

4

1 に答える 1

0

この一般化を考慮すると、次のようになります。

function1(L, L).
function1([Varlist|Vars],Var) :-
    function1(Varlist,Var1),
    function1(Vars,Var2),
    append(Var1,Var2,Var).

必要以上のものが得られることがわかります。

?- function1([[],[1],[2,3]], R).
R = [[], [1], [2, 3]] ;
R = [[1], [2, 3]] ;
R = [1, [2, 3]] ;
R = [1, 2, 3] ;
false.

最後のソリューションだけを保持する必要があります。それほど簡単ではありません... 元のコードに戻します:

function2([], []).
function2([Varlist|Vars],Var) :-
    ...

Varlistリストであると仮定すると、append/3 への引数としてすぐに使用して Var を取得し、Var (リストの残りのリスト) を「フラット アウト」するために再帰します。

function2([], []).
function2([Varlist|Vars], Var) :-
    function2(Vars, VarTemp1),
    append(Varlist, VarTemp1, Var).

実際、問題を解決します。

?- function2([[],[1],[2,3]], R).
R = [1, 2, 3].

しかし、見つけにくいバグがあります。それを解決することで、手順がより効率的になることがわかりました。バグを見つけて解決できるかどうかを確認してください...

于 2012-10-02T19:39:37.143 に答える