Prolog:故障片中的冗余程序点?

Prolog: redundant program points in failure-slice?

我们正在实施诊断工具,以解释纯单调 Prolog 程序中意外的通用非终止——基于 的概念。

如介绍 论文“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 是硬编码的。