GNU prolog如何将列表列表放入单个列表中

时间:2012-10-02 18:02:06

标签: list prolog

所以我有一个列表[[],[1],[2,3]]列表,我希望将它合并到一个列表中。

这是我到目前为止尝试过的GNU Prolog:

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

但是当我得到数字1时,这就失败了,现在已经尝试了几个小时。

希望你能提供帮助:)

1 个答案:

答案 0 :(得分: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 一个列表,那么我们将立即使用它作为参数来追加/ 3来获取Var,我们只是递归到“扁平化”Vars(其余列表列表)< / p>

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

确实,我们解决了这个问题:

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

但有一个错误,不容易发现。事实证明,解决它也使程序更有效。看看你是否能找到解决它的错误......