【问题标题】:Prolog, produce lists with m first members reversed [closed]Prolog,生成 m 个第一个成员反转的列表 [关闭]
【发布时间】:2020-12-14 20:59:00
【问题描述】:

我在 Prolog 中找不到以下问题的解决方案。

假设我们有一个包含 N+1 个成员的列表(即 [X1, X2, X3, ..., XN, X(N+1)])。我们想在 prolog 中编写一个谓词(带有递归),它生成所有可能的列表,这些列表已经反转了它们的前 m 个成员,其中 m 取值 2必须采用

形式
move(List1, List2):-

其中 List1 是原始列表,List2 是 m 个第一个成员反转后的结果列表。

非常感谢任何帮助。

提前致谢

【问题讨论】:

  • 您可以通过组合谓词append(P,S,L)(将列表L分解为前缀P和后缀S)和reverse(P,R)(转换列表@987654327)来获得所需的结果@进入对应的反向列表R)。

标签: recursion prolog predicate


【解决方案1】:

不应该比这更难

reverse_n(Xs,N,Ys) :-   % reverse the first N of Xs to form Ys:
    length(Pfx,N),      %   - construct a list of unbound vars of length N
    append(Pfx,Sfx,Xs), %   - partition the source list into a Pfx and Sfx
    reverse(Pfx,Rev),   %   - reverse the prefix
    append(Rev,Sfx,Ys). %   - Finally, glue it back together

【讨论】:

  • 感谢您的及时答复。提议的解决方案在某种程度上接近我正在寻找的,但不完全是。实际上我需要反转过程从列表的第二个成员开始(因为没有必要反转空列表或列表的第一个元素,因为它返回相同的列表)并在 (n-1) 之后立即终止第一个成员。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-02
  • 1970-01-01
  • 2013-01-13
相关资源
最近更新 更多