Prolog 编程 - 解决方案的途径

2023-11-29

我在大学学习序言并面临一些问题。我已经发现的只是解决问题的方法。然而,我更感兴趣的是思考的方式,即如何得到这样的解决方案。

有人可以给我关于这个领域的建议吗?我将衷心感谢您的帮助。

我举了一个我正在处理的例子,并且在 stackoverflow 上找到了一个解决方案,但我寻找的是他是如何做到这一点的,他如何找到答案:)

编写一个谓词 flatten(List,Flat) 来展平列表,例如flatten([a,b,[c,d],[[1,2]],foo],X) 将给出 X=[a,b,c,d,1,2,foo]。

这是我在 stackoverflow 上找到的答案:

flatten(List, Flattened):-
   flatten(List, [], Flattened).

flatten([], Flattened, Flattened).
flatten([Item|Tail], L, Flattened):-
  flatten(Item, L1, Flattened),
  flatten(Tail, L, L1).
flatten(Item, Flattened, [Item|Flattened]):-
  \+ is_list(Item).

这个答案属于用户 gusbro 并由用户 Parhs 询问,我试图找到一种方法联系用户 gusbro 询问他如何得出这样的答案,但我不能。

非常感谢。


嗯,我只能说,解决问题的方式很大程度上取决于问题本身。有一系列问题可以通过使用来解决递归,其中 Prolog 非常适合解决这些问题。

在这类问题中,可以通过将较大问题划分为两个或多个案例类来导出更大问题的解决方案。

在一类中,我们有“基本情况”,当输入无法进一步分为更小的情况时,我们提供问题的解决方案。

另一类是“递归情况”,我们将输入分成几部分,分别求解,然后“连接”结果以给出此较大输入的解决方案。

在 flatten/2 的示例中,我们希望将一个项目列表作为输入,其中每个项目也可以是一个列表,结果应是一个包含输入中所有项目的列表。因此,我们将问题分成不同的情况。 我们将使用辅助参数来保存中间展平列表,这就是我们实现 flatten/3 的原因。

因此,我们的 flatten/2 谓词将仅使用空列表作为起始中间扁平列表来调用 flatten/3:

flatten(List, Flattened):-
   flatten(List, [], Flattened).

现在对于 flatten/3 谓词,我们有两个基本情况。第一个处理空列表。请注意,当输入为空列表时,我们无法进一步划分问题。在这种情况下,我们只将中间扁平列表作为我们的结果。

flatten([], Flattened, Flattened).

我们现在采取递归步骤。这涉及获取输入列表并将问题分为两个步骤。第一步是展平此输入列表的第一项。第二步是递归地展平其余部分:

flatten([Item|Tail], L, Flattened):-
  flatten(Item, L1, Flattened),
  flatten(Tail, L, L1).

好的,所以打电话给展平(项目,L1,展平)展平第一项,但将未绑定变量 L1 作为中间列表传递。这只是一个技巧,因此在谓词返回时,变量 L1 仍然保持无界,并且 Flattened 将采用 [...|L1] 形式,其中 ... 是 Item 的扁平项。

下一步,调用展平(尾部,L,L1)展平输入列表的其余部分,结果以 L1 为界。

我们的最后一个子句实际上是另一个基本情况,处理单个项目(不是列表)。因此我们有:

flatten(Item, Flattened, [Item|Flattened]):-
  \+ is_list(Item).

它检查 item 是否是列表,当它不是列表时,它将结果绑定为带有 h​​ead=Item 的列表,并将中间扁平列表绑定为 tail。

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

Prolog 编程 - 解决方案的途径 的相关文章

  • 在 Prolog 中解答爱因斯坦之谜

    我正在尝试解决爱因斯坦之谜 https www wikiwand com en Zebra Puzzle在序言中 我在编写程序时遇到了困难 基本方法是添加所有约束并让 Prolog 找出唯一可能的解决方案 问题是 Prolog 找到了 0
  • Prolog 中的条件编写

    I have Prolog包含飞机时刻表的数据库 它看起来是这样的 fly id from to days 1 0 1 0 1 0 1 正如你所看到的 有 7 个值days谓词 从星期一到星期日 我想做的是每天打印 价值所在1 但将其打印为
  • Prolog - 回文函子

    我正在尝试写一个谓词palindrome 1在 Prolog 中 当且仅当其列表输入由回文列表组成时 这才是正确的 例如 palindrome 1 2 3 4 5 4 3 2 1 is true 有什么想法或解决方案吗 回文列表是一个向后读
  • 使用 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 编辑 之前
  • Prolog 中的分配性检查

    假设我有一个等价关系eq 以及多个二元运算符o 1 o 2 o n 我想找出哪些操作分配给其他操作 假设我有一个可以确定两个表达式是否等价的知识库 一个简单的解决方案是输入所有可能的查询 对于左分配性 eq o 1 Z o 1 X Y o
  • 在 dll 中嵌入 prolog 引擎

    我最近一直在开发一个嵌入 prolog 推理引擎的 C 应用程序 正如标题中所述 我现在尝试生成一个 DLL 而不是可执行文件 以便我可以在另一个项目中使用它 由于我是 DLL 开发的新手 我想我可以从一个小例子开始 我有3个文件 like
  • 如何使用 Prolog 查找二叉树的深度

    我正在学习 Prolog 并试图找到一个深度二叉树使用 Prolog 我代表一棵树是这样的 nil is a tree tree 1 nil nil this is a leaf tree 1 tree 1 nil nil nil this
  • AllegroGraph 检查现有三元组

    我正在使用 AllegroGraph 4 我有一个三元组存储 并且只有在新的三元组尚不存在时我才会尝试添加它们 这是我的 Prolog 查询 select news alfas news a news tst has annotation
  • Prolog,如何在 write() 中显示多个输出

    go match Mn Fn write Matching Result nl write Mn write match with write Fn match Mn1 Fn1 person may female 25 blue perso
  • 二叉树的 Herbrand 宇宙、Herbrand 基础和 Herbrand 模型(序言)

    什么是二叉树的 Herbrand 宇宙 Herbrand Base 和 Herbrand Model binary tree empty binary tree tree Left Element Right binary tree Lef
  • 关于构建列表直至满足条件

    我想解决 巨猫军团之谜 https youtu be YeMVoJKn1Tg由 Dan Finkel 使用 Prolog 编写 基本上你从 0 然后使用以下三个操作之一构建此列表 添加5 添加7 或采取sqrt 当您成功建立一个列表后 您就
  • Prolog 变量查询中的“\+”问题

    我正在读 七周七种语言 atm 我对一些 Prolog 查询感到困惑 我不明白对 否 的回答 The friends pl文件看起来像这样 likes wallace cheese likes grommit cheese likes we
  • 如何从序言中的列表中删除列表?

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

    我对序言相当陌生 正在尝试摆弄列表列表 我很好奇如何添加两个列表列表或减去它们从而得到一个列表列表 如果我有两个列表 可以说 SomeList 1 2 3 4 5 6 7 8 SomeList2 1 2 3 4 5 6 7 8 我该如何添加
  • Prolog 中的匹配元组

    为什么Prolog匹配 X Xs 包含更多元素的元组 一个例子 test2 X Xs write X nl test2 Xs test2 X write X nl test
  • Prolog 实现 and/2、or/2、nand/2、nor/2、xor/2 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想在序言中实现以下谓词并将它们用于真值表 and 2 or 2 nand 2 nor 2 xor 2 也许有人可以告诉我如何实现和
  • 控制 Prolog 变量值选择

    灵感来自之前的一个问题 https stackoverflow com questions 41595786 using operator to save variables in a list我尝试实现一些可以枚举布尔表达式可能性的东西
  • 适合从记录中提取 OneToMany 关系的约束编程

    也许有人可以帮助我解决 Prolog 或任何约束编程语言的问题 想象一个项目表 学生与母亲一起做某事的学校项目 每个项目都有一名或多名儿童参与 对于每个孩子 我们存储其姓名及其母亲的姓名 但对于每个项目 只有一个包含所有母亲的单元和一个包含
  • SWI Prolog 使用的检查优化会发生什么情况?

    去引用SICStus Prolog 手册 https sicstus sics se sicstus docs 3 12 9 html sicstus Occur html 逻辑编程背后的通常数学理论禁止 创建循环项 规定发生检查应该是 每
  • 如何在 Prolog 中解决这个算术表达式难题?

    我有一个编程问题 https blog svpino com 2015 05 08 solution to problem 5 and some other thoughts about this type of questions htt

随机推荐

  • 为什么 set -e 不会导致 `false || 失败假&&真`? [复制]

    这个问题在这里已经有答案了 无法找出合适的标题 我不明白 dash bash 中的行为 也就是说 我使用 set e 在命令失败时进行救援 并使用命令组来处理积极结果 IE 总体方案是 wantcommand command Than 意味
  • 如何在 Windows Phone 项目中导入 C++ dll

    我用 C 创建了一个 DLL 文件 我想将其导入到我的 Windows Phone 项目中 我遵循了来自不同来源的许多说明 即使当我运行我的代码时 我也会收到以下错误 尝试访问该方法失败 rough MainPage Add System
  • python openpyxl读取excel太慢

    我有一个 xlsx 文件 拥有 1841 行 每行有 30 列 使用 openpyxl 将整个信息保存到列表中 def get value i ws article row value ws cell row article row col
  • 是否有可能在 python 中找到 [a,b] 范围内的随机浮点数?

    我试图在 python 中生成 0 8 0 9 范围内的随机浮点数 但不幸的是 我发现的所有工具只能生成 a b 范围内的浮点数随机数 喜欢Random uniform a b 与此同时 我尝试做这样的事情 uniform 0 8 0 90
  • TypeScript 类型特定字符的字符串

    假设我想允许使用十六进制字符串 所以唯一允许的值为 0 9a f TypeScript 有没有办法定义只接受某些字符串的类型字符串 IE valid const valid HexString 123abc invalid const in
  • System.DateTime.Now 和 System.DateTime.Today 之间的区别

    谁能解释一下两者之间的区别System DateTime Now and System DateTime Today在 C NET 中 如果可能的话 各有利弊 DateTime Now返回一个DateTime由运行代码的计算机的本地日期和时
  • Google Apps 脚本 - MailApp

    我想使用 Google Apps 脚本发送一封带有replyTo 和附件的电子邮件 但我只找到了这两种方法 它们分别执行我想要的操作 sendEmail recipient subject body options sendEmail to
  • Java GraphTraversal 输出 Gremlin 查询

    如何从 Java 输出 Gremlin 查询GraphTraversal目的 默认输出 graphTraversal toString 好像 HasStep label eq brand name eq Nike status within
  • 将 int 转换为 hex,然后转换为 00 00 00 00 的格式

    我有一个递增的整数 然后我想要十六进制 所以我像这样进行转换 myInt ToString X 然后我需要一个格式为 00 00 00 00 的字符串 但我无法找到一种方法将我现在拥有的十六进制字符串转换为这种格式 使用 Linq 查询 您
  • 在Android中搜索ListView项目后,始终打开ListView的第一个项目(问题)

    当我打开搜索到的项目时 它打开的是 ListView 的第一个项目 而不是搜索到的项目 即使搜索并成功找到该项目 让我举几个例子 如果我搜索Arrow 我可以得到Arrow但当点击时Arrow它将会Almost Human Almost H
  • WebSphere liberty 类默认加载 PARENT LAST

    我一直在研究使用 WebSphere 的 Liberty 配置文件作为一种轻量级替代方案 以替代在我的本地计算机上部署成熟的 WebSphere 实例 我知道 这有点晚了 我不明白的一件事 如何将 Parent Last 类加载设置为默认
  • DELIMITER // 在触发器中起什么作用?

    DELIMITER 它有什么用呢 它将语句分隔符从 to 这样你就可以写 在你的触发器定义中 MySQL 客户端不会将其误解为意味着你已经完成了它 注意 改回来的时候 DELIMITER not DELIMITER 正如我所看到的人们尝试做
  • 将矢量世界地图添加到 R 中的光栅动画

    我用以下内容创建了一个动画animate的功能raster包并想在其上添加世界矢量地图 这是我的代码 在对其进行动画处理之前 我根据月平均温度的 3D 数组创建了一个栅格块 r lt brick ncols nb cols nrows nb
  • 为 Python 安装 PyObjC 时出现问题

    我试图在我的 Mac OS X El Capitan 上安装 PyObjC 下载大约 40 分钟后 我收到一个错误 然后它停止了 我尝试在终端中使用以下代码进行安装 pip install pyobjc 错误说 Command python
  • jQuery 获取元素相对于窗口的位置

    给定 HTML DOM ID 如何在 JavaScript JQuery 中获取元素相对于窗口的位置 这与相对于文档或偏移父级不同 因为该元素可能位于 iframe 或某些其他元素内部 我需要获取当前显示的元素矩形的屏幕位置 如位置和尺寸
  • 如何高效地将 npy 转换为 xarray / zarr

    我有一个 37 GB 的 npy 文件 我想将其转换为 Zarr 存储 以便可以包含坐标标签 理论上我有代码可以做到这一点 但我总是内存不足 我想在中间使用 Dask 来促进分块执行此操作 但我仍然耗尽内存 这些数据是人们股骨软骨的 厚度图
  • 查询依赖于 mongodb 中其他文档值的文档

    想象一下以下猫鼬模型 const UserSchema Schema id ObjectId more fields blockedIds type ObjectId ref User 获取与某个 id 的用户的 BlockedId 不匹配
  • Play!2.x 构建导致 sbt 失败并出现 NoClassDefFoundError

    我刚刚更新了 IDE 插件版本和库依赖项 现在无法构建我的项目 SBT 投掷java lang NoClassDefFoundError sbt TrackLevel执行时 我也跑不了 sbt clean因为它尝试加载项目并失败并出现相同的
  • 用动画隐藏 NSStackView 的视图项

    我在 macOS 上使用 swift 4 我想用动画隐藏堆栈视图项 我试过这个 class ViewController NSViewController IBOutlet weak var box NSBox IBOutlet weak
  • Prolog 编程 - 解决方案的途径

    我在大学学习序言并面临一些问题 我已经发现的只是解决问题的方法 然而 我更感兴趣的是思考的方式 即如何得到这样的解决方案 有人可以给我关于这个领域的建议吗 我将衷心感谢您的帮助 我举了一个我正在处理的例子 并且在 stackoverflow