洛杉矶
Dennis/Electronic Notes in Theoretical Computer Science 174
(
2007
)
切片(即,在任何程序的证明中使用的程序的那些部分),以及保持的指示证明的
多少真分支和假分支使用了该规则的“分数”(通常作为简化过程的一部分)。这些
分数然后可以由界面使用以向用户返回附加信息为了简单起见,我们将继续把这些
规则轨迹称为程序切片,即使在定理证明的上下文中,没有理由不把它们作为与任
何程序无关的定义、引理和定理的
让我们考虑一个用ML编写的简单插入排序程序。
funinsert x [] =[x]
|
插入
x
(
h
::
t
)
=
如果
x
≤
h
,则
x
::
h
::
t
elseh
::
insert t;
funsort [] =[]
| sort(x::xs)= insert x(sort xs);
定义的每种情况都成为四个等式规则之一:
(i)
插入
x [] =[x]
(ii)
insert x
(
h
::
t
)
= if x
≤
h then x
::
h
::
telse h
::
insert x t
(iii)
sort [] =[]
(iv)
sort(x::xs)= insert x(sort xs)
我们建议,一个证明导向的调试界面应该允许用户在验证尝试期间将这些定义中
的一个选择指定为
“
可疑
”
。显然,用户可以选择将其开发中涉及的所有定义命名为
可疑定义,包括与规范相关的定义,甚至是来自定理证明器的理论数据库的预先存
在的定义,一旦实现了这样的接口,这显然是一些实验研究的主题。
我们假设一个定理证明系统生成一系列的
证明状态
,其中,至少,包含列表中的
当前开放的目标在证明尝试。其中心思想是将程序切片与这些证明状态中的目标相
关联。证明状态中的每个目标
g
与一组可疑规则(
切片
)
S
(
g
)相关联,这些可疑
规则已在该目标的推导中使用此外,该系统
也在每个证明状态s中存储一组三元组,将每个可疑规则r与两个整数相关联,其中
第一个整数是好整数good(r
,
s),每当证明分支关闭时(因为它已被成功证
明),第二个整数是坏整数
bad
(
r
,
s
),每当目标得出假结论时(如果随后在假
设中发现矛盾,则可以修改)。在很明显的地方,状态参数将从这些函数中删除。
这两个分数可以用来形成规则正确的概率估计。
对于所有规则
r
,初始
好
(
r
)和
坏
(
r
)被设置为零,并且初始目标
g
i
与空程序
切片
S
(
g
i
)
= []
相关联。随着证明的进展,系统更新信息如下:
考虑两个证明状态,
s
n
后跟
s
n
+1
。
s
n
+1
由
s
n
通过
a