【问题标题】:return first two element and last two element from the list从列表中返回前两个元素和最后两个元素
【发布时间】:2021-11-12 15:31:37
【问题描述】:

有人可以帮我解决这个问题吗,Prolog 语言 从列表中查找前两个元素和后两个元素

答案应该是这样的。

?- my_list([a,b, [c,[h], d], [] ,e, h], Q).
Q = [a,b,e,h]

【问题讨论】:

    标签: prolog


    【解决方案1】:

    一个简单的解决方案是:

    my_list([X1,X2|Xs], [X1,X2,X3,X4]) :- reverse(Xs, [X4,X3|_]).
    

    它是如何工作的?

    • 要获取列表的前两个元素(X1 和X2),只需使用统一:
    ?- [a,b, [c,[h], d], [] ,e, h] = [X1,X2|Xs].
    X1 = a,
    X2 = b,
    Xs = [[c, [h], d], [], e, h]. 
    
    • 要获取最后两个元素(X3 和X4),可以使用reverse/2 和统一:
    ?- [a,b, [c,[h], d], [] ,e, h] = [X1,X2|Xs], reverse(Xs, [X4,X3|_]).
    X1 = a,
    X2 = b,
    Xs = [[c, [h], d], [], e, h],
    X4 = h,
    X3 = e.
    

    【讨论】:

      【解决方案2】:
      my_list(List, Result) :-
          Result = [A,B,Y,Z],
          append([A,B],  Tail, List),
          append(    _, [Y,Z], Tail). 
      

      告诉 Prolog 寻找答案,其中 Result 必须是四个元素的列表,前两个元素必须符合位于列表前面的模式,其余部分在 Tail 中,后两个必须符合位于剩余部分的末尾,将我们丢弃的列表中间留给_,因为我们不关心它。

      您可以改用nth1/3 通过索引来挑选列表元素; nth1(2, List, Elem) 获取第二个元素。最后一个索引来自 length(List, Len) 并使用数学计算最后一个索引。

      或者您可以使用模式匹配来构建谓词来匹配列表[A,B|Tail] 中的前两个项目和两个项目[Y,Z] 的列表,并使用递归来修剪尾巴,直到它只有两个元素。然后将它们合并到 my_list 中。

      【讨论】:

        【解决方案3】:

        在 Prolog 民间传说中有 append/2,它提供了一个简单的解决方案:

        my_list(List,[A,B,Y,Z]) :-
          append([[A,B],_,[Y,Z]],List).
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-03-03
          • 1970-01-01
          • 1970-01-01
          • 2021-07-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多