Prolog:故障片中的冗余程序点?
Prolog: redundant program points in failure-slice?
我们正在实施诊断工具,以解释纯单调 Prolog 程序中意外的通用非终止——基于 failure-slice 的概念。
如介绍
论文“Localizing and explaining reasons for nonterminating logic programs with failure slices”,目标false/0
被添加到多个程序点,以减少解释候选的程序片段大小(同时仍然保留非终止)。
到目前为止,一切顺利...那么我的问题来了1:
Why are there N+1 program points in a clause having N goals?
或者,更准确地说:
How come that N points do not suffice? Do we ever need the (N+1)-th program point?
Couldn't we move that false
to each use of the predicate of concern instead?
Also, we know that the program fragment is only used for queries like ?- G<b>, false</b>.
脚注 1: 我们假设每个事实 foo(bar,baz).
都被视为规则 foo(bar,baz)<b> :- 真</b>.
.
Why are there N+1 program points in a clause having N goals? How come that N points do not suffice?
在很多例子中,并不是所有的点都是有用的。带有单个子句的谓词中头部之后的点就是这样的例子。但是程序点在这里是可以在任何程序中使用的。
让我们尝试一些示例。
N = 0
事实是一个目标为零的子句。现在,即使是一个事实也可能会或可能不会导致不终止。如:
?- p.
p :-
q(1).
p.
q(1).
q(2).
对于 q/1
的每个事实,我们确实需要一个程序点,即使它根本没有目标,因为最小故障片是:
?- p, false.
p :-
q(1),
p, false.
q(1).
q(2) :- false.
N = 1
p :-
q,
p.
p :-
p.
q :-
s.
s.
s :-
s.
所以这里的问题是:我们需要q/0
中的两个程序点吗?是的,有不同的独立故障片。有时在开头 false
,有时在结尾。
有点令人困惑的是第一个程序点(即查询中的那个)总是true
,最后一个总是false
。所以可以删除它们,但我认为保留它们更清楚,因为最后的 false
无论如何都是你必须输入 Prolog 的内容。请参阅附录中的示例。在那里,P0 = 1, P8 = 0
是硬编码的。
我们正在实施诊断工具,以解释纯单调 Prolog 程序中意外的通用非终止——基于 failure-slice 的概念。
如介绍
论文“Localizing and explaining reasons for nonterminating logic programs with failure slices”,目标false/0
被添加到多个程序点,以减少解释候选的程序片段大小(同时仍然保留非终止)。
到目前为止,一切顺利...那么我的问题来了1:
Why are there N+1 program points in a clause having N goals?
或者,更准确地说:
How come that N points do not suffice? Do we ever need the (N+1)-th program point?
Couldn't we move that
false
to each use of the predicate of concern instead?Also, we know that the program fragment is only used for queries like
?- G<b>, false</b>.
脚注 1: 我们假设每个事实 foo(bar,baz).
都被视为规则 foo(bar,baz)<b> :- 真</b>.
.
Why are there N+1 program points in a clause having N goals? How come that N points do not suffice?
在很多例子中,并不是所有的点都是有用的。带有单个子句的谓词中头部之后的点就是这样的例子。但是程序点在这里是可以在任何程序中使用的。
让我们尝试一些示例。
N = 0
事实是一个目标为零的子句。现在,即使是一个事实也可能会或可能不会导致不终止。如:
?- p.
p :-
q(1).
p.
q(1).
q(2).
对于 q/1
的每个事实,我们确实需要一个程序点,即使它根本没有目标,因为最小故障片是:
?- p, false. p :- q(1), p, false. q(1).q(2) :- false.
N = 1
p :- q, p. p :- p. q :- s. s. s :- s.
所以这里的问题是:我们需要q/0
中的两个程序点吗?是的,有不同的独立故障片。有时在开头 false
,有时在结尾。
有点令人困惑的是第一个程序点(即查询中的那个)总是true
,最后一个总是false
。所以可以删除它们,但我认为保留它们更清楚,因为最后的 false
无论如何都是你必须输入 Prolog 的内容。请参阅附录中的示例。在那里,P0 = 1, P8 = 0
是硬编码的。