在 Prolog 中更快地实现口头算术

2023-11-23

我已经做了一个工作概括口头算术Prolog 中的求解器,但速度太慢。仅运行简单的表达式 S EN D + M O R E = M O N E Y 就需要 8 分钟。有人可以帮助我让它运行得更快吗?

/* verbalArithmetic(List,Word1,Word2,Word3) where List is the list of all 
   possible letters in the words. The SEND+MORE = MONEY expression would then
   be represented as
    verbalArithmetic([S,E,N,D,M,O,R,Y],[S,E,N,D],[M,O,R,E],[M,O,N,E,Y]). */

validDigit(X) :- member(X,[0,1,2,3,4,5,6,7,8,9]).
validStart(X) :- member(X,[1,2,3,4,5,6,7,8,9]).
assign([H|[]]) :- validDigit(H).         
assign([H|Tail]) :- validDigit(H), assign(Tail), fd_all_different([H|Tail]).

findTail(List,H,T) :- append(H,[T],List).

convert([T],T) :- validDigit(T).
convert(List,Num) :- findTail(List,H,T), convert(H,HDigit), Num is (HDigit*10+T).

verbalArithmetic(WordList,[H1|Tail1],[H2|Tail2],Word3) :- 
    validStart(H1), validStart(H2), assign(WordList), 
    convert([H1|Tail1],Num1),convert([H2|Tail2],Num2), convert(Word3,Num3), 
    Sum is Num1+Num2, Num3 = Sum.

考虑使用有限域约束,例如,在 SWI-Prolog 中:

:- use_module(library(clpfd)).

puzzle([S,E,N,D] + [M,O,R,E] = [M,O,N,E,Y]) :-
        Vars = [S,E,N,D,M,O,R,Y],
        Vars ins 0..9,
        all_different(Vars),
                  S*1000 + E*100 + N*10 + D +
                  M*1000 + O*100 + R*10 + E #=
        M*10000 + O*1000 + N*100 + E*10 + Y,
        M #\= 0, S #\= 0.

查询示例:

?- time((puzzle(As+Bs=Cs), label(As))).
% 5,803 inferences, 0.002 CPU in 0.002 seconds (98% CPU, 3553582 Lips)
As = [9, 5, 6, 7],
Bs = [1, 0, 8, 5],
Cs = [1, 0, 6, 5, 2] ;
% 1,411 inferences, 0.001 CPU in 0.001 seconds (97% CPU, 2093472 Lips)
false.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Prolog 中更快地实现口头算术 的相关文章

  • 为什么 pow(int, int) 这么慢?

    我一直在做一些项目欧拉练习来提高我的 C 知识 我写了以下函数 int a 0 b 0 c 0 for a 1 a lt SUMTOTAL a for b a 1 b lt SUMTOTAL a b c SUMTOTAL a b if c
  • 为什么在我的例子中 For 循环比 Map、Reduce 和 List 理解更快

    我编写了一个简单的脚本来测试速度 这就是我发现的结果 实际上 for 循环在我的例子中是最快的 这真的让我感到惊讶 请查看下面 正在计算平方和 这是因为它在内存中保存列表还是有意为之 谁能解释一下这一点 from functools imp
  • 有人能解释一下这个 JavaScript 自动执行函数吗?

    var foo function var x 0 return function return x 为什么 var x 0 表达式只运行一次是我对此最大的误解 你的代码 var foo function var x 0 return fun
  • 为什么直接内存“数组”的清除速度比通常的 Java 数组慢?

    我建立了一个 JMH 基准来衡量什么会更快Arrays fill与空 System arraycopy从空数组中 将 DirectByteBuffer 归零或将unsafe内存块试图回答这个问题question https stackove
  • findall 的异常行为

    以下看起来很不寻常 findall X member X 1 2 3 X X 1 2 3 痕迹更是如此 trace findall X member X 1 2 3 X Call 11 findall 100058 member 10005
  • 样式组件如何影响性能?

    使用样式组件是否比样式表更会降低 Web 应用程序的速度 如果我关心性能并且没有任何依赖于 props 的样式 我是否应该放弃样式组件并使用样式表 当您有很多小组件时 同时使用样式化组件渲染 性能开销可能会很有意义 绝对值得测试以删除小元素
  • 从 JavaScript 数组中获取对象值的最大值和最小值

    从 JavaScript 对象数组中获取最大值和最小值的最佳方法是什么 Given var a x 1 y 0 x 1 y 10 x 12 y 20 x 61 y 10 var minX Infinity maxX Infinity for
  • 慢 Eclipse Spring STS 插件

    我是 Spring 新手 安装了 Eclipse STS 插件 使用服务似乎非常慢 CPU 使用率激增 笔记本电脑只会变热 实际上风扇就像喷气发动机一样运行 直接响应服务的启动 停止 虽然下面的内容确实为我解决了 Spring STS 的所
  • 使用map.get()时使用java Map.containsKey()是多余的

    一段时间以来 我一直想知道在最佳实践中是否允许避免使用containsKey 方法上java util Map而是对结果进行空检查get 我的理由是 两次查找值似乎是多余的 首先是查找containsKey 然后再次为get 另一方面 大多
  • 从视频创建缩略图 - 提高速度性能 - AVAsset - iPhone [重复]

    这个问题在这里已经有答案了 我正在使用基于以下线程中的代码的代码来生成视频缩略图 从 iPhone SDK 中的视频 URL 或数据获取缩略图 https stackoverflow com questions 1347562 gettin
  • iOS 自定义单元格设计放在哪里? awakeFromNib 还是 cellForRowAtIndexPath?

    所以 基本上我用笔尖做了一个定制单元 希望我应用一些定制设计 比如颜色和阴影 我发现了两种应用样式的方法 awakeFromNib override func awakeFromNib super awakeFromNib Containe
  • 只读有运行时开销吗?

    出于某种原因 我一直认为readonly字段有与其相关的开销 我认为这是 CLR 跟踪是否存在readonly字段是否已初始化 这里的开销是一些额外的内存使用量 用于跟踪状态以及分配值时的检查 也许我这么认为是因为我不知道readonly字
  • Java ByteBuffer 性能问题

    在处理多个千兆字节文件时 我注意到一些奇怪的事情 似乎使用文件通道从文件读取到使用 allocateDirect 分配的重用 ByteBuffer 对象比从 MappedByteBuffer 读取要慢得多 事实上它甚至比读取到字节还要慢使用
  • 下面代码中的修剪选择点如何使其更加高效(Prolog)?

    在下面给出的代码中 有 cut 修剪选择点以提高效率 我非常确定reverse谓词和agent do moves谓词是必不可少的 solve task Task Cost agent current position oscar P sol
  • SQLite .NET 性能,如何加快速度?

    在我的系统上 约 86000 个 SQLite 插入需要长达 20 分钟 意味着每秒约 70 个插入 我要做数百万 我怎样才能加快速度 对每一行的 SQLiteConnection 对象调用 Open 和 Close 会降低性能吗 交易有帮
  • Google App Engine 如何预编译 Java?

    App Engine 对应用程序的 Java 字节码使用 预编译 过程 以增强应用程序在 Java 运行时环境中的性能 预编译代码的功能与原始字节码相同 有没有详细的信息这是做什么的 我在一个中找到了这个谷歌群组消息 http groups
  • 为什么 Python 中的无分支函数和内置函数速度较慢?

    我发现了 2 个无分支函数 它们可以在 python 中查找两个数字的最大值 并将它们与 if 语句和内置 max 函数进行比较 我认为无分支或内置函数将是最快的 但最快的是 if 语句函数 有人知道这是为什么吗 以下是功能 If 语句 2
  • 1.2.840.113556.1.4.1941 (LDAP_MATCHING_RULE_IN_CHAIN) 存在性能问题?

    LDAP 搜索有一些内置规则 其中之一是LDAP MATCHING RULE IN CHAIN From MSDN https msdn microsoft com en us library aa746475 v vs 85 aspx 1
  • 到 ToList() 还是不到 ToList()?

    给定一个在记忆中 不是 LINQ to SQL 类列表 List
  • Prolog 否定和逻辑否定

    假设我们有以下程序 a tom v pat 和查询 返回 false a X v X 当追踪时 我可以看到X被实例化为tom 谓词a tom 成功 因此 a tom fails 我在一些教程中读到 不 在Prolog中只是一个测试 不会导致

随机推荐

  • 为什么要包括警卫?

    包括定义的警卫here 用于防止在编译时两次加载相同的代码 为什么我的编译器 GCC 无法检测到它正在加载相同的代码两次并具有合理的默认行为 仅仅是因为您可能希望编译器加载该文件两次 请记住 那个 include只需加载一个文件并将其内容放
  • 我可以优化 Mercurial 克隆吗?

    我的 Mercurial 克隆变得非常慢 可能是由于磁盘碎片所致 有没有办法优化它 最明显的方法是创建一个新克隆 然后将我的 MQ 保存的捆绑包 hgrc 等复制到新克隆并删除旧克隆 但似乎有人以前遇到过这个问题并进行了扩展来做到这一点 如
  • 如何使用 std::rel_ops 自动提供比较运算符? [复制]

    这个问题在这里已经有答案了 如何获得运营商 gt gt lt and from and
  • 如何在 Python 中检测文件是否为二进制(非文本)?

    在 Python 中如何判断文件是否是二进制 非文本 我正在 Python 中搜索大量文件 并不断在二进制文件中获取匹配项 这使得输出看起来非常混乱 我知道我可以使用grep I 但我对数据的处理超出了 grep 允许的范围 过去 我只会搜
  • “此链接已停用,因为它未嵌入 JSF 表单中。”

    当我使用以下命令链接时
  • 比较悬空指针合法吗?

    比较悬空指针合法吗 int p q int a p a int b q b std cout lt lt p q lt lt n 注意两者如何p and q指向已经消失的物体 这合法吗 介绍 第一个问题是使用价值是否合法p at all A
  • 如何在 Java 中合并两个 XML

    我正在尝试用 Java 合并两个 xml 我正在使用 STaX API 来编写这些 XML 我在互联网上搜索了很多关于如何合并 xml 的信息 但没有一个看起来像C 有没有使用 StAX 在 Java 中执行此操作的直接方法 xslt 可能
  • 您如何组织版本控制存储库?

    首先 我知道这一点 您将如何为内部软件项目组织 Subversion 存储库 接下来 实际问题 我的团队正在重组我们的存储库 我正在寻找有关如何组织它的提示 在本例中为 SVN 这就是我们的想法 我们有一个存储库 多个项目和多个 svn e
  • 如何表示数据库中的继承? [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 我正在考虑如何在 SQL Server 数据库中表示复杂的结构 考虑一个需要存储一系列对象的详细信息的应用程序 这些对象共享一些属性 但有许多其他不常见的属性 例如 商业保险套餐可能在同一
  • SQL Server 字段被截断

    好的 我正在使用 SQL Server 2008 并且有一个类型的表字段VARCHAR MAX 问题是 当使用保存信息时Hibernate 内容VARCHAR MAX 字段被截断 我在应用程序服务器或数据库服务器上没有看到任何错误消息 该字
  • 访问 R 中列表列表的同名列表元素

    我经常遇到需要为不同变量创建许多相似模型的情况 通常我将它们转储到列表中 这是虚拟代码的示例 modlist lt lapply 1 10 function l data lt data frame Y rnorm 10 X rnorm 1
  • DataAnnotations 的 FileExtensions 属性在 MVC 中不起作用

    我正在尝试使用 MVC 中的 HTML FileUpload 控件上传文件 我想验证文件只接受特定的扩展名 我尝试过使用 DataAnnotations 命名空间的 FileExtensions 属性 但它不起作用 请参阅下面的代码 pub
  • openCSV 没有读取我的整个文件

    我有一个 Java 应用程序 我正在使用 openCSV 来读取文件 非常大 然后 我将第四列 如果有影响的话 最终会添加一列或两列 放入 HashSet 中 并将其输出到一个新文件中 这一切似乎工作正常 但我发现它只读取文件的一部分 27
  • 如何使用唯一复合键

    我有一张桌子 Item ItemName ItemSize Price Notes 我正在制作 ItemName ItemSize 的复合键来唯一标识项目 现在 在阅读了 stackoverflow 上建议使用 UNIQUE 的一些答案后
  • 我什么时候会选择 AesCryptoServiceProvider 而不是 AesManaged 或 RijndaelManaged?

    我认为区别因素是 AesCryptoServiceProvider 符合 FIPS 标准 AesManaged 是跨平台的 需要 NET 3 0 RijndaelManaged 在 NET 2 0 上运行 需要限制块大小 是这样吗 Aes托
  • 字段值必须唯一,除非为 NULL

    我正在使用 SQL Server 2005 我有一个必须包含唯一值或 NULL 值的字段 我认为我应该用以下任一方式强制执行此操作CHECK CONSTRAINT or a TRIGGER for INSERT UPDATE 与触发器相比
  • 无法验证 iOS 应用程序(已拥有有效证书)

    当切换到 Yosemite 时 我对 Mac 进行了全新安装 但现在将 iOS 提交到商店时遇到问题 当我验证我的存档时 我不断收到 您的帐户已经拥有有效的 iOS 分发证书 我已尝试从会员中心重命名并重新下载我的证书 但这不起作用 一个非
  • 为什么 (list 'quote 'x) 计算结果为 'x 而不是 ('x) 或 (quote 'x)?

    我正在尝试学习 LISP 并正在查看一个代码示例 其中使用了类似于以下代码的内容 列出 引文 5 这在 REPL 中评估为 5 我预计它的评估结果为 5 或 quote 5 我正在 CLISP REPL 中尝试这个 任何帮助 将不胜感激 读
  • 获取 CheckBoxList 项目值

    我有一个用数据填充的 CheckBoxList 当我尝试从列表中检索已检查的项目时 我只能获取项目序号 而无法获取该值 我读过您可以使用 Items i Value 但是当我尝试这样做时 我收到一条错误 指出没有扩展方法 值 这是我用来尝试
  • 在 Prolog 中更快地实现口头算术

    我已经做了一个工作概括口头算术Prolog 中的求解器 但速度太慢 仅运行简单的表达式 S EN D M O R E M O N E Y 就需要 8 分钟 有人可以帮助我让它运行得更快吗 verbalArithmetic List Word