谓词缓存

2024-01-12

是否有 Prolog 实现或库可以缓存谓词?

或者您会使用assertz/1 和retract/1 来实现一个例如FIFO 缓存,如下所示:

:- dynamic cache/1.
ccall(G) :- cache(G).
ccall(G) :-
    \+ cache(G),
    call(G),
    ( findall(G0,cache(G0),Gs), length(Gs,N), N =:= 100 -> once retract(cache(_)) ; true ),
    assertz(cache(G)).

在 ECLiPSe-CLP 中,至少可以使用额外逻辑变量替换 findall/3 行:

...
( getval(cache_size) =:= 100 -> once retract(cache(_)) ; incval(cache_size) ),
...

在我的机器上,对此 ccall/1 的 1000 次调用需要 >4.00 cpu 秒,而实际目标 cpu 时间可以忽略不计(0.04 cpu 秒)。 所以我猜想在解释器内部实现的缓存(特别是 LRU 缓存等)仍然会优于assertz/1 和retract/1。

当然,我不想对每个谓词进行缓存,只对极少数谓词进行缓存。一个场景可能是这样的:p([H|T], E) :- q(H,E) ; p(T,E) with q/2无副作用。p/2需要一个稳定增长的列表,但总是/经常是相同的E.


你想要表格/记忆 https://secure.wikimedia.org/wikipedia/en/wiki/Tabling?
XSB http://xsb.sourceforge.net/提供自动制表(您可以声明要制表的谓词)

是的,assertz/1 等有点慢

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

谓词缓存 的相关文章

  • 如何在 GNU Prolog 中使用“long int”?

    所以基本上看来 GNU Prolog 在我的 32 位 x86 Linux 上使用 28 位整数 下面的代码无法编译 foo A A0 is 0xdeadbeef A1 is A0 gt gt 8 A2 is A0 gt gt 16 A3
  • Prolog 同构图

    这里尝试解决同构图问题 作业信息 判断2个无向图是否同构 没有孤立的顶点 顶点数小于30 图的边作为谓词给出 即 e 1 2 f 1 2 我正在尝试使用以下方法 对于每对边 即图 1 和图 2 中的每条边 Try to bind the v
  • SWI-Prolog 中的约束编程

    我想要一个包含三个元素 A B 和 C 的列表 L 并具有以下约束 use module library clpfd L A B C L ins 1 3 A B C 但是 它给出了一个错误 Syntax error Operator exp
  • 为什么在具体化中将 clpfd 变量分配给实际值?

    我正在开发一个 SWI Prolog 程序 该程序使用 CLP FD 约束来找到特定问题的解决方案 为此 我碰巧需要两个列表的 未定位 重叠 那是 List La长度为A List Lb长度为 B A gt B 未定位的重叠列表是La Lb
  • 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 中读取用户输入的字符串

    我是 Prolog 初学者 我正在使用 swi prolog 刚刚开始使用它 我需要将用户输入字符串拆分到列表中 我尝试了以下代码 但出现错误 指出 在子句正文中完全停止 无法重新定义 2 write Enter the String nl
  • 列表中的连续元素

    我正在阻止一个谓词来编码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
  • 导入 csv 文件数据以填充 Prolog 知识库

    我有一个 csv 文件example csv其中包含两列 标题为 var1 和 var2 我想填充一个最初为空的 Prolog 知识库文件import pl具有重复的事实 而每一行example csv处理方式相同 fact A1 A2 f
  • 如何找到排列的索引

    index List Idx Predicate will get List with permutation and I want to know index of permutation For example index 4 1 3
  • 谓词对于列表中的所有元素都必须为 true

    我有一组事实 likes john mary likes mary robert likes robert kate likes alan george likes alan mary likes george mary likes har
  • 在 SWI Prolog 中使用 process_create/3 使用命令提示符或 shell 时出错

    在 Windows 7 上 当我在 SWI Prolog 中使用 process create 3 打开 Notepad exe 等应用程序时 记事本将打开 但是 它不适用于使用命令提示符的应用程序 例如 当我尝试打开命令提示符窗口时 使用
  • 通过递归扩展 Prolog 目标?

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

    这可能是 SWI Prolog 模块系统特有的 假设我们有三个 Prolog 模块 在 SWI Prolog 模块系统中 robin 在文件中robin pl arthur 在文件中arthur pl helper 在文件中helper p
  • 高阶“解决方案”谓词

    我正在使用一个更高阶的 Prolog 变体 它缺少findall 还有一个关于实现我们自己的问题findall here 获取 Prolog 中的解决方案列表 https stackoverflow com questions 419103
  • 变量的多个值介于 0 和数字序言之间

    所以我一直在尝试自学序言 我认为我进展顺利 然而 我有点坚持我正在尝试的这一种方法 toN N A A 等于 0 到 N 1 之间的整数值 按升序生成 所以 toN 5 A 将是 A 0 A 1 A 2 A 3 A 4 我对序言还很陌生 所
  • Prolog:如何在不重复的情况下创建所有可能的组合

    我正在尝试创建一个谓词来查找所有可能的组合而不重复相同的数字 我尝试使用排列谓词 但它发现了重复的列表 例如 permutation 0 1 1 L L 0 1 1 L 0 1 1 L 1 0 1 L 1 1 0 L 1 0 1 L 1 1
  • 判断第一个字母是否是元音序言

    我习惯了过程式编程语言 而且我在 prolog 上遇到了一些困难 缺乏在线资源也是一个遗憾 获取给定变量的第一个字符并检查它是否是元音的最 序言 方式是什么 我想 这样的东西就是我所追求的 这都是伪代码 但这是你解决问题的方法吗 isVow
  • 我应该如何在序言中设计这个谓词?

    我必须写一个谓词stepup L Z X where L是一个列表并且Z and X是整数 它应该返回true if the Z可以步入X使用列表中用户给出的合法步骤 例如 stepup 7 12 19 6 32 应该返回true sinc
  • Prolog 在技术上是如何工作的?引擎盖下是什么?

    我想更多地了解 Prolog 的内部结构并了解它是如何工作的 我知道如何使用它 但不是它内部如何运作 Prolog 中使用的算法和概念的名称是什么 它可能会构建某种树结构或有向对象图 然后在查询时使用复杂的算法遍历该图 也许是深度优先搜索
  • 简单的布尔表达式测试

    user compiling user for byte code formula 0 P Q P Q P user compiled 2 lines read 768 bytes written 37208 ms yes formula

随机推荐

  • 是否有取消window.onbeforeunload的回调

    我没有实际的用例 但我很好奇 如果用户在触发 window onbeforeunload 时单击 留在此页面上 是否有办法做出反应 回调 http jsfiddle net rWHU9 http jsfiddle net rWHU9 fun
  • Angular JS 在 ng-repeat 中绑定范围数据以形成

    我在 scope data 中有一个项目集合 其中包含字段 id name 和 age 这些项目正在使用 ng repeat 指令显示在视图中 对于每组项目 都有一个相应的 编辑按钮 我希望能够访问按下编辑按钮的特定项目集的值 Html d
  • 使用播放开始时 NoClassDefFoundError => ClassPath$JavaContext

    我制作了一个小的 Scala Play2 0 2 应用程序 我使用时效果很好play run命令 但是当我使用play start or play clean compile stage target start 当尝试使用 Casbah
  • Flask 应用部署到 heroku 时出现 H10 错误

    我的应用程序在本地主机上运行良好 但是当我在 heroku 上部署 Flask 应用程序时出现以下错误 2020 07 01T09 56 02 982007 00 00 heroku router at error code H10 des
  • PHP/MySQL 中的文件下载时间

    我想通过向我的 MySQL 服务器发送请求来查找 PHP 的下载时间 我有一张带有用于下载文件的 href 链接的表 如果我单击下载 下载时间应显示在表格中的文件名旁边 请查看我的代码
  • C# Windows“打开方式>”上下文菜单行为[重复]

    这个问题在这里已经有答案了 可能的重复 文件类型与应用程序关联 C https stackoverflow com questions 222561 filetype association with application c 我正在编写
  • 用命令输出替换视觉选择

    我想用通过管道传输到命令中的选择结果来替换一行的部分内容 例如 echo hello echo world base64 vim 这将打开一个缓冲区hello d29ybGQK在里面 现在按wvw直观地选择d29ybGQK 然后我尝试了 b
  • Google 地图路线上的点击事件

    我试图在点击路线的任何地方画一个圆圈 我寻找有关如何使路线可点击的解决方案 但找不到任何有用的东西 下面是我的代码 单击路线时没有出现任何错误 但没有创建圆圈 directionsDisplay new google maps Direct
  • 如何设置占位符文本的填充

    我正在使用输入标签并在其中设置了占位符值 现在 我想为其中的占位符文本设置填充 但我不能 这是我尝试过的 HTML
  • 如何使用 Javascript 将内容写入另一个浏览器窗口?

    我已经使用 window open 打开了一个新窗口 并且我想使用 window open 调用中的引用将内容写入新窗口 我尝试使用 myWindow document body innerHTML oldWindowDiv innerHT
  • JSON-LD 中的多个上下文

    如何访问 JSON LD 中的两个单独的词汇 我可以使用 2 个 contexts 吗 例如 context vocab http schema org first name givenName last name familyName c
  • 通过 yum install openssl11 将 CentOS 7 升级到 OpenSSL 1.1.1

    我使用 Centos 7 和 OpenSSL 1 0 2k openssl 1 0 2k 19 el7 x86 64 rpm 我尝试通过以下方式升级到 OpenSSL 1 1 1c yum install openssl11 基本上安装 o
  • 如何在多个 C# 调用中使用临时表

    我有一个 C 应用程序 使用 ADO Net 连接到 MSSQL 我需要创建表 具有动态数量的列 然后插入许多记录 然后从表中执行选择操作 每个步骤都必须是单独的 C 调用 尽管我可以在此期间保持连接 事务打开 问题是 Temp 表仅存在于
  • Android - 获取资源编号值时没有已知的包

    我最近更新了我的 android sdk 突然当我尝试构建我的 android 应用程序时 该应用程序出现在我的设备上 但没有采用应用程序图标 并且名称是包名称而不是应用程序名称 然后崩溃马上 在 logcat 中 生成了下图 有没有其他人
  • 如何检查目录是否是厨师中的符号链接

    我只想删除不是 symlnik 的目录 directory var www html do action delete only if end 所选答案不适用于 Windows 或 Bash 为默认解释器的系统 您应该使用跨平台的 Ruby
  • 使用自定义公式函数/自动化脚本的 Maximo 公式?

    在 Maximo 7 6 1 1 中 我想创建一个使用自定义公式函数 自动化脚本的属性公式 我尝试按照以下步骤执行此操作 但不幸的是 当我尝试在 WO Tracking 中使用它时出现错误 BMXAA3761E The event has
  • 在 Visual Studio Code 中使用奇异容器作为 python 解释器

    我通过 VScode 远程 ssh 连接到 HPC 环境 并希望直接在 VScode 中运行 python 代码以进行测试 我想将 python 解释器设置为一个在执行时运行 python 的奇点容器 这是通过在容器的 def 文件中添加以
  • 如何替换 UITableViewCell 中的 imageView?

    我有一个继承自 UIImageView 的类型 但添加了一些额外的功能 我想将它作为图像视图放入我的 UITableViewCells 中 但不想做一个全新的单元格布局 以便我可以添加此图像 当我尝试直接设置图像视图时 self image
  • 如何继承父级到两个具有相同字段的视图控制器? [复制]

    这个问题在这里已经有答案了 我在情节提要上有 2 个 viewController 每个都有UITextField同名 我有一个父类 它保存的属性名称UITextField 父类继承泛型UIViewController班级 每个 我的 vi
  • 谓词缓存

    是否有 Prolog 实现或库可以缓存谓词 或者您会使用assertz 1 和retract 1 来实现一个例如FIFO 缓存 如下所示 dynamic cache 1 ccall G cache G ccall G cache G cal