Prolog:将列表向右旋转 n 次

2023-12-15

在谓词上工作,rotate(L,M,N), where L是一个通过旋转形成的新列表M向右N times.

我的方法是只添加尾部M到它的头上N times.

rotate(L, M, N) :- 
   (  N > 0,
      rotate2(L, M, N)
   ;  L = M
   ).

rotate2(L, [H|T], Ct) :- 
   append(T, [H], L), 
   Ct2 is Ct - 1, 
   rotate2(L, T, Ct2).

目前,我的代码返回L等于原来的M,无论怎样N被设定为。 似乎当我递归时,尾部没有正确移动到头部。


您可以使用append拆分列表,以及length创建列表:

% rotate(+List, +N, -RotatedList)
% True when RotatedList is List rotated N positions to the right
rotate(List, N, RotatedList) :-
    length(Back, N),           % create a list of variables of length N
    append(Front, Back, List), % split L
    append(Back, Front, RotatedList).

注意:这仅适用于 N

为清楚起见进行编辑该谓词定义为List and N调用谓词时,参数不是变量。我无意中重新排序了您原来问题中的参数,因为在 Prolog 中,约定是严格输入参数应位于输出参数之前。所以,List and N和输入参数,旋转列表是一个输出参数。所以这些是正确的查询:

?- rotate([a,b,c], 2, R).
?- rotate([a,b,c], 1, [c,a,b]).

但是这个:

?- rotate(L, 2, [a,b,c]).

找到一个答案后就会进入无限递归。

阅读 SWI-Prolog 文档时,请留意标有“?”的谓词参数,如length。它们可以如本例所示使用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Prolog:将列表向右旋转 n 次 的相关文章

  • Prolog 中的否定作为失败是一种程序行为吗?

    我有一个关于否定即失败在 Prolog 语言中 这是一个理论性多于实践性的问题 因为我清楚这个例子是如何工作的 所以我有以下 Prolog 程序 Fatti che specificano quali esseri sono degli a
  • 使用 Prolog 中的累加器计算多项式的计算问题

    背景 我需要编写一个谓词 eval P A R 其中 P表示多项式系数列表 即1 2x 3x 2表示为 1 2 3 A 代表 X 的值 R 是 X A 处多项式的结果 Example eval 3 1 2 3 R 产生 R 24 编辑 之前
  • 如何确定矩阵的所有给定坐标都是相连的?

    给定一个网格 我如何确定网格的元素是否都在单个区域中 在下面的情况下是正确的 因为矩阵中的每个元素都有一个邻居 示例1 gridneighbours 1 1 1 2 1 3 2 1 2 2 2 3 3 1 4 1 4 2 true 然而在我
  • Prolog 中的失败谓词有什么用?

    我想不出我需要它的情况 优雅的系统提供false 0作为命令式的声明式同义词fail 0 它有用的一个例子是当您想要手动强制回溯副作用时 例如 between 1 3 N format line w n N false line 1 lin
  • Prolog 中的掩码

    我最近一直在尝试理解 Prolog 并且一直在搞乱 Prolog 中的列表列表 我正在尝试创建一种我想在 p 中的面具 序言 我有一个谓词 它确定 Prolog 中两个列表列表 比如说 L1 和 L2 之间的差异 并将它们保存为列表列表 比
  • 函数式语言中的多线程? (序言)

    当我的朋友在学校开始学习 Prolog 时 我嘲笑他学习了一门无用的语言 然而 他向我展示了一些我从来不知道可能发生的东西 我想知道这个技术从何而来 技术是这样的 permutation List isAMember X List dele
  • 编写 Prolog 谓词的最佳实践是什么,以便它以指定参数的不同方式工作

    我正在尝试实现一些简单的谓词 例如 my length 或 my append 如果我们事先知道我们想要找到列表的长度 或者我们想要附加两个列表 这对我来说很容易 即我知道什么是输入 什么是输出 在 Prolog 中 可以用其他方式做事 如
  • 如何声明两个列表具有相同的长度?

    我需要知道如何比较 Prolog 中两个列表的长度 这是我到目前为止所拥有的 sum N1 N2 checklength N1 N2 checklength N1 N2 L1 is length N1 What L2 is length N
  • Prolog 程序从列表中删除每个第 n 个元素

    您能帮我解决以下问题吗 编写三元谓词delete nth从列表中删除每个第 n 个元素 样本运行 delete nth a b c d e f 2 L L a c e false delete nth a b c d e f 1 L L f
  • 针对数字板难题的优化 CLP(FD) 求解器

    考虑问题从https puzzling stackexchange com questions 20238 explore the square with 100 hops https puzzling stackexchange com
  • Prolog - 删除非唯一元素

    我有一个谓词来检查元素是否是列表的成员 并且看起来如下 member X X member X T member X T 当我打电话时 member 1 2 3 1 4 我明白了 是的 现在我必须使用它来编写谓词 该谓词将从列表列表中删除所
  • 如何在 swi-prolog 的 prolog 文件中运行 prolog 查询?

    如果我有一个定义规则的 prolog 文件 并在 Windows 中的 prolog 终端中打开它 它会加载事实 然而 然后它显示 提示我手动输入一些内容 如何将代码添加到文件中 以便它实际上会评估这些特定的语句 就像我输入它们一样 像这样
  • 如何在 Prolog 中为变量(如字符串)分配多个值?

    今天早些时候 我寻求帮助以在序言中构建数据库以及如何通过参数搜索 有人提出了这个 您还可以向每个处理器添加术语列表 例如 processor pentium g4400 brand intel family pentium series g
  • Prolog - 从列表中删除具有相同第一个值的对

    我有这样的对象列表 list obj x y obj x z obj a b obj b c 我想删除那些共享相同第一个值的元素 这样我就可以使用修改后的列表 在这种情况下 最终列表将如下所示 list obj a b obj b c 有人
  • 如何从序言中的列表中删除列表?

    我想在序言中实现以下问题 Given L1 1 2 3 4 and L2 2 3 4 调用名为remove list L1 L2 L 的函数将从L1中删除L2 所以L将是 1 但是 如果第二个列表的元素与 L1 中的元素顺序不同 或者更准确
  • 如何在 Prolog 中计算数字序列的和

    任务是计算从0到M的自然数之和 我使用SWI Prolog编写了以下代码 my sum From To From gt To my sum From To S From 0 Next is 1 S is 1 my sum Next To S
  • 在 prolog 中读取用户输入的字符串

    我是 Prolog 初学者 我正在使用 swi prolog 刚刚开始使用它 我需要将用户输入字符串拆分到列表中 我尝试了以下代码 但出现错误 指出 在子句正文中完全停止 无法重新定义 2 write Enter the String nl
  • SWI Prolog 使用的检查优化会发生什么情况?

    去引用SICStus Prolog 手册 https sicstus sics se sicstus docs 3 12 9 html sicstus Occur html 逻辑编程背后的通常数学理论禁止 创建循环项 规定发生检查应该是 每
  • 以系统的方式报告 Prolog 中查询失败的“原因”

    我正在 Prolog 中寻找一种方法 模式或内置功能 我可以用它来返回why一组谓词失败 至少就数据库中的谓词而言 当用户在系统中提出查询时 我试图能够说的不仅仅是 那是错误的 例如 假设我有两个谓词 blue 1如果某物是蓝色的 则为真
  • 根据一个值找到列表内列表的最小值

    我在序言中有这个列表 dublin london 1000 dublin moscow london 5000 我想计算列表的最小值 这样答案应该是 dublin london 1000 这个问题有一些类似的问题序言中列表列表中的最小值 h

随机推荐