我们正在实施诊断工具,用于解释纯粹的单调Prolog程序中的意外通用非终止 - 基于failure-slice的概念。
如引言
文章“Localizing and explaining reasons for nonterminating logic programs with failure slices”,目标\b(?:MUST|NOT|SHOULD)\b # Match one of the keywords
(?: # Start of non-capturing group:
(?!\b(?:MUST|NOT|SHOULD)\b) # Unless we're at the start of another keyword:
. # Match any character
)* # Repeat as often as possible
被添加到多个程序点,以减少解释候选者的程序片段大小(同时仍然保留非终止)。
到目前为止,这么好......所以我的问题是 1 :
为什么在一个有N个目标的子句中有N + 1个程序点?
或者更准确地说:
为什么N分不够?我们曾经需要第(N + 1)个程序点吗?
我们不能将
false/0
移动到每次使用关注谓词吗?此外,我们知道程序片段仅用于
等查询false
脚注1:我们假设每个事实?- G, false.
都被视为规则foo(bar,baz).
。
答案 0 :(得分:1)
为什么有N个目标的子句中有N + 1个程序点?为什么那些N分还不够?
在许多示例中,并非所有点实际上都有用。带有单个子句的谓词中头部之后的点就是这样一个例子。但程序点可以在任何程序中使用。
让我们尝试一些例子。
事实是一个没有目标的条款。现在甚至一个事实可能会或可能不会导致非终止。如:
?- p.
p :-
q(1).
p.
q(1).
q(2).
我们确实需要一个q/1
每个事实的程序点,即使它根本没有目标,因为最小的失败切片是:
?- p, false. p :- q(1), p, false. q(1).q(2) :- false.
p :- q, p. p :- p. q :- s. s. s :- s.
所以这里的问题是:q/0
我们需要两个程序点吗?是的,有不同的独立故障片。有时在开头有false
,有时在最后。
有点令人困惑的是,第一个程序点(即查询中的一个)总是true
,而最后一个始终是false
。所以可以删除它们,但我认为离开它们更清楚,因为最后false
是你必须进入Prolog的。请参阅附录中的示例。在那里,P0 = 1, P8 = 0
是硬编码的。