有效使用Coq提示数据库的最佳实践

时间:2013-01-09 22:38:13

标签: coq

“你问的问题似乎是主观的,可能会被关闭。”

嗯,我知道,但在这里仍然值得一提。


我多次被告知我应该使用提示数据库和自动,因为它是有史以来最好的东西。然而,有几次我试图使用它,我已经完全被琐碎的细节所困扰。这是一件不断发生的事情。

Section Annoying.

Variable T : Type.
Variable P : T -> Prop.

Axiom notP : forall x, ~ P x.
Hint Resolve notP.

Goal forall (x : T), P x -> False.
intros x.
auto. (* nothing... *)
replace (P x -> False) with (~ P x) by reflexivity.
(* fold not. does not work, don't know why either but that is not the point here... *)
auto.
Qed.

End Annoying.

因此,我的问题是:人们如何使用提示数据库而不会遇到这样的麻烦。对于有效的提示数据库,是否有商品规则?

1 个答案:

答案 0 :(得分:3)

通过将未修改的定理应用于目标来实现自动化。它通过对其形状的句法观察来寻找适用的定理。所以你定理notP只适用于表格

的目标

~P ...

形式P x的目标 - > False在语法上不是这种形式。实际上,自动策略的工作方式如下:首先尽可能使用介绍,然后尝试应用定理。所以你的目标转变为

H : P x
=========
 False

然后它试图应用可以证明为假的定理。不幸的是,它只尝试应用没有猜测所需实例化的定理(可以与策略一起使用的定理并且不需要“with”扩展)。所以一个带有形式陈述的定理 “forall a,P a - > False”永远不会被auto使用,因为apply会抱怨它确实知道如何实例化。

所以,好的候选自动证明就是你可以做的证明,你只需要使用介绍和应用,没有展开或应用的实例......并且没有手动将定理应用于参数,并且在每一步,该定理最右边的公式(在箭头的末尾)使用谓词作为目标结论中出现的谓词。

你烦人的例子是有效的,因为主要公式在某个时刻的目标是“~P x”,所以主要符号不是,并且auto在其主要符号的表格中有引理notP。

这是一个效果很好的例子:

Variable my_le : nat -> nat -> Prop.

Hypotheses my_le_n : forall x, my_le x x.

Hypothesis my_le_S : forall x y, my_le x y -> my_le x (S y).

Hint Resolve my_le_n my_le_S.

Lemma toto : my_le 10 14.
Proof.
auto.
Qed.

在提示命令之后,auto在其表中有两个词条“my_le_n”和“my_le_S”,当目标主符号为my_le时使用。当看到“my_le 10 14”时,它依次尝试这两个引理。第一个失败,但第二个失败,并产生一个新的目标“my_le 10 13”,这可以重复几次,直到自动设法应用“my_le_n”。因此,汽车探索了一种可能性的树,其中分支来自于可能存在适用于给定目标的若干定理的事实。此外,分支的长度限制为5,因此my_le 10 15将不会被auto解决。您可以通过为auto提供数字参数来更改分支的长度。所以“auto 20”将解决“my_le 10 15”和其他类似情况。