【问题标题】:ListsfromList function in PrologProlog 中的 ListsfromList 函数
【发布时间】:2020-11-20 17:03:35
【问题描述】:

我在序言中编写了一个谓词,其中我给出了两个参数listsFromL(X,B)X 将是一个包含该列表中的列表的列表,B 将是一个包含来自X 的列表的新列表。

因此,例如,如果我调用listsFromL([1,2,[d,a]],X).,则返回值为B = [[d,a]].,如果我向X 添加更多列表,我将得到一个更长的列表,其中列表为X

我该怎么做?

【问题讨论】:

    标签: list prolog


    【解决方案1】:
    listsFromList([],[]) .
    
    listsFromList([HEAD|SOURCEs],[HEAD|TARGETs])
    :-
    is_list(HEAD) ,
    listsFromList(SOURCEs,TARGETs)
    .
    
    listsFromList([HEAD|SOURCEs],TARGETs)
    :-
    \+ is_list(HEAD) ,
    listsFromList(SOURCEs,TARGETs)
    .
    
    /*
    ?- listsFromList([1,2,3,4,[a,b]],X).
    X = [[a, b]] ;
    false.
    
    ?- listsFromList([1,[a,b],2,[c,d],3],X).
    X = [[a, b], [c, d]] ;
    false.
    
    ?- listsFromList([],X).
    X = [].
    
    ?- 
    */
    

    【讨论】:

    • 嗨,非常感谢您的评论。您能否详细说明代码的工作原理。我真的很难理解,我知道你递归地检查列表的头部是否是一个列表,但如果它是一个列表,我真的不知道你何时/如何将头部添加到新列表中。提前致谢!
    • 第二个子句包含 [HEAD|TARGETs] 。这意味着HEAD 被添加到输出列表中。第三个子句仅包含 TARGETs 。这意味着HEAD 没有添加到输出列表中。
    • 是的,我想哈哈...谢谢
    • 所以这是一种头递归/左递归的方式。你将如何以尾递归的方式处理它?
    • "tail-recursive" 表示 Prolog 中重要且特殊的东西,其含义与您对它的使用不同。
    【解决方案2】:

    你需要:

    1. 过滤原始列表的谓词:检测列表的谓词:is_list/1
    2. “高阶”谓词,根据上述情况,将可能包含列表的列表过滤为仅包含列表的列表:include/3

    现在您只需将这两个乐高积木放在一起即可。

    listsFromList(Stuff,OnlyLists) :-
       include(is_list,Stuff,OnlyLists).
    

    所以:

    ?- listsFromList([],OLs).
    OLs = [].
    
    ?- listsFromList([a,b,c],OLs).
    OLs = [].
    
    ?- listsFromList([a,b,[x,y],c],OLs).
    OLs = [[x, y]].
    

    【讨论】:

    • 首先感谢您的评论。我了解 is_list 函数,但我不知道您对 include 函数的意思。到目前为止,我想出了这个 accLists([H|T],LL) :- is_list(H), append(LL,H,NEWLIST), LL is NEWLIST, T. accLists([H|T],LL) : - \+ is_list(H) = false,LL 是 LL,T.lists(List,LL) :- accLists(List, LL)。列表从列表(列表,LL):-列表(列表,LL)。我对这种语言非常陌生,并不真正了解我如何能够递归地浏览列表。
    • @leximus 好的,有一个“详细编码”和一个“工业”解决方案。 Kintalken 向您展示了一个详细的。这个是“工业”的,使用预定义的块。我只剩下几分钟了,我会在上面添加。
    • 非常感谢!我不知道我是否可以使用它,但我会问,哈哈。谢谢
    【解决方案3】:
    listsFromList(SOURCEs,TARGETs)
    :-
    phrase(listsFromList_,SOURCEs,TARGETs)
    .
    
    listsFromList_,[] --> \+ [_] .
    
    listsFromList_,[ITEM] --> [ITEM] , { is_list(ITEM) }  , listsFromList_ .
    
    listsFromList_,[] --> [ITEM] , { \+ is_list(ITEM) } , listsFromList_ .
    
    /*
    
    ?- listsFromList([1,2,3,4,[a,b]],X).
    X = [[a, b]] ;
    false.
    
    ?- listsFromList([1,2,[b,c],3,4,[a,b]],X).
    X = [[b, c], [a, b]] ;
    false.
    
    ?- listsFromList([],X).
    X = [] ;
    false.
    
    ?- 
    */
    

    【讨论】:

      猜你喜欢
      • 2010-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多