0

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

到目前为止,这是我尝试过的 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,并且我们只是递归到“扁平化”Vars(剩余的列表列表)

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

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

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

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

于 2012-10-02T19:39:37.143 回答