List 附加列表序言

List 附加列表序言,list,prolog,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):-

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

给定输入

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

您在共享的代码中进行了公平的尝试。以下是您需要改进的地方:

  • 谓词名称
    function
    描述了这样一个事实,即每当第一个参数是列表时,该谓词都有一个解决方案。这通常在文档中完成,例如
    %!函数(+Nested:list,-Denested:list)是det.
  • append([],X,X)
    如果
    X
    是一个列表,那么它在这里是多余的
  • 什么是
    first/2
    removeehead/2
    ?如果要实例化列表的第一个元素,还可以将子句head参数写成
    [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|...]].
    

    希望这有帮助

    给定列表作为输入(以上面提到的格式),我需要得到一个简单的列表输出,如果给定的输入列表是空的,那么谓词应该返回一个空列表。把这个问题放到问题中!感谢您的输入,我不知道如何编写您提到的head参数,这促使我首先编写/2并删除head/2。@sand Prolog是一种非常优雅的语言:您在其中编程的时间越长,程序就会越短:-)