【发布时间】:2016-05-25 13:08:23
【问题描述】:
我们正在实施诊断工具,用于解释纯单调 Prolog 程序中的意外通用不终止 - 基于 failure-slice 的概念。
正如在
论文“Localizing and explaining reasons for nonterminating logic programs with failure slices”,目标false/0被添加到多个程序点,以减少解释候选的程序片段大小(同时仍然保持不终止)。
到目前为止,一切都很好......所以我的问题来了1:
为什么有 N 个目标的子句中有 N+1 个程序点?
或者,更准确地说:
为什么N点不够?我们曾经需要第 (N+1) 个程序点吗?
难道我们不能将
false移到关注谓词的每次使用中吗?另外,我们知道程序片段只用于
?- G<b>, false</b>.之类的查询
脚注 1: 我们假设每个事实 foo(bar,baz). 都被视为规则 foo(bar,baz)<b> :- true</b>.。
【问题讨论】:
-
对不起,打扰了,但我的怀疑可能与您有关...我没有得到第一篇论文的表示法'示例(示例 1):P0,...P5 被介绍,所以所描绘的切片 {0,2,4} 应该是 - 天真的 - {5,1,3}。这种不匹配使我难以理解文档的其余部分。每个“程序点”索引是否应该偏移 1(但是,P0 会发生什么)?这能解释你的困惑吗?
-
@CapelliC。不,我明白了(我认为)。考虑第 9 页上的伪代码:
slicep(...,FVect) ← arg(n1,FVect,1), sliceq(...,FVect), arg(n2,FVect,1), ..., arg(ni,FVect,1), slicer(...,FVect), arg(ni+1,FVect,1).因此,IMO 认为“基于 0 与基于 1 的问题”仅是由于使用了arg/3以确保我们不会超过插入的false目标。所以我会说基于 0/1 的索引的原因是使用arg/3,你不同意吗? -
我无法判断...正如我所说,最初的误解使我的阅读变得非常脆弱(希望这有意义,用英语)
-
@CapelliC:
{5,1,3}强调的是应该为假的点,但实际上,应该是真的点被提及。 -
@repeat:额外挑战:如何处理高阶谓词。我没有这样做,但我真的很想拥有它。
标签: failure-slice prolog failure-slice non-termination logical-purity