将列表 1 中的特定数字与列表 2 中的特定数字交换

2024-02-29

最近在温习一些Prolog。我有点喜欢随机提出问题来尝试解决,然后解决它们。但这是相当困难的,我不是一个会放弃我已经着手解决的问题的人。

问题:我想创建一个谓词,它有 2 个预先确定的列表,2 个要交换的数字,然后在交换完成后输出列表。

进一步说明:我想从列表 1 中找到一个特定的唯一编号,然后将其与列表 2 中的特定唯一编号交换,这样如果我有 2 个列表... [7,2,7,8,5] 和 [1,2,3,8,7,9,8],然后给谓词 2 个数字(就说 8 和 7),然后是数字 8 和数字 7 将在列表之间交换当且仅当数字 8 在第一个列表中,数字 7 在第二个列表中。 (它将忽略第二个列表中的 8 和第一个列表中的 7)。

带有预期答案的示例查询:

?- bothSwap([7,2,7,8,5],[1,2,3,8,7,9,8],8,7,X,Y).
X = [7,2,7,7,5], Y = [1,2,3,8,8,9,8].

我此时有点陷入困境:

bothSwap([],L2,N1,N2,[],L2).
bothSwap(L1,[],N1,N2,L1,[]).
bothSwap([H1|T1],[H2|T2],N1,N2,X,Y) :- H1 == N1, H2 == N2, bothSwap(T1,T2,N1,N2,D1,D2), append(D1,[H2],X), append(D2,[H1],Y).
bothSwap([H1|T1],[H2|T2],N1,N2,X,Y) :- H1 == N1, H2 =\= N2, bothSwap([H1|T1],T2,N1,N2,D1,D2).
bothSwap([H1|T1],[H2|T2],N1,N2,X,Y) :- H1 =\= N1, H2 == N2, bothSwap(T1,[H2|T2],N1,N2,D1,D2).

有哪位聪明人愿意和我一起解决这个问题吗? :)


想象一下,如果我们“希望”列表在出现所需元素时被分割,这个问题将会多么容易,如下所示:

?- splitsies([1,2,3,4,5,6,7,8], 4, Prefix, Suffix).
Prefix = [1, 2, 3],
Suffix = [5, 6, 7, 8] ;

你猜怎么了? :)append/3可以这样做:

% splitsies is true if X splits list into a prefix/suffix pair.
splitsies(List, X, Start, Finish) :-
    append(Start, [X|Finish], List).

现在看来问题很简单!

bothSwap(Left, Right, A, B, AfterLeft, AfterRight) :-
    % break up the inputs
    splitsies(Left,  A, LPre, LPost),
    splitsies(Right, B, RPre, RPost),

    % glue together the outputs (note that A and B are switched)
    splitsies(AfterLeft,  B, LPre, LPost),
    splitsies(AfterRight, A, RPre, RPost).

我不会假装这个解决方案很有效……但是天气太热了,你在输入时最好戴上隔热手套。哦,看看这个:

?- bothSwap([7,2,7,8,5],[1,2,3,8,7,9,8], X, Y, [7,2,7,7,5], [1,2,3,8,8,9,8]).
X = 8,
Y = 7 ;
false.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将列表 1 中的特定数字与列表 2 中的特定数字交换 的相关文章

  • 适合从记录中提取 OneToMany 关系的约束编程

    也许有人可以帮助我解决 Prolog 或任何约束编程语言的问题 想象一个项目表 学生与母亲一起做某事的学校项目 每个项目都有一名或多名儿童参与 对于每个孩子 我们存储其姓名及其母亲的姓名 但对于每个项目 只有一个包含所有母亲的单元和一个包含
  • 使用 ocaml List.fold_left 列表中的最后一个元素

    我可以通过以下代码找到列表的最后一个元素 let last xs a list a let rec aux xs prev match xs with gt prev x ys gt aux ys x in match xs with gt
  • Ruby 枚举器链接

    在这个例子中 1 2 3 each with index map i j i j gt 0 2 6 我的理解是 既然each with index枚举器链接到map map表现得像each with index通过在块内传递索引 并返回一个
  • foo.Name undefined(类型接口{}没有字段或方法名称)

    我使用本机 golang 包 container list 来管理堆栈中的 inotify 事件 当我访问堆栈的项目时 我的类型失败 我认为 import golang org x exp inotify container list lo
  • 索引多列并匹配不同的值,返回跨列的唯一值列表

    我已经在漫长的几周内广泛寻找解决我的问题的方法了 我提出了一个部分有效的解决方案 我将其包含在底部 供那些可能知道如何修改 扩展它们以解决问题的人使用 这就是我想要完成的任务 以下描述参考此屏幕截图https i stack imgur c
  • 实现用户定义的算术函数

    如何添加函数 例如汉明权重 并在右侧出现的表达式中使用它是一些 is 2 goal 像 goal expansion 或 term expansion 这样的东西可以帮助这里吗 我承认这不是一个大功能 但它可以提高我的一些 Prolog 程
  • 如何使用 std::pair 创建一个集合,该集合使用绑定根据 ::第二个对成员进行排序

    我知道我可以使用以下内容 template
  • 如何访问对列表中对的每个元素?

    我有一个名为 对 的列表 pairs a 1 b 2 c 3 我可以通过以下方式访问元素 for x in pairs print x 其输出如下 a 1 b 2 c 3 但我想访问每对中的每个元素 就像在 c 中一样 如果我们使用pair
  • 比较通用列表和数组

    为什么 generic list 比 array 慢 通用列表比数组稍慢 但在大多数情况下您不会注意到 主要与稍微复杂的查找有关 据说 List 在幕后 使用数组 但不能保证以与数组相同的方式将节点保留在相邻内存中 然而 我早在 2005
  • python 和回文

    我最近写了一个循环的方法 usr share dict words并使用我的返回回文列表ispalindrome x 方法 这是一些代码 有什么问题吗 它只会停止 10 分钟 然后返回文件中所有单词的列表 def reverse a ret
  • 在 Python 中使用列表理解来执行类似于 zip() 的操作?

    我是一名 Python 新手 我想做的事情之一就是围绕列表理解进行思考 我可以看到这是一个非常强大的功能 值得学习 cities Chicago Detroit Atlanta airports ORD DTW ATL print zip
  • Android 动态添加联系表单

    Hi 我想实现如图所示的表单 不知道他们如何动态添加字段 这是列表视图吗 可扩展列表 用户可以在运行时添加和删除 我已经检查了包含子项目的可扩展列表 但我们在数组中定义子元素 在图像中它们动态添加 任何指南 链接 Thanks Custom
  • 合并多个列表

    鉴于我有一个列表列表 List
  • for 循环中列表项未更改

    当以下代码没有达到我预期的效果时 我感到震惊 lines list this is line 1 n this is line 2 n this is line 3 n for line in lines list line line st
  • 如何将表达式> 转换为谓词

    我有一个方法接受Expression
  • 比较和删除列表和数组java中不存在的元素

    我有一个String数组和一List
  • 计算序言中列表的排列

    在 序言艺术 第二版中有一个问题 您应该定义一个谓词 Even permutation Xs Ys 和类似的奇数排列 当您查询时 例如 Even permutation 1 2 3 2 3 1 和 odd permutation 1 2 3
  • 如何加快列表理解速度

    以下是我的清单 col red yellow blue red green yellow pink orange brown pink brown 我的目标是消除每个列表中出现一次的项目 这是我的代码 eliminate w for w i
  • Python选择列表中最长字符串的最有效方法?

    我有一个可变长度的列表 并且正在尝试找到一种方法来测试当前正在评估的列表项是否是列表中包含的最长字符串 我正在使用Python 2 6 1 例如 mylist abc abcdef abcd for each in mylist if co
  • Java 阻止列表实现

    我在 SO 和 Google 上搜索了这个问题的答案 但到目前为止找不到合适的解决方案 我目前正在研究图形路由问题中的 LayerManager 管理器负责提供和重置一组固定的层 我想使用阻止列表来实现消费者 生产者模式 以便只要没有可用的

随机推荐

  • 设置语言不起作用 select2

  • C++ 模板名称漂亮打印

    我需要打印缩进的模板名称以进行调试 例如 我想像这样缩进名称 而不是单行 boost phoenix actor lt boost phoenix composite lt boost phoenix less eval boost fus
  • opengl 中的顶点缓冲区

    我正在制作一个小型 3D 图形游戏 演示以供个人学习 我了解 d3d9 和很多关于 d3d11 的知识 但目前对 opengl 知之甚少 所以我打算抽象出图形的实际渲染 以便我的场景图和 上面 的所有内容都不需要了解如何实际绘制图形 我打算
  • 如何在 SwiftUI 中初始化 View Again?

    我在我的项目中使用 SwfitUI 并且有一个 NavigationView 和 List 我在打开详细视图后单击单元格 然后单击导航后退按钮 我想在单击导航后退按钮后删除视图 它是 SwiftUI 中的结构 因为如果我再次单击相同的单元格
  • 如何初始化共享 javascript 模块默认导出

    我想在多个模块之间共享一个 api 实例 并能够使用外部配置对其进行初始化 我的代码使用 Webpack 和 Babel 将这些漂亮的 ES6 模块转换为浏览器可用的东西 我正在努力实现这一目标 api js let api null ex
  • 解码熊猫字符

    下面是我的 DF 示例 ROLE NAME GESELLSCHAFTER DUPONT DUPONT GESCH FTSF HRER DUPONT DUPONT KOMPLEMENT R DUPONT DUPONT GESELLSCHAFT
  • 无法分配对象,因为其复制赋值运算符被隐式删除错误

    在我的小型打砖块克隆游戏中 我试图从向量中删除一些值 该向量包含 Brick 类 它们以网格状模式在屏幕上实例化 当球和砖块发生碰撞时 砖块需要消失 我正在尝试用一小段代码来完成此任务 for int i 0 i lt bricks siz
  • CAReplicatorLayer 背后的魔力是什么?

    我觉得 CAReplicatorLayer 有趣的地方是 它能够非常有效地使用不同的变换多次显示 CALayer 如何 看起来它以某种方式重用了复制层的 后备存储 甚至对其应用了一些色调 如何 我想获得源代码或了解 CAReplicator
  • CMD:将 ECHO 管道传输到 SET/在变量中扩展变量

    x 12 3 返回从 x 变量中第 12 个字符开始的 3 个字符 我一直试图完成的是使用变量而不是12 and 3 比方说y 12 and z 3 那么 你就不能使用 x y z 因为 CMD 会认为 x 是一个变量 你能做的是set v
  • IE8 中 IIS7.5 中的 ASP.NET MVC2 的会话不粘连

    我们有一个 ASP NET MVC2 Web 应用程序 由于超出本问题范围的原因 我们决定在应用程序中使用经典会话状态 其中实现了与会话相关的以下功能 global asax 中的 Session Start 事件处理程序在会话中存储变量
  • Python 获取当前 URL

    我如何使用Python获取当前URL 我需要获取当前的 URL 以便我可以检查它的查询字符串 例如 requested url URL HERE url urlparse requested url if url 4 params dict
  • 项目导入需要 Sbt 0.12.4+

    我目前正在阅读Play for Scala Covers Play 2Peter Hilton 的书 出版商 Manning 并尝试坚持他们在书中概述的版本 播放版本 2 1 1 我下载了新的 IntelliJ IDEA 14 CE 应用程
  • Facebook Android SDK 的密钥哈希无效

    我正在尝试使用 Facebook Android SDK 开发一个带有 Facebook 登录按钮的简单应用程序 但我在密钥哈希方面遇到了麻烦 我创建了调试密钥和发布密钥 调试键 keytool exportcert alias andro
  • 如何在 Firefox 中调试 Service Worker?

    在 FF 中调试 Service Worker 似乎非常痛苦 我知道从主页我可以 进入应用程序面板 点击 关于调试 在新页面中搜索我的员工以及其他 200 名员工 单击开始 然后单击检查 我必须寻找两个控制台而不是一个并通过 两者之间的消息
  • git rebase -i HEAD~7 -- 在编辑器中仅显示“noop”

    我正在尝试将位于 HEAD 的提交压缩为后面的提交 当我跑步时git rebase i HEAD 7 但是 我只看到一个noop在编辑器中 我完全不知道这是如何运作的 我在分行工作 cleanup 我创建的 使用checkout b cle
  • 如何检查 VBScript 的默认主机是 WScript 还是 CScript?

    我想知道特定机器上 VBScript 的默认主机是什么 是否设置为 WScript 还是 CScript 例如 如果我使用cscript h cscript s那么有什么方法可以检查主机 VBScript 是否设置为 cscript 我找到
  • 使用逗号运算符是个好习惯吗?

    我最近 实际上仅在 SO 上 遇到了 C C 逗号运算符的使用 据我所知 它在左侧和右侧运算符之间的线上创建了一个序列点 以便您拥有可预测的 定义的 评估顺序 我对为什么要在语言中提供这一点感到有点困惑 因为它似乎是一个可以应用于本来不应该
  • 如何从 vue 3 中的 slot 获取 ref?

    我需要用名字来聚焦参考test1设置一些放置在组件槽中的值 从外部 有可能以某种方式做到这一点吗 我尝试从 refs 或 slots 获取 但失败了 App vue
  • 实时键盘输入到控制台(在 Windows 中)?

    我有一个双向链接列表类 我想在用户键入字符时将字符添加到列表中 或者每次用户按退格键时删除列表中的最后一个节点 同时在控制台中实时显示结果 我将使用哪些函数来拦截单个键盘输入并将其实时显示到控制台 所以结果如下 用户开始输入 Typ 用户停
  • 将列表 1 中的特定数字与列表 2 中的特定数字交换

    最近在温习一些Prolog 我有点喜欢随机提出问题来尝试解决 然后解决它们 但这是相当困难的 我不是一个会放弃我已经着手解决的问题的人 问题 我想创建一个谓词 它有 2 个预先确定的列表 2 个要交换的数字 然后在交换完成后输出列表 进一步