将列表作为输入(以下面提到的格式),我需要得到输出,这是一个简单的列表列表,如果给定的输入列表为空,则谓词应该返回一个空列表,
给出输入
[[[a,b],[c]],[[d,e]],[[g,h],[j,k]],[[h,k,l,l]]]
我需要输出
[[a,b],[c],[d,e],[g,h],[j,k],[h,k,l,l]]
我在执行递归时遇到了麻烦,
我尝试的代码如下,
function([],X):-append([],X,X).
function([Head|Tail],X):-
first(Tail,A),
append(Head,A,X),
removehead(Tail,C),
function(C,X).
谓词首先返回列表的第一个元素,removehead删除列表的第一个元素。
答案 0 :(得分:1)
您对共享的代码进行了公平的尝试。以下是您需要改进的事项:
fucntion
描述了当第一个参数是列表时,此谓词有一个解决方案的事实。这通常在文档中完成,例如%! function(+Nested:list, -Denested:list) is det.
append([], X, X)
是一个列表,X
的定义是正确的,所以这里是多余的。first/2
,removehead/2
?如果要实例化列表的第一个元素,还可以将子句头参数编写为[Head,A|C]
。然后,您也无需明确地从Tail
删除头部。根据上述内容进行更改后,我想出了以下代码:
%! denest(+Nested:list, -Denested:list) is det.
denest([], []).
denest([H|T1], L):-
denest(T1, T2),
append(H, T2, L).
示例运行:
?- denest([[[a,b],[c]],[[d,e]],[[g,h],[j,k]],[[h,k,l,l]]], L).
L = [[a, b], [c], [d, e], [g, h], [j, k], [h, k, l|...]].
希望这有帮助!