所以我有一个列表 [[],[1],[2,3]] 的列表,我想将它合并到一个列表中。
到目前为止,这是我尝试过的 GNU Prolog:
function([],[]).
function([Varlist|Vars],Var):-
function(Varlist,Var1),
function(Vars,Var2),
append(Var1,Var2,Var).
但是当我得到数字 1 时这失败了,现在已经尝试了几个小时。
希望你能帮忙:)
如果您考虑这种概括:
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并解决它...