问题标签 [failure-slice]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
performance - 检测 Prolog 目标中一些不会普遍终止的循环
TL;DR:这个问题是关于评估候选故障片的一个特定方面。
以下代码ancestor_of/2
表示 的传递闭包child_of/2
:
如果我们定义child_of/2
并包含几个循环......
...ancestor_of(X, Y)
不会普遍终止:
使用 SWI-Prolog,我们可以限制在执行查询中投入的工作量:
好吧,但 它可能会更好!
- 首先,我们或许能够明确地证明目标循环。
- 其次,我们也许可以用更少的努力做到这一点。
让我们添加一个额外的参数来ancestor_of/2
传输调用堆栈信息!
示例查询:
是这个吗?!那太容易了。这是否涵盖一般情况?
我觉得我错过了一些重要的东西,但我不能完全指出它。请帮忙!
prolog - Prolog:故障片中的冗余程序点?
我们正在实施诊断工具,用于解释纯单调 Prolog 程序中意外的普遍不终止——基于故障切片的概念。
正如论文“本地化和解释带有故障片的非终止逻辑程序的原因”中所介绍的那样,在许多程序点添加目标false/0
以减少解释候选的程序片段大小(同时仍然保留非终止)。
到目前为止,一切都很好......所以我的问题1来了:
为什么有 N 个目标的子句中有 N+1 个程序点?
或者,更准确地说:
为什么N分不够?我们是否需要第 (N+1) 个程序点?
难道我们不能把它转移
false
到关注谓词的每次使用上吗?此外,我们知道程序片段仅用于查询,例如
?- G, false.
脚注 1:我们假设每个事实foo(bar,baz).
都被视为规则。foo(bar,baz) :- true.
prolog - Prolog - 祖谓词实现的 2 种方法
给定一组通过谓词parent/2表示父子关系的事实,用谓词pred1/2和pred2/2定义关系“祖先”(祖先)时有什么区别,如下所示?
prolog - 计算思维中的猴子和香蕉
我正在阅读Thinking as Computation一书,并将代码编写为第 9.4 章:
但我发现程序永远不会停止......打印堆栈信息后,我发现goal_state
生成了无限长的列表。我试图限制列表的长度has_banana
它N
指的是L
in的长度plan(L)
(例如N
query 时为 4 plan([M1, M2, M3, M4])
)但它不起作用。
有什么解决办法吗?
prolog - 查找图中节点之间的路径及其长度
我正在尝试解决这个问题,并且我已经阅读了这个答案,但我的问题是无限循环,即使我使用了访问过的节点列表。
让我们看看我的两次尝试:
这给了我类似的答案,即:
然后 Swi-Prolog IDE 冻结。
- 我应该将什么定义为基本情况?
如果是这种情况,为什么第二个实现会循环,即使我使用访问的节点列表和 dif() 来确保避免统一来回走动?我打错了函数名。
我想摆脱 length/2 的使用。谢谢。
编辑:
所以,我发现这应该是更干净的方法,即使我想要更类似于第二种实现的东西,这在最短路径问题求解器中更容易转换,因为它只是一个 min{ pathLengths }从第一次调用 path3/4 开始。
这是第二个实现路径2的更正版本:
prolog - Prolog 子句单独终止,但不一起终止
所以
工作和终止和
也可以工作并终止。但不知何故
不终止。可能的原因是什么?
prolog - 寻找多个答案时如何避免Out of global stack ERROR?
使用 SWI-Prolog 加载以下程序并输入查询后,例如
或者
第一个结果似乎总是正确的,但是在提交分号以查找更多结果后(我不知道在这两种情况下是否应该有其他结果),我收到一个 PROLOG SYSTEM ERROR 提到垃圾收集和一个 Out of global分别堆栈错误。
我假设错误与我处理递归的方式有关,所以也许有人可以查看代码并告诉我哪里出错了。
debugging - 调试命令行程序
如果我有一个用作命令行工具的程序,我有哪些调试选项?
为了这个例子,假设程序看起来像这样。
清单do_stuff.pl
:
使用 SWI-Prolog,我可以编译它:
我可以通过简单地调用来运行它
就目前而言,如果do_stuff/1
失败,它将以 1 退出。我怎样才能看到失败的第一个(最早、最深的)目标?或者更好的是,整个回溯?我假设我应该能够使用debug
and leash
,例如:
...但我没有尝试过任何有效的方法。
我唯一半途而废的想法是为每个我希望确定性成功但没有成功的谓词抛出一个错误。这当然是可行的,但似乎有点过分?
动机
用作命令行工具的程序(通常)意味着运行一次,获取其参数,读取其输入,写入输出。在这种情况下,失败意味着什么?我的解释是,意外失败是程序中的错误。
单元测试可能会有所帮助(单独测试谓词);但是,根据定义,这对于由于程序员对问题、范围或工具缺乏了解而导致的错误没有帮助。只有使用实际输入运行程序才能捕获此类错误。
所以,给定上面的例子,如果某个用例导致do_stuff/1
失败,并且程序以非零代码退出,程序员有什么选择来确定哪个谓词失败?
评论中链接的答案提供了一种解决方案。但是(如果我理解正确的话)这确实需要程序员系统地检查执行流程,直到找到有问题的谓词调用。
这正是我希望避免的。
prolog - Prolog CLPFD 中的整数列表和无限循环
假设我想像这样表示整数:integer:Sign:[FirstDigit,SecondDigit,...]
. 例如,42 将表示为integer:positive:[4,2]
。
我需要一个基于此表示生成整数值的谓词,反之亦然。
这是我想出的:
这按预期工作。但是,它具有接受诸如 之类的东西的不幸属性integer:positive:[0,1]
,即在列表开头的前导零。当我使用 : 枚举所有可能的整数时,这尤其成问题integer_value_(I,J), label([J]).
:带有前导零的整数也会出现。
然后我尝试通过integer_value_
仅使用除第一个数字以外的所有数字并使用integer_value
第一个数字来纠正此问题(请记住,我们需要使用仅包含 0 的列表来表示 0):
但是现在它的行为不正常。例如,integer_value(I,-19).
返回I = integer:negative:[1, 9]
,但如果我们要求另一个答案,Prolog 会因为我不明白的原因进入无限循环(它应该说错误,或者已经知道没有其他答案)。
这个问题不会发生在integer_value(integer:negative:[1,9],Z).
返回Z = 19
然后为假的“相反”查询中,当两个参数都是变量时也不会发生(它正确枚举数字,没有前导零),这让我感到惊讶。
知道无限循环发生了什么,是否有一种简单的方法可以解决它?
prolog - prolog中只有两个元素的排序列表
首先看下面的例子:
false 好的,因为第二个参数必须是双元素排序列表。(在我的程序中,我假设a<b
)
是的,这是正确的结果。
然而,对于
是的,这是预期的结果。
然而,万一
这里是循环......
有没有办法处理这种循环?我想了很久,但没有成功。你能帮我吗?