SWI-Prolog 中的 catch/3 和 call_with_time_limit/2 谓词

2024-01-01

我想用

catch(:Goal, +Catcher, :Recover)

目标在哪里

call_with_time_limit(+Time, :Goal)

它很混乱,我找不到正确的方法来知道上述情况之一何时发生:

1) 进球因超时而停止。

2)目标失败(有时应该会失败)。

I tried:

(catch(call_with_time_limit(Time, Goal), Catcher, Recover) ->
(ground(Catcher), Catcher = time_limit_exceeded), **TIMEOUT ACTIONS**)
;
(**SUCCESS ACTIONS**))
;
**FAILURE ACTIONS**
)

* EDIT *

Pattern:

我使用以下模式:

((catch(call_with_time_limit(6,goal),
    Exception,
    true),(var(Exception);Exception=time_limit_exceeded))
->
    (var(Exception) -> writeln(succ) ; writeln(timeout))
;
    writeln(fail)
).

该模式在 4 秒或更长时间内不起作用 - 它只是忽略超时请求。


您的问题涉及两个不同的部分。一、方式如何catch/3可以用来处理这样的情况。然后是超时机制本身。

捕获错误和异常catch/3

一般来说,最惯用的使用方式catch/3就像这样:

   ...,
   catch((R = success, Goal), Pat, R = error(Pat)),
   ...

然而,捕获所有错误/异常通常会导致程序容易出错,因为可能会掩盖严重的意外错误。

在您的特定情况下,您只想捕获单个模式,因此:

   ...,
   catch((R = success, call_with_time_limit(Time,Goal)),
          time_limit_exceeded,
          R = timeout ),
   ...

请注意,使用以下命令测试未实例化的变量var(Pat)可能是一个容易被忽略的错误来源。

处理超时

不同的系统提供了多种接口。但最根本的问题是你真正想要实现什么。您想要限制实时、CPU 时间还是仅限制资源?

time_out/3 in library(timeout) http://sicstus.sics.se/sicstus/docs/4.1.0/html/sicstus/lib_002dtimeout.html可能是最先进的,最初是在 1992 年为 SICStus Prolog 开发的。SWI 和 YAP 中有一些兼容的实现。但是,SWI 和 YAP 无法处理嵌套情况。而且SWI 不限制CPU 时间。界面是:

time_out(:Goal_0, +TimeMs, -Result)

call_with_time_limit/3是 SWI 的一个相当特殊的内置函数,它不符合内置函数的常见约定。此外,它称其目标为once(Goal_0)仅有的。我宁愿不。

call_with_inference_limit/3目前仅出现在 SWI 的最新版本中,并使用类似的约定time_out/3。它限制推理次数而不是 CPU 时间。因此,它非常适合检测程序员的循环,但可能不适合您的任务。

wait_for_input/3 http://www.swi-prolog.org/pldoc/man?predicate=wait_for_input/3如果您的超时仅与读取数据有关,这可能是您的一个选择。

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

SWI-Prolog 中的 catch/3 和 call_with_time_limit/2 谓词 的相关文章

  • 如何使用 Prolog 查找二叉树的深度

    我正在学习 Prolog 并试图找到一个深度二叉树使用 Prolog 我代表一棵树是这样的 nil is a tree tree 1 nil nil this is a leaf tree 1 tree 1 nil nil nil this
  • AllegroGraph 检查现有三元组

    我正在使用 AllegroGraph 4 我有一个三元组存储 并且只有在新的三元组尚不存在时我才会尝试添加它们 这是我的 Prolog 查询 select news alfas news a news tst has annotation
  • Prolog,如何在 write() 中显示多个输出

    go match Mn Fn write Matching Result nl write Mn write match with write Fn match Mn1 Fn1 person may female 25 blue perso
  • Prolog 追加与剪切运算符

    当我们使用append和cut操作符时会出现什么问题 append2 L L append2 H T L H TL append2 T L TL 我尝试了几种不同的输入 但总是成功 append2 1 2 5 L L 1 2 5 appen
  • 包含 Tomcat 7(当 servlet 项目时)不会在 45 秒内启动...并且增加超时并不能解决问题

    当尝试运行 Web 应用程序 带有 servlet 时 Tomcat 7 未启动 当我只有一个 html 页面时 服务器运行良好 但是当我尝试添加 servlet 并将其添加到 tomcat 时 然后服务器不启动启动并给出错误 Tomcat
  • 在 Prolog 中表达“交换性”的替代方案?

    作为一个Prolog的初学者 我发现Prolog中的交换表达式非常不直观 例如 如果我想表达 X 和 Y 属于一个家庭 例如 family X Y married X Y relative X Y father son X Y 我还应该在定
  • YAP Prolog 中的正向链接?

    我需要在某些 Prolog 问题中使用前向链接器 我想避免使用普通元解释器从头开始实现它 但如果没有其他选项可用 这就是我必须要做的 因为使用元解释器执行此操作会很慢 而且我我确信应该有一些好的实现 有人知道 YAP 或 SWI Prolo
  • Google Guava Cache - 在运行时更改驱逐超时值

    我正在使用以下内容 LoadingCache
  • 在 Python 中使用多处理创建超时函数

    我正在尝试使用多处理库在 Python 2 7 11 在 Windows 上 中创建超时函数 我的基本目标是 如果函数超时 则返回一个值 如果函数未超时 则返回实际值 我的方法如下 from multiprocessing import P
  • Prolog - 从列表中删除具有相同第一个值的对

    我有这样的对象列表 list obj x y obj x z obj a b obj b c 我想删除那些共享相同第一个值的元素 这样我就可以使用修改后的列表 在这种情况下 最终列表将如下所示 list obj a b obj b c 有人
  • 谁给了 SWI-Prolog 幽默感?

    谁给了 SWI Prolog 幽默感 Welcome to SWI Prolog threaded 64 bits version 7 3 35 SWI Prolog comes with ABSOLUTELY NO WARRANTY Th
  • 寻找最大最小值集合

    我正在尝试编写一个 天真的或半天真的 程序 给定一组元素和许多玩家将其划分为这个数量的玩家 并且对于每个这样的划分取最小值 按总和 子集 然后 我想计算所有这些最小除法的最大值 这被称为https en wikipedia org wiki
  • 如何从序言中的列表中删除列表?

    我想在序言中实现以下问题 Given L1 1 2 3 4 and L2 2 3 4 调用名为remove list L1 L2 L 的函数将从L1中删除L2 所以L将是 1 但是 如果第二个列表的元素与 L1 中的元素顺序不同 或者更准确
  • Prolog 管线任务

    我有一项任务是在序言中制作一张简化的地铁地图 其中一部分要求制定一项规则来检查两个车站是否在同一条线上 我有一条规则 但它似乎不起作用 这就是我到目前为止所拥有的 adjacent nh lg central 4 adjacent lg o
  • 超时已过。操作完成之前超时时间已过,或者服务器未响应。该语句已终止

    我的网站有很多用户 每天20000 60000 这是一个移动文件下载网站 我可以远程访问我的服务器 Windows Server 2008 R2 我收到了 服务器不可用 之前有错误 但现在我看到连接超时错误 我对此不熟悉 为什么会发生这种情
  • Prolog 中的匹配元组

    为什么Prolog匹配 X Xs 包含更多元素的元组 一个例子 test2 X Xs write X nl test2 Xs test2 X write X nl test
  • 超时设置为无限时间时出现超时异常

    在我的 C NET 3 5 应用程序中 我使用 CastleProject ActiveRecord 而不是 NHibernate 这是使用 MS SQL Server 2008 的桌面应用程序 我已将 ADO 命令超时设置为 0 以防止批
  • 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
  • MSTest:如何增加测试时间

    我有一个测试需要运行超过 1 分钟 VS2008 MSTest 测试是从 VisualStudio 启动的 const int TestTimeout 1 TestMethod Timeout 10 60 1000 10 minutes p
  • Prolog 过滤自定义目标失败的所有元素的列表

    我正在尝试写一个谓词filter List PredName Result 过滤一个List目标的所有要素PredName失败并随后返回Result列表 谓词PredName 1应该在调用过程时定义filter 3例如可以是 test N

随机推荐

  • 在r中按组绘制散点图

    r 中是否有任何函数允许绘制这种按组分隔点的散点图 这是我到目前为止所做的 hours c 0 00 1 78 0 50 2 00 2 80 2 00 0 16 0 34 1 00 1 00 2 00 1 34 1 00 1 10 0 43
  • 是否应该将 .gradle 文件夹添加到版本控制中?

    Gradle 创建一个名为的文件夹 gradle 我应该使用版本控制 即 git 跟踪它吗 更重要的是 为什么 为什么不 我应该跟踪 gradle 目录吗 不 可以放心地忽略它 我为什么要忽略它 它纯粹是为了缓存信息 您不希望它出现在您的存
  • Julia - 将行/列添加到稀疏矩阵

    有没有快速的方法将列 行添加到稀疏矩阵 a sparse 1 2 1 2 1 1 2x2 sparse matrix with 2 Int64 entries 1 1 1 2 2 1 我怎样才能添加 f x a 3 3 1 无需取出所有值并
  • ARM UART0 输入输出。 LPC2138 我做错了什么。 [复制]

    这个问题在这里已经有答案了 read character LDR r0 0xE000C014 LDRB r1 r0 BIC r1 r1 0xFFFFFFF0 CMP r1 0 BEQ read character LDR r6 r1 LDR
  • Maven 测试期间未找到 persistence.xml

    我正在尝试在 Maven 构建期间将测试数据加载到测试数据库中以进行集成测试 persistence xml 正在被复制到target test classes META INF 正确 但在运行测试时出现此异常 javax persiste
  • Jquery变量变量

    存在一些像变量变量这样的概念来打印变量名称或动态调用函数 http php net manual en language variables variable php http php net manual en language vari
  • 检测php编码

    我有以下字符串 如何将此字符串编码为 int UTF 8 文件 PHP 我花了一整天的时间来了解如何做到这一点 我认为这就是您正在寻找的 http www php net manual en function mb detect encod
  • 3D 数组 -> 应用 -> 3D 数组

    它似乎apply仅在一个边距上操作时不会重新组装 3D 阵列 考虑 arr lt array runif 2 4 3 dim c 2 4 3 dimnames list a paste0 a 1 2 b paste0 b 1 4 c pas
  • DTSTART 的 PHP 日期转 iCal 日期格式

    有没有一种简单的方法可以使用 php 日期获取 iCal DTSTART 的正确格式 如果我没有时间 我需要的格式如下 20111008T110000 或 20111008 这个很简单 PHP 日期是否有一种快速的方法来做到这一点 特别是在
  • 错误:捕获异常 [错误:不支持的命令 [addSelection |]

    我正在使用带有 C 的 selenium Web 驱动程序 并在尝试选择可用列表上的项目时收到错误如下 错误 捕获异常 错误 不支持的命令 addSelection 有人可以帮我弄这个吗 有什么解决办法吗 我正在尝试从左侧的列表中选择一个项
  • 将 SQL 查询转换为 django 查询

    我正在尝试将 sql 查询转换为 django 查询 但未能做到这一点 任何人都可以帮助我 select id name round value numeric 2 as value st transform geometry 3857 a
  • 被逐出的对象仍然会向 Hibernate 中的数据库发出更新

    我有一个问题 我驱逐一个实体 但对其进行的更改仍然会更改数据库 这是我的 DAO 中方法的一部分 Entity public class Profile Id GeneratedValue private Long id OneToMany
  • C++ getter 中的 const [重复]

    这个问题在这里已经有答案了 我仍在学习 C 并且我正在阅读所有我必须使用的内容const尽我所能 我认为是出于速度原因 我通常这样写 getter 方法 const bool isReady return ready 但我看到一些IDEA以
  • Linux C 原始套接字 TCP 握手

    我正在尝试使用 C 中的原始套接字 在 Debian 系统上 创建 TCP 连接 但我很难让它工作 它会发送一个数据包 但我没有从服务器得到任何响应 我已经测试并比较了该数据包与从 nmap 发送的数据包 我看不到任何重大差异 这是服务器端
  • jquery ui datepicker 在 beforeShowDay 出现错误

    我正在尝试使用 jquery ui 的日期选择器来实现事件日历 我已经成功安装了日期选择器并且它显示并工作 当我尝试注册时出现问题beforeShowDay处理程序 像这样 datePicker datepicker beforeShowD
  • 序列不包含匹配元素

    我有一个 ASP NET 应用程序 其中使用 linq 进行数据操作 运行时 我收到异常 序列不包含匹配元素 if lstAcl Documents Count gt 0 for i 0 i lt lstAcl Documents Coun
  • Cordova 插件,用于使用 URL 模式从浏览器启动应用程序

    我们可以从 iOS 和 Android 中的浏览器启动应用程序 它是使用 URL 模式实现的 想知道是否有任何 Cordova 插件可以处理上述情况 你有没有尝试过LaunchMyApp PhoneGap 插件 https github c
  • 包装对 malloc()/realloc() 的调用...这是一个好主意吗?

    对于分配 我需要分配一个动态缓冲区 使用malloc 对于初始缓冲区和realloc 如果需要扩大该缓冲区 在我使用 re m alloc 的任何地方 代码如下所示 char buffer malloc size if buffer NUL
  • 防止两个连接共享同一个锚点

    我正在使用 jsPlumb 来允许用户构建图表 我允许用户拖动这些元素 因此我为每个端点使用锚点集合 让 jsPlumb 在建立连接时从该集合中为我选择 最佳 锚点 我遇到的问题是 我可能有来自任何给定端点的多达十几个连接 因此当许多人最终
  • SWI-Prolog 中的 catch/3 和 call_with_time_limit/2 谓词

    我想用 catch Goal Catcher Recover 目标在哪里 call with time limit Time Goal 它很混乱 我找不到正确的方法来知道上述情况之一何时发生 1 进球因超时而停止 2 目标失败 有时应该会失