2

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

正如论文“本地化和解释带有故障片的非终止逻辑程序的原因”中所介绍的那样,在许多程序点添加目标false/0以减少解释候选的程序片段大小(同时仍然保留非终止)。

到目前为止,一切都很好......所以我的问题1来了:

为什么有 N 个目标的子句中有 N+1 个程序点?

或者,更准确地说:

为什么N分不够?我们是否需要第 (N+1) 个程序点?

难道我们不能把它转移false到关注谓词的每次使用上吗?

此外,我们知道程序片段仅用于查询,例如?- G, false.

脚注 1:我们假设每个事实foo(bar,baz).都被视为规则。foo(bar,baz) :- true.

4

1 回答 1

1

为什么有 N 个目标的子句中有 N+1 个程序点?为什么N分不够?

在许多示例中,并非所有的点实际上都是有用的。带有单个子句的谓词中的头部之后的点就是这样一个例子。但是程序点在这里可以在任何程序中使用。

让我们尝试一些例子。

N = 0

事实是一个目标为零的条款。现在,即使是一个事实也可能会或可能不会导致不终止。如:

?- p.

p :-
  q(1).
  p.

q(1).
q(2).

对于 的每个事实,我们确实需要一个程序点q/1,即使它根本没有目标,因为最小故障片是:

?- p,的。

:-
   q(1),
   p,的。

q(1)。
q(2) :-的。

N = 1

:-
   q,
   页。
:-
   页。

问:-
   s。

s。
年代:-
   s。

所以这里的问题是:我们需要两个程序点q/0吗?是的,有不同的独立故障片。有时false在开头,有时在结尾。

有点令人困惑的,第一个程序点(即查询中的那个)总是true,最后一个总是false。所以可以删除它们,但我认为留下它们更清楚,因为false最后是你必须进入 Prolog 的内容。请参阅附录中的示例。在那里,P0 = 1, P8 = 0是硬编码的。

于 2016-02-15T14:46:52.343 回答