Prolog 是否有像 Common Lisp 一样的条件和重启系统?

2024-01-17

Common Lisp 允许异常处理条件并重新启动 http://www.gigamonkeys.com/book/beyond-exception-handling-conditions-and-restarts.html。粗略地说,当函数抛出异常时,“捕获器”可以决定“抛出器”应如何/是否继续进行。 Prolog 提供类似的系统吗?如果没有,是否可以在现有谓词之上构建一个来遍历和检查调用堆栈?


The Prolog的ISO/IEC标准 https://stackoverflow.com/tags/iso-prolog/info仅提供了非常基本的异常和错误处理机制,或多或少与 Java 提供的机制相当,与 Common Lisp 的丰富机制相去甚远,但仍有一些值得注意的地方。特别是,除了实际的信令和处理机制之外,许多系统还提供类似于unwind-protect。也就是说,即使存在未处理的信号,也能确保目标得到执行。

ISO 投掷/1,接球/3

引发/抛出异常throw(Term)。首先是一份副本Term是用创建的copy_term/2让我们称之为Termcopy然后这个新副本用于搜索相应的catch(Goal, Pattern, Handler)其第二个参数与Termcopy. When Handler执行后,所有统一均由Goal被撤销。所以没有办法Handler访问出现的替换throw/1被执行。并且没有办法在原来的地方继续下去throw/1被处决。

内置谓词的错误通过执行来发出信号throw(error(Error_term, Imp_def)) where Error_term对应于其中之一ISO 的错误类别 http://www.complang.tuwien.ac.at/ulrich/iso-prolog/error_k#error_classes and Imp_def可以提供实现定义的额外信息(如源文件、行号等)。

在许多情况下,在本地处理错误会带来很大好处,但许多实现者认为它太复杂而难以实现。

让 Prolog 处理器在本地处理每个错误所需的额外工作量相当大,并且比 Common Lisp 或其他编程语言要大得多。这是由于 Prolog 中统一的本质。错误的本地处理需要撤消内置函数执行期间执行的统一:因此,实现者有两种实现此目的的可能性:

  • 在调用内置谓词时创建一个“选择点”,这会产生大量额外的开销,无论是创建此选择点还是“尾随”后续绑定
  • 手动检查每个内置谓词,并根据具体情况决定如何处理错误 - 虽然这在运行时开销方面是最有效的,但这也是成本最高且最容易出错的方法

利用内置程序中的 WAM 寄存器也会导致类似的复杂性。同样,人们可以在缓慢的系统或具有大量实现开销的系统之间进行选择。

异常处理程序/3

然而,许多系统在内部提供了更好的机制,但很少有系统向程序员提供一致的机制。 IF/Prolog 提供exception_handler/3其参数与catch/3但在本地处理错误或异常:



[user] ?- catch((arg(a,f(1),_); Z=ok), error(type_error(_,_),_), fail).

no

[user] ?- exception_handler((arg(a,f(1),_); Z=ok), error(type_error(_,_),_), fail).

Z       = ok

yes
  

setup_call_cleanup/3

很多系统都提供了这个内置功能。它非常类似于unwind-protect但由于 Prolog 的回溯机制,需要一些额外的复杂性。见其当前定义 http://www.complang.tuwien.ac.at/ulrich/iso-prolog/cleanup.


所有这些机制都需要由系统实现者提供,它们不能构建在ISO Prolog之上。

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

Prolog 是否有像 Common Lisp 一样的条件和重启系统? 的相关文章

  • 将列表 1 中的特定数字与列表 2 中的特定数字交换

    最近在温习一些Prolog 我有点喜欢随机提出问题来尝试解决 然后解决它们 但这是相当困难的 我不是一个会放弃我已经着手解决的问题的人 问题 我想创建一个谓词 它有 2 个预先确定的列表 2 个要交换的数字 然后在交换完成后输出列表 进一步
  • SWI-Prolog 中的可逆谓词和字符串

    append 3是一个非常强大的谓词 假设我想要一个以相同方式工作但针对 SWI Prolog 字符串的谓词 我看到的最简单的方法是将这些字符串转换为列表string codes 2 然后应用append 3 然后使用string code
  • 在序言中返回列表

    我想问一个关于返回列表的问题 事实 团队 团队名称 总监 国籍 总体目标 team milan allegri italy 8 5 team inter benitez italy 7 6 team barcelona guardiola
  • 如何在SWI-Prolog中启用所有统一中的发生检查?

    根据维基百科 https en wikipedia org wiki Occurs check 为所有统一提供声音统一的实现是 Qu Prolog 和 Strawberry Prolog 以及 可选地 通过运行时标志 XSB SWI Pro
  • Smullyan 数值机的解决方案

    在这里我建议找到 Smullyan 数值机的解决方案 此处定义 http heras gilsanz com manuel smullyan machines html 问题陈述 它们是接受数字列表作为输入 并根据输入模式遵循一些规则将其转
  • Prolog 中的分配性检查

    假设我有一个等价关系eq 以及多个二元运算符o 1 o 2 o n 我想找出哪些操作分配给其他操作 假设我有一个可以确定两个表达式是否等价的知识库 一个简单的解决方案是输入所有可能的查询 对于左分配性 eq o 1 Z o 1 X Y o
  • Prolog - 递归列表构建

    对于我正在编写的程序 我需要创建一个列表列表 其中包含代表乘积的数字对和两个给定数字的总和 现在我有一个函数 我可以指定将列表添加到列表中的次数 稍后将使用完整功能进行扩展 这是我所拥有的 s1 0 X s1 Q X N is Q 1 mu
  • Prolog 程序从列表中删除每个第 n 个元素

    您能帮我解决以下问题吗 编写三元谓词delete nth从列表中删除每个第 n 个元素 样本运行 delete nth a b c d e f 2 L L a c e false delete nth a b c d e f 1 L L f
  • 展平列表

    尝试解决练习 07http www ic unicamp br meidanis courses mc336 2009s2 prolog problemas http www ic unicamp br meidanis courses m
  • 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
  • 针对数字板难题的优化 CLP(FD) 求解器

    考虑问题从https puzzling stackexchange com questions 20238 explore the square with 100 hops https puzzling stackexchange com
  • 如何实现 not_all_equal/1 谓词

    如何实施not all equal 1谓词 如果给定列表包含至少 2 个不同的元素 则该谓词成功 否则失败 这是我的尝试 不是很纯粹的尝试 not all equal L member H1 L member H2 L H1 H2 gt t
  • 如何从序言中的列表中删除列表?

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

    我对序言相当陌生 正在尝试摆弄列表列表 我很好奇如何添加两个列表列表或减去它们从而得到一个列表列表 如果我有两个列表 可以说 SomeList 1 2 3 4 5 6 7 8 SomeList2 1 2 3 4 5 6 7 8 我该如何添加
  • Prolog 中的迷你数独求解器中途停止

    我正在学习 七周七种语言 我只是想从书中找到一个例子 它解决迷你数独网格 4x4 作者使用的是 gprolog 但我使用的是 swi prolog 无论出于何种原因 我都无法让 gprolog 在我的虚拟机上工作 但 swi prolog
  • 求解序言中极其简单的方程:A = B + C?

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

    节目说明 该计划的目的 我的程序旨在计算 20X15 大小的平面中形状的位置 我有一个形状列表 其中包含形状类型 其 ID 半径或高度以及其在平面上的预期 X Y 位置 我有一个不同的二元运算列表 仅包含形状类型 其 id 及其与另一个形状
  • 转换句子会产生无限循环 - 但如何转换呢?

    我不明白这是哪里出了问题 请注意 我对 Prolog 很陌生 我确信我错过了一些东西 只是不知道那可能是什么 有人可以帮我吗 谢谢 这是我的代码 printSentence printSentence W write W write nl
  • Prolog 罗马数字(属性语法)

    我正在做一项作业prolog questions tagged prolog扫描数字列表并应返回该列表是否是有效的罗马数字以及数字的十进制值 前任 1 roman N I N 1 true 2 当我运行我认为应该工作的程序时 十进制值总是正
  • 适合从记录中提取 OneToMany 关系的约束编程

    也许有人可以帮助我解决 Prolog 或任何约束编程语言的问题 想象一个项目表 学生与母亲一起做某事的学校项目 每个项目都有一名或多名儿童参与 对于每个孩子 我们存储其姓名及其母亲的姓名 但对于每个项目 只有一个包含所有母亲的单元和一个包含

随机推荐