【问题标题】:Prolog: redundant program points in failure-slice?Prolog:故障片中的冗余程序点?
【发布时间】:2016-05-25 13:08:23
【问题描述】:

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

正如在 论文“Localizing and explaining reasons for nonterminating logic programs with failure slices”,目标false/0被添加到多个程序点,以减少解释候选的程序片段大小(同时仍然保持不终止)。

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

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

或者,更准确地说:

为什么N点不够?我们曾经需要第 (N+1) 个程序点吗?

难道我们不能将 false 移到关注谓词的每次使用中吗?

另外,我们知道程序片段只用于?- G<b>, false</b>.之类的查询

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

【问题讨论】:

  • 对不起,打扰了,但我的怀疑可能与您有关...我没有得到第一篇论文的表示法'示例(示例 1):P0,...P5 被介绍,所以所描绘的切片 {0,2,4} 应该是 - 天真的 - {5,1,3}。这种不匹配使我难以理解文档的其余部分。每个“程序点”索引是否应该偏移 1(但是,P0 会发生什么)?这能解释你的困惑吗?
  • @CapelliC。不,我明白了(我认为)。考虑第 9 页上的伪代码:slicep(...,FVect) ← arg(n1,FVect,1), sliceq(...,FVect), arg(n2,FVect,1), ..., arg(ni,FVect,1), slicer(...,FVect), arg(ni+1,FVect,1). 因此,IMO 认为“基于 0 与基于 1 的问题”仅是由于使用了 arg/3 以确保我们不会超过插入的 false 目标。所以我会说基于 0/1 的索引的原因是使用 arg/3,你不同意吗?
  • 我无法判断...正如我所说,最初的误解使我的阅读变得非常脆弱(希望这有意义,用英语)
  • @CapelliC:{5,1,3} 强调的是应该为假的点,但实际上,应该是真的点被提及。
  • @repeat:额外挑战:如何处理高阶谓词。我没有这样做,但我真的很想拥有它。

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


【解决方案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 是硬编码的。

【讨论】:

  • 很高兴知道!实际上,对于查询末尾的false,我的想法也是一样的......
  • @repeat:请注意,0 不会立即转换为带有arg/3 的索引...
猜你喜欢
  • 2013-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 2014-01-03
  • 1970-01-01
相关资源
最近更新 更多