附加列表序言

时间:2014-10-23 07:17:53

标签: list prolog

将列表作为输入(以下面提到的格式),我需要得到输出,这是一个简单的列表列表,如果给定的输入列表为空,则谓词应该返回一个空列表,

给出输入

[[[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删除列表的第一个元素。

1 个答案:

答案 0 :(得分:1)

您对共享的代码进行了公平的尝试。以下是您需要改进的事项:

  1. 谓词名fucntion描述了当第一个参数是列表时,此谓词有一个解决方案的事实。这通常在文档中完成,例如%! function(+Nested:list, -Denested:list) is det.
  2. 如果append([], X, X)是一个列表,
  3. X的定义是正确的,所以这里是多余的。
  4. 什么是first/2removehead/2?如果要实例化列表的第一个元素,还可以将子句头参数编写为[Head,A|C]。然后,您也无需明确地从Tail删除头部。
  5. 根据上述内容进行更改后,我想出了以下代码:

    %! 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|...]].
    

    希望这有帮助!