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

时间:2016-02-14 18:35:57

标签: prolog failure-slice non-termination logical-purity

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

如引言 文章“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).

1 个答案:

答案 0 :(得分:1)

  

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

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

让我们尝试一些例子。

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是硬编码的。