Smullyan 数值机的解决方案

2024-03-16

在这里我建议找到 Smullyan 数值机的解决方案:此处定义 http://heras-gilsanz.com/manuel/smullyan-machines.html.

问题陈述

它们是接受数字列表作为输入,并根据输入模式遵循一些规则将其转换为另一个数字列表的机器。 以下是上面链接中给出的机器规则,表达得更正式一些。 假设 M 是机器,M(X) 是 X 的变换。 我们定义了一些这样的规则:

M(2X) = X
M(3X) = M(X)2M(X)
M(4X) = reverse(M(X)) // reverse the order of the list.
M(5X) = M(X)M(X)

任何不符合任何规则的内容都会被拒绝。 这里有一些例子:

  • 中号(245) = 45
  • M(3245) = M(245)2M(245) = 45245
  • M(43245) = 反向(M(3245)) = 反向(45245) = 54254
  • M(543245) = M(43245)M(43245) = 5425454254

问题是,找到 X 使得:

  • M(X) = 2
  • M(X) = X
  • M(X) = X2X
  • M(X) = 反向(X)
  • M(X) = 反向(X2X)反向(X2X)

这是第二个例子,它的详尽搜索稍微复杂一些(特别是如果我想要前 10 个或 100 个解决方案)。

M(1X2) = X
M(3X) = M(X)M(X)
M(4X) = reverse(M(X))
M(5X) = truncate(M(X)) // remove the first element of the list truncate(1234) = 234. Only valid if M(X) has at least 2 elements.
M(6X) = 1M(X)
M(7X) = 2M(X)

问题:

  • M(X) = XX
  • M(X) = X
  • M(X) = 反向(X)

(非)解决方案

在 Prolog 中编写求解器非常简单。只是这只是详尽的探索(又名蛮力),并且可能需要一些时间来制定某些规则。

我尝试过,但无法用 CLP(FD) 的逻辑约束来表达这个问题,所以我尝试了 CHR(约束处理规则)来用列表上的约束来表达这个问题(尤其是append约束),但无论我如何表达,它总是归结为详尽的搜索。

Question

知道我可以采取什么方法在合理的时间内解决此类问题吗? 理想情况下,我希望能够生成比某个界限更短的所有解决方案。


让我们看看你的“稍微复杂一点”的问题。详尽的搜索效果非常好!

以下是与 Серге́й 解决方案的比较,通过考虑共同目标可以显着改进该解决方案:

m([1|A], X) :-
    A = [_|_],
    append(X, [2], A).
m([E | X], Z) :-
    m(X, Y),
    (  E = 3,
       append(Y, Y, Z)
    ;  E = 4,
       reverse(Y, Z)
    ;  E = 5,
       Y = [_ | Z]
    ;  E = 6,
       Z = [1 | Y]
    ;  E = 7,
       Z = [2 | Y]
    ).

供查询time(findall(_, (question3(X), write(X), nl), _)).我使用 B 8.1、SICStus 4.3b8 得到:

Серге́й B tabled   104.542s
Серге́й B          678.394s
false  B           16.013s
false  B tabled    53.007s
Серге́й SICStus    439.210s
false  SICStus      7.990s
Серге́й SWI       1383.678s, 5,363,110,835 inferences
false  SWI         44.743s,   185,136,302 inferences

附加的问题并不难回答。仅 SICStus 具有上述功能m/2 and call_nth/2 https://stackoverflow.com/questions/11364634/count-the-number-of-call-of-a-clause-prolog/11400256#11400256:

| ?- time(call_nth( (
        length(Xs0,N),append(Xs0,Xs0,Ys),m(Xs0,Ys),
          writeq(Ys),nl ), 10)).
[4,3,7,4,3,1,4,3,7,4,3,1,2,4,3,7,4,3,1,4,3,7,4,3,1,2]
[3,4,7,4,3,1,3,4,7,4,3,1,2,3,4,7,4,3,1,3,4,7,4,3,1,2]
[4,3,7,3,4,1,4,3,7,3,4,1,2,4,3,7,3,4,1,4,3,7,3,4,1,2]
[3,4,7,3,4,1,3,4,7,3,4,1,2,3,4,7,3,4,1,3,4,7,3,4,1,2]
[3,5,4,5,3,1,2,2,1,3,5,4,5,3,1,2,3,5,4,5,3,1,2,2,1,3,5,4,5,3,1,2]
[3,5,5,3,4,1,2,1,4,3,5,5,3,4,1,2,3,5,5,3,4,1,2,1,4,3,5,5,3,4,1,2]
[5,4,7,4,3,3,1,2,5,4,7,4,3,3,1,2,5,4,7,4,3,3,1,2,5,4,7,4,3,3,1,2]
[4,7,4,5,3,3,1,2,4,7,4,5,3,3,1,2,4,7,4,5,3,3,1,2,4,7,4,5,3,3,1,2]
[5,4,7,3,4,3,1,2,5,4,7,3,4,3,1,2,5,4,7,3,4,3,1,2,5,4,7,3,4,3,1,2]
[3,5,4,7,4,3,1,_2735,3,5,4,7,4,3,1,2,3,5,4,7,4,3,1,_2735,3,5,4,7,4,3,1,2]
196660ms

| ?- time(call_nth( (
        length(Xs0,N),m(Xs0,Xs0),
          writeq(Xs0),nl ), 10)).
[4,7,4,3,1,4,7,4,3,1,2]
[4,7,3,4,1,4,7,3,4,1,2]
[5,4,7,4,3,1,_2371,5,4,7,4,3,1,2]
[4,7,4,5,3,1,_2371,4,7,4,5,3,1,2]
[5,4,7,3,4,1,_2371,5,4,7,3,4,1,2]
[3,5,4,7,4,1,2,3,5,4,7,4,1,2]
[4,3,7,4,5,1,2,4,3,7,4,5,1,2]
[3,4,7,4,5,1,2,3,4,7,4,5,1,2]
[4,7,5,3,6,4,1,4,7,5,3,6,4,2]
[5,4,7,4,3,6,1,5,4,7,4,3,6,2]
6550ms

| ?- time(call_nth( (
        length(Xs0,N),reverse(Xs0,Ys),m(Xs0,Ys),
          writeq(Ys),nl ), 10)).
[2,1,3,4,7,1,3,4,7]
[2,1,4,3,7,1,4,3,7]
[2,1,3,5,4,7,_2633,1,3,5,4,7]
[2,1,5,4,7,3,2,1,5,4,7,3]
[2,4,6,3,5,7,1,4,6,3,5,7]
[2,6,3,5,4,7,1,6,3,5,4,7]
[2,_2633,1,5,3,4,7,_2633,1,5,3,4,7]
[2,_2633,1,5,4,3,7,_2633,1,5,4,3,7]
[2,1,3,4,4,4,7,1,3,4,4,4,7]
[2,1,3,4,5,6,7,1,3,4,5,6,7]
1500ms
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Smullyan 数值机的解决方案 的相关文章

  • 在 dll 中嵌入 prolog 引擎

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

    对于我正在编写的程序 我需要创建一个列表列表 其中包含代表乘积的数字对和两个给定数字的总和 现在我有一个函数 我可以指定将列表添加到列表中的次数 稍后将使用完整功能进行扩展 这是我所拥有的 s1 0 X s1 Q X N is Q 1 mu
  • 如何声明两个列表具有相同的长度?

    我需要知道如何比较 Prolog 中两个列表的长度 这是我到目前为止所拥有的 sum N1 N2 checklength N1 N2 checklength N1 N2 L1 is length N1 What L2 is length N
  • 如何在 SWI-Prolog 中创建事实?

    我只想创建类似的东西 like x y 我已经尝试了很长时间了 真的很沮丧 谁能告诉我该怎么做 我假设您正在交互地使用 swi 并尝试输入事实会给您一个如下错误 1 like x y ERROR toplevel Undefined pro
  • 关于构建列表直至满足条件

    我想解决 巨猫军团之谜 https youtu be YeMVoJKn1Tg由 Dan Finkel 使用 Prolog 编写 基本上你从 0 然后使用以下三个操作之一构建此列表 添加5 添加7 或采取sqrt 当您成功建立一个列表后 您就
  • YAP Prolog 中的正向链接?

    我需要在某些 Prolog 问题中使用前向链接器 我想避免使用普通元解释器从头开始实现它 但如果没有其他选项可用 这就是我必须要做的 因为使用元解释器执行此操作会很慢 而且我我确信应该有一些好的实现 有人知道 YAP 或 SWI Prolo
  • 在序言中减去或添加列表的列表?

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

    我有一项任务是在序言中制作一张简化的地铁地图 其中一部分要求制定一项规则来检查两个车站是否在同一条线上 我有一条规则 但它似乎不起作用 这就是我到目前为止所拥有的 adjacent nh lg central 4 adjacent lg o
  • 非成员规则在 Prolog 中无法按预期工作

    我正在尝试在 Prolog 中创建一个迷宫程序 其目的是找到一条从迷宫起点到迷宫中心点 m 的路线 迷宫由使用四种颜色之一连接的正方形组成 蓝色 绿色 紫色或橙色 从起点到中心的路线遵循四种颜色的重复图案 我创建了以下代码 link2 A
  • Prolog 匹配 vs miniKanren 统一

    在 Prolog 人工智能编程中 Bratko 在第 58 页说了以下内容 Prolog 中的匹配对应于逻辑中所谓的统一 但是 我们避免使用 统一 这个词 因为出于效率原因 在大多数 Prolog 系统中 匹配的实现方式并不完全对应于统一
  • 求解序言中极其简单的方程:A = B + C?

    我有一个非常简单的方程 我希望能够在序言中求解 A B C 我希望能够编写一个谓词来表达这种关系 它可以处理任何一个未实例化的参数 无需推广到更复杂的关系或方程 myEquation A B C something 我可以使用以下语义进行调
  • 列表中的连续元素

    我正在阻止一个谓词来编码Prolog 我需要对两个谓词进行编码 如果我打电话 u a b c d e f X 它会给X a b X b c X c d 如果我打电话 v a b c d e f X 它会给X a b X c d X e f
  • 实现用户定义的算术函数

    如何添加函数 例如汉明权重 并在右侧出现的表达式中使用它是一些 is 2 goal 像 goal expansion 或 term expansion 这样的东西可以帮助这里吗 我承认这不是一个大功能 但它可以提高我的一些 Prolog 程
  • 以系统的方式报告 Prolog 中查询失败的“原因”

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

    我正在尝试为有效数字指定 DCG 如下所示 value Number gt valid number Number 基本上检查指定的值是否是数字 它也可能是变量 因此有必要检查 我不知道如何构建这个valid number不过 DCG 谓词
  • 我应该在 Prolog 和一般情况下避免尾递归吗?

    我正在阅读 立即学习 Prolog 在线书籍 以获取乐趣 我正在尝试编写一个谓词 该谓词遍历列表的每个成员并向其添加一个 使用累加器 我已经在没有尾递归的情况下轻松完成了 addone addone X Xs Y Ys Y is X 1 a
  • Prolog家谱

    我做到了 但没有显示答案 当我询问兄弟姐妹 叔叔 阿姨时 这是我写的 有什么问题吗 uncle X Y male X sibling X Z parent Z Y uncle X Y male X spouse X W sibling W
  • 通过递归扩展 Prolog 目标?

    我 最终 实现了一些目标 这些目标将根据开始由 开始之后 and duration 然而 计划目标仅接受规定数量的任务 我想扩展计划目标的功能以接受单个列表并在计划时迭代该列表 不幸的是 我认为这将需要与can run and 冲突目标如下
  • Prolog 中的隔离列表

    我很难理解如何让我的代码显示由偶数和奇数组成的隔离列表 我什至不确定我的理解缺乏什么 显然我对这门语言很陌生 必须在学校使用它 我的命令式和功能性思维不会让我知道这到底是怎么回事 哈哈 现在 不 我不是要求你做我的作业 我只是请你帮我看看我
  • 使用 prolog 添加另外两次出现

    我有一个清单 a b a a a c c 我需要为每个元素添加两次以上的出现 最终结果应该是这样的 a a a b b b a a a a a c c c c 如果列表中有一个与下一个项目相同的项目 那么它会继续下去 直到出现一个新项目 当

随机推荐

  • React中输入的屏蔽卡号

    我正在学习 React 并希望输入有两个约束 16个数字 每四个后面加一个空格 import React Component from react export default class CardNumberInput extends C
  • C 预处理器插入的空格

    假设我们得到以下输入 C 代码 define Y 20 define A x 10 x Y A A 40 gcc E像这样的输出 10 10 40 20 20 gcc E traditional cpp像这样的输出 10 10 40 20
  • Linux 内核是如何测试的?

    Linux 内核开发人员如何在本地测试他们的代码以及在提交代码后 他们是否使用某种单元测试和构建自动化 测试计划 Linux 内核非常重视社区测试 通常 任何开发人员都会在提交之前测试自己的代码 并且通常他们会使用 Linus 的内核开发版
  • Javascript数组排序和唯一性

    我有一个像这样的 JavaScript 数组 var myData 237 124 255 124 366 255 我需要数组元素是唯一的并且已排序 myData 0 124 myData 1 237 myData 2 255 myData
  • 发出 Facebook 好友请求时可以获取吗?

    friend request 流包含 2 个字段 uid from 和 uid to 没有关于提出请求的日期信息 还有其他表包含该信息吗 Thanks 在 Facebook 论坛上得到回复 这是不可能的
  • 一段时间后服务停止工作。需要连续工作

    我正在开发一个计步器应用程序 在其中计算行走的步数并在午夜将其更新到服务器 我有一个持续运行的服务来完成这一切 这是我的服务 public class StepCounterService extends Service implement
  • jquery .hover 不适用于 AJAX 呈现的元素

    我有一些通过 AJAX 调用创建的元素 在这些元素中 有一个子元素 当悬停时需要显示另一个动态创建的子元素 当我运行 hoverjquery 在小提琴中 工作正常 当我在代码中实现它时 它不想工作 我想知道这是否取决于什么时候 hover加
  • 使用 Apache HttpClient 的 Java HTTPPost 请求

    我需要一个java程序来生成以下请求 我正在使用 Apache HttpClient 库 但仍然无法生成如下请求 这是我的 python 程序生成的 我编写了一个等效的 java 程序 但它抛出了403 2012 09 10 15 12 0
  • Java GC 是确定性的吗

    我正在具有相同 JVM 参数的 Java 产品上多次运行同一场景 每次运行都会在持续时间和 开始时间 方面给出不同的 GC 行为 这是预期的吗 您是否手动运行System gc 因为这并不能保证立即 甚至根本不 真正执行垃圾收集 对于自动垃
  • Delphi:系统菜单打开了吗?

    在 Delphi 中 我需要一个函数来确定系统菜单 分别是窗口菜 单 单击图标时出现的菜单 是否打开 原因是我正在编写一个反键盘记录器功能 它将垃圾发送到当前活动的编辑控件 这也阻止了键盘记录器读取 WinAPI 消息来读取内容 但是 如果
  • 为 bash --login -i 执行自定义初始化脚本,例如从快捷方式更改为自定义目录

    现在我在 Windows 7 上使用 MSysGit 它是从 bat 文件启动的 该文件本身调用bash exe login i启动一个外壳 此时它会执行用户主目录中的 bashrc 文件 以及其他文件 我使用这个脚本来设置环境并cd到起始
  • 如何不在主线程上运行服务?

    我正在尝试启动service然后打开socket与服务器建立连接 单击按钮我创建新的Thread然后开始服务 Thread t new Thread public void run mIntent new Intent MainActivi
  • 如何在 OS X C 代码中创建异步计时器?

    所以这个问题实际上是 为什么 time h 在 OS X 和 Linux 上不一样 但是 我已经接受了这些分歧 为了在 Unix 系统上创建计时器 我遵循了本教程http www helsinki fi atk unix dec manua
  • WordPress:为特定插件管理页面加载自定义 CSS

    我正在学习 WordPress 我想为我的插件的特定管理页面加载自定义 CSS 我阅读了 WordPress Plugin API 并执行了如下操作 I ADD MY OPTION PAGES add action admin menu m
  • 迭代 socket.io v1 中的套接字? “......没有方法‘客户’”

    在我能够写出这样的东西之前 io sockets clients forEach function socket socket emit signal data 现在 我不能并且收到错误Object
  • 关于扩展 GAS 电子表格用途的问题

    I would like to offer the opportunity to view output from the same data in a spreadsheet TBA http glasier hk blazer scri
  • 本地化 IOS 按钮标签

    我使用本地化字符串来本地化 UI 元素 除了本地化按钮标题之外 一切正常 21 title 应该是本地化文本 不起作用 我认为这可能是由按钮状态引起的 forState UIControlStateNormal 标题可以通过视图状态设置 我
  • 为更多字段设置相同的属性

    我有两个或更多文本字段 我想对它们应用相同的属性 避免编写两次或多次相同的代码 这不起作用 form validate rules name surname required true minlength 3 maxlength 50 有任
  • Line3DCollection 多彩线条边缘呈“锯齿状”

    基于matplotlib 示例代码 http matplotlib org examples pylab examples multicolored line html我构建了一条彩色线条的 3D 版本 我正在 jupyter 笔记本中工作
  • Smullyan 数值机的解决方案

    在这里我建议找到 Smullyan 数值机的解决方案 此处定义 http heras gilsanz com manuel smullyan machines html 问题陈述 它们是接受数字列表作为输入 并根据输入模式遵循一些规则将其转