この一般化を考慮すると、次のようになります。
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].
しかし、見つけにくいバグがあります。それを解決することで、手順がより効率的になることがわかりました。バグを見つけて解決できるかどうかを確認してください...