如何从 Prolog 中保留函数的第一个结果?

2023-12-01

我需要编写一个自定义函数,该函数将被其他固定函数多次调用。在此函数中,在第一次调用时,它将返回文件的总行数。该函数的第二次调用时间(forward)将返回该文件的小部分中的行数。我的问题是如何保留第一个返回的结果(文件的总行数)并将其用于函数的下一个调用时间。我只需要在这个函数中编写或声明任何东西(而不是在调用者中)。像这样的东西:

myFunction(Input, MyResult, FirstResult) :-
   calculateInputFunction(Input, Result),
   !,
   MyResult is Result,
   ... .

问题是,每次调用 myFunction 时,它都会收到不同的 Input 并返回不同的 MyResult。但我想保留第一个 MyResult 以用于 myFunction 的下一次调用时间。我怎样才能做到这一点?非常感谢您提前的答复。

myFunction([V1,V2], Result) :-
  reset,
  cached_all(a(V1,V2)),
  use V1, V2 to calculate Result, 
  ...
  reset,
  finishedCode. 

上面是我的函数,还有其他函数会通过将 V1、V2 的值传递给该函数来调用 myFunction 并返回 Result。


您需要的是某种形式的缓存机制。这必须以某种方式使用一些全球资源。动态数据库通常用于此目的 目的。这是它的一个非常简单的形式。该领域中更复杂的技术在表格概念下是已知的。

:- dynamic(cachedgoal_sol/2).

reset :-
   retractall(cachedgoal_sol(_,_)).


eq(A, B) :-
   subsumes_term(A, B),
   subsumes_term(B, A).

cached_call(Goal) :-
   \+ ( cachedgoal_sol(Skel,_), eq(Skel, Goal) ),  % No fitting Goal was cached
   copy_term(Goal, Skel),
      catch(
        (  Goal,
           assertz(cachedgoal_sol(Skel,Goal)),
           fail
        ),
        Pat,
        (reset, throw(Pat))).
cached_call(Goal) :-
   cachedgoal_sol(Skel,XGoal),
    eq(Skel, Goal),
    XGoal = Goal.

用法:开始于reset.然后,包起来Goal as cached_call(Goal)。当事情发生变化时,不要忘记重置!

以下是一些解释:

reset/0只是删除所有缓存的结果。

eq/2等于变量重命名,前提是两个参数的变量集不相交。

cachedgoal_sol/2是一个动态谓词。它用于存储特定目标的解决方案(实际上:答案)。为此,它在第一个参数中保留实际目标的副本,在第二个参数中保留实际答案/解决方案的副本。请注意,对于一个谓词可能有多个不同的查询。说:member(X,[a,b,c]) and member(X,[X1,X2,X3])。这些查询将彼此独立地处理和缓存。

如果必须重新缓存某个目标,则会创建该术语的副本以拥有缓存的“密钥”。然后,执行目标并存储每个答案 - 这是彻底完成的。这对于具有多个答案的查询尤其有趣。

此外,目标受到保护catch/3捕获所有错误Pat。这样,在执行目标时发生的所有错误都会导致reset的缓存。这对于非终止查询尤其重要:cached_call(length(L,N))否则会在缓存中留下有限数量的解决方案 - 这将使缓存处于不一致的状态......

无论如何,第一条总是失败。所以这里只是为了更新缓存的副作用。

第二个子句现在使用缓存。请注意,这是不可能的XGoal = Goal“再向左”,因为eq/2必须确保我们仅使用同一查询的结果。

正如我已经说过的:这是一种非常幼稚的方法,但至少它很简单并且相对健壮。


至于你原来的程序。你现在可以写:

..., cached_call(calculateInputFunction(Input, Result)), ...

每次你需要这个值的时候。

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

如何从 Prolog 中保留函数的第一个结果? 的相关文章

  • 实现用户定义的算术函数

    如何添加函数 例如汉明权重 并在右侧出现的表达式中使用它是一些 is 2 goal 像 goal expansion 或 term expansion 这样的东西可以帮助这里吗 我承认这不是一个大功能 但它可以提高我的一些 Prolog 程
  • 在 Java 中加载和缓存图像的最佳方法是什么?

    我有超过一千个 16 x 16 像素图块图像的大量集合 我在 Java 中制作的游戏需要这些图像 在不耗尽 JVM 可用内存的情况下存储切片的最佳方法是什么 我认为生成 1000 BufferedImages 可能并不明智 保持图像准备就绪
  • 在 C# 中实现记忆化 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我知道这个话题 记忆 已经被讨论了很多 比如here https stackoverflow com questions 285216
  • 如何确定一个日期范围是否出现在另一个日期范围内的任何时间?

    我有一个事件表 指定日期范围start date and end date字段 我有另一个在代码中指定的日期范围 它将当前周定义为 week start 和 week end 我想查询本周的所有活动 这些案例似乎是 活动在一周内开始和结束
  • Prolog 过滤自定义目标失败的所有元素的列表

    我正在尝试写一个谓词filter List PredName Result 过滤一个List目标的所有要素PredName失败并随后返回Result列表 谓词PredName 1应该在调用过程时定义filter 3例如可以是 test N
  • GitHub Actions:如何缓存测试容器的 Docker 映像?

    我使用 Testcontainers 在 GitHub Actions 中执行一些测试 Testcontainers 提取我的测试中使用的图像 不幸的是 每次构建时都会再次提取图像 如何在 GitHub Actions 中缓存图像 GitH
  • 避免 AngularJS 部分视图在 IE 中缓存

    我正在开发一个 ASP NET MVC 应用程序 它也有一些 angularJS 我有一个主页 其中有不同的选项卡 当您单击它们时 它们会加载角度部分视图 主页是这样的 div class widget div div class widg
  • 在 SPA 中加载外部脚本和样式文件

    我有一种 SPA 它使用 API 来获取数据 该 SPA 有一些实例 它们都使用通用样式和脚本文件 所以我的问题是 当我更改这些文件中的一行时 我将必须打开每个实例并更新文件 这对我来说真的很耗时 一种方法是将这些文件放在服务器中的文件夹中
  • 熊猫记忆

    我有冗长的计算 我重复了很多次 因此 我想使用记忆 诸如jug http packages python org Jug and joblib http packages python org joblib memory html 与Pan
  • 如何在高速缓存中存储图像

    我对此完全空白 我想从 URL 下载图像 并且必须将其存储在内部 以便下次我不需要连接到网络 而是从缓存中检索它 但我不知道该怎么做 谁能帮我提供一个代码片段 import java io BufferedInputStream impor
  • 如何缓存 ASP.NET 网站以获得更好的性能

    我是一名网页设计师 通常设计不需要更新的企业网站 所以我想将输出缓存一天 我怎样才能做到这一点 此外 任何有关在慢速服务器上提高 ASP NET 性能的建议都被接受 请注意 ASP NET 缓存有一个bug http connect mic
  • 通过分布式数据库聚合作业优化网络带宽

    我有一个分布式 联合数据库 结构如下 数据库分布在三个地理位置 节点 每个节点集群有多个数据库 关系数据库是 PostgreSQL MySQL Oracle 和 MS SQL Server 的混合体 非关系数据库是 MongoDB 或 Ca
  • 使 Django 1.3.1 中的视图缓存过期

    我正在尝试使模型上的视图级缓存过期post save 这是通过设置的https docs djangoproject com en 1 3 topics cache from olddocs the per view cache https
  • 在 Ruby 中跨多个类实例记忆数据的好方法是什么?

    考虑 生成数据的对象的许多实例 如果每次运行只生成一次该数据 那就太好了 class HighOfNPeriods lt Indicator def generate data indicator data DataStream new 0
  • ASP.NET 中 HTTP 缓存相关标头的有效含义

    我正在 ASP NET 2 0 中开发一个 Web 应用程序 其中涉及通过资源处理程序 ashx 提供图像 我刚刚实现了处理缓存标头和条件 GET 请求 这样我就不必为每个请求提供所有图像 但我不确定我是否完全理解浏览器缓存发生了什么 图像
  • 如何确定lru_cache所需的maxsize?

    如果我们创建一个类似返回斐波那契数列的递归函数 并使用lru cache 真正的总督是什么max size范围 很明显 我们在计算每一项时只需要最后两项 但是设置maxsize to 2并运行第一个1000计算需要很长时间才能完成 我尝试使
  • gitlab-ci 的缓存虚拟环境

    我使用 Gitlab CI 脚本缓存了 Pip 包 所以这不是问题 现在我还想赶上Conda虚拟环境 因为它减少了设置环境的时间 我缓存了一个虚拟环境 不幸的是 最后需要很长时间才能缓存所有 venv 文件 我尝试仅缓存 CI PROJEC
  • 当前的 x86 架构是否支持非临时加载(来自“正常”内存)?

    我知道有关此主题的多个问题 但是 我没有看到任何明确的答案或任何基准测量 因此 我创建了一个处理两个整数数组的简单程序 第一个数组a非常大 64 MB 第二个数组b很小 无法放入 L1 缓存 程序迭代a并将其元素添加到相应的元素中b在模块化
  • 通过 HTML 或 JavaScript 禁用 Web 表单上的自动填充?

    有没有办法通过 HTML 或 JavaScript 禁用 Chrome 和其他浏览器中表单字段的自动填充 我不希望浏览器自动填写该浏览器以前用户的表单上的答案 我知道我可以清除缓存 但我不能依赖重复清除缓存 您可以在 HTML 的输入级别添
  • 如何强制刷新 CallLog.Calls.CACHED_NAME 列?

    我的目标是从通话记录中收集所有未知的电话号码 这可以通过以下代码来实现 private static final String CALLOG PROJECTION CallLog Calls ID CallLog Calls CACHED

随机推荐