【问题标题】:Reverse the last two elements of a list in Prolog反转Prolog中列表的最后两个元素
【发布时间】:2017-09-25 09:08:15
【问题描述】:

我正在尝试在 Prolog 中编写以下谓词,而 使用append/3

lastTwoReversed(List, ListOf2)

ListOf2 按该顺序包含List 的最后一个和倒数第二个元素时(即颠倒),该方法成功。

但是,我不知道从哪里开始。任何帮助表示赞赏。

【问题讨论】:

标签: list prolog


【解决方案1】:

您可以编写一个简单的递归谓词,并在由两个元素组成的列表上匹配基本案例模式,如下所示:

last_two_reversed([X,Y],[Y,X]).

由于这可能是家庭作业,我认为最好自己编写递归子句。

【讨论】:

    【解决方案2】:

    只需使用内置谓词reverse/2

    last_two_reversed([A,B|T],[Y,X]) :-
        reverse([A,B|T],[Y,X|_]).
    

    对于严格少于两个元素的列表,这将失败。明智的做法是使用这两个附加规则使其成功:

    last_two_reversed([],[]).
    last_two_reversed([H],[H]).
    

    【讨论】:

    • 此版本占用的空间与列表的长度成正比。
    【解决方案3】:

    首先,谓词应该是空列表还是只有一个元素的列表失败或成功??
    在数学逻辑中,谓词应该在空列表和单元素列表的情况下返回 true,因为没有要反转的最后一个和倒数第二个元素。

    因此,如果您想成功使用空列表或一个元素列表,您应该首先从 :

      lastTwoReversed([],[]).
      lastTwoReversed([X],[X]).
    

    (否则不要写上面的规则)。 接下来作为基础你应该写:

    lastTwoReversed([X,Y],[Y,X]).

    最后是长度为 3 或更大的列表:

    lastTwoReversed([X,Y,Z|T],[X|T1]):-lastTwoReversed([Y,Z|T],T1).
    

    请记住,我们编写 [X,Y,Z|T] 是为了指定具有 3 个或更多元素的列表,因此与之前的规则不匹配。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-09
      • 1970-01-01
      • 2020-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-10
      相关资源
      最近更新 更多