谓词缓存

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(使用前将#替换为@)

谓词缓存 的相关文章

  • Prolog 中的聊天机器人

    我一直在尝试在序言中创建一个聊天机器人 作为作业 到目前为止 我已经在 pl 文件中创建了一个数据库 并且列出了很多可能的对话 我知道序言是这样工作的 例如如果我们有 Chatbot good 然后我们输入 Chatbot good 它会回
  • 在 Prolog 中表达“交换性”的替代方案?

    作为一个Prolog的初学者 我发现Prolog中的交换表达式非常不直观 例如 如果我想表达 X 和 Y 属于一个家庭 例如 family X Y married X Y relative X Y father son X Y 我还应该在定
  • 为什么在具体化中将 clpfd 变量分配给实际值?

    我正在开发一个 SWI Prolog 程序 该程序使用 CLP FD 约束来找到特定问题的解决方案 为此 我碰巧需要两个列表的 未定位 重叠 那是 List La长度为A List Lb长度为 B A gt B 未定位的重叠列表是La Lb
  • 求解序言中极其简单的方程:A = B + C?

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

    我从序言开始几周 但我看到了更深入的操作列表的递归谓词的构造 我的问题是 是否可以构建一个谓词 将给定列表拆分为给定数量的其他列表 比如我想象的 split H T NumberLists Lists 递归实现 split 1 2 3 4
  • 列表中的连续元素

    我正在阻止一个谓词来编码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
  • 问题 - 序言中的形式语言

    我正在尝试构建一个 DCG 它可以识别与此形式匹配的所有列表 a n b 2m c 2m d n 我写下了以下规则 s gt s gt ad ad gt a ad d ad gt bc bc gt b b bc c c bc gt a gt
  • SWI Prolog 使用的检查优化会发生什么情况?

    去引用SICStus Prolog 手册 https sicstus sics se sicstus docs 3 12 9 html sicstus Occur html 逻辑编程背后的通常数学理论禁止 创建循环项 规定发生检查应该是 每
  • 以系统的方式报告 Prolog 中查询失败的“原因”

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

    我知道这可能听起来很奇怪 但我想知道 Microsoft Visual F 正在进入的这个新世界中的一件事 这种语言有很多应用 我要学习 关于解析 函数式编程 结构化编程 但是人工智能呢 模糊逻辑有什么应用吗 F 是一种适合模糊逻辑应用程序
  • 如何在 Prolog 中解决这个算术表达式难题?

    我有一个编程问题 https blog svpino com 2015 05 08 solution to problem 5 and some other thoughts about this type of questions htt
  • Prolog:子句在源文件中不在一起

    我有这段代码 Family tree female pen male tom male bob female liz female pat female ann male jim parent pam bob parent tom bob
  • 谓词对于列表中的所有元素都必须为 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 等应用程序时 记事本将打开 但是 它不适用于使用命令提示符的应用程序 例如 当我尝试打开命令提示符窗口时 使用
  • 一次性删除不正确的后续解决方案

    我有一个谓词 它找到正确的解决方案 但随后又找到不正确的解决方案 data D data threshold nonredundantbumps D 5 Bs write D 3 6 7 8 2 4 5 6 9 4 7 3 D 3 6 7
  • 将 X 插入到排序列表中的正确位置

    在序言中 如何将 X 插入到排序列表中的正确位置 我的尝试 insert X Y Rest X Y Rest X lt Y insert X Rest BiggerRest 您的方向是正确的 但您需要解决这三个问题 insert X X i
  • SWI Prolog 转义引号

    我需要在序言中将 放在字符串周围 我从另一个程序获取输入 看起来我无法转义该程序中的 因此我必须在序言中添加 否则序言语句将不起作用 感谢您的帮助 为了讨论strings https stackoverflow com a 39922411
  • 将行读取到序言中的原子列表

    我需要将任何行 来自 user input 读入原子列表 例如 Example line which contains any ASCII chars into Example line which contains any ASCII c
  • Prolog 列表列表获取所有元素

    我有一个列表列表 decide 1 2 3 2 3 6 4 K 我想按 返回所有可能的解决方案 规则是首先返回其列表大小为 1 的值 然后我想返回其大小大于1的值 size 0 size Xs L size Xs N L is N 1 he
  • 查找列表中的最大值 - Prolog

    我刚刚接触 Prolog 并尝试编写一个谓词来查找整数列表的最大值 我需要写一个从头开始比较的内容 另一个从最后开始比较的内容 到目前为止 我有 max2 R max2 X Xs R X gt R max2 Xs X max2 X Xs R

随机推荐

  • 是否有取消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