「SF-LC」16 Auto
auto
- proof searchLtac
- automated forward reasoning (hypothesis matching machinery)eauto
,eapply
- deferred instantiation of existentials
Ltac
macro
1 | Ltac inv H := inversion H; subst; clear H. |
The auto
Tactic
auto
can free us by searching for a sequence of applications that will prove the goal:
1 | intros P Q R H1 H2 H3. |
auto
solves goals that are solvable by any combination of
intros
apply
(of hypotheses from the local context, by default)
使用 auto 一定是“安全”的,它不会失败,也不会改变当前证明的状态: auto 要么完全解决它,要么什么也不做。
Proof search could, in principle, take an arbitrarily long time,
so there are limits to how far auto will search by default. (i.e.5
)
1 | Example auto_example_3 : ∀(P Q R S T U: Prop), |
Hint Database 提示数据库
auto
auto considers a hint database of other lemmas and constructors.
common lemmas about equality and logical operators are installed by default.just for the purposes of one application of
auto
我们可以为某次auto
的调用扩展提示数据库,auto using ...
1 | Example auto_example_6 : ∀n m p : nat, |
Global Hint Database 添加到全局提示数据库
1 | Hint Resolve T. |
Proof with auto.
Under Proof with t
, t1...
== t1; t
.
Searching For Hypotheses
对于很常见的一种矛盾情形:
1 | H1: beval st b = false |
contradiction
并不能解决,必须 rewrite H1 in H2; inversion H2
.
- 宏:
1 | Ltac rwinv H1 H2 := rewrite H1 in H2; inv H2. |
match goal
调用宏
1 | Ltac find_rwinv := |
可以看到最后只剩这种改写形式…我们也把他们自动化了:
1 | Ltac find_eqn := |
配合上 repeat
…我们可以 keep doing useful rewrites until only trivial ones are left.
最终效果:
1 | Theorem ceval_deterministic''''': ∀c st st1 st2, |
即使我们给 IMP 加上一个 CRepeat
(其实就是 DO c WHILE b
),
会发现颠倒一下自动化的顺序就能 work 了
1 | induction E1; intros st2 E2; inv E2; |
当然,这种「超级自动化」(hyper-automation) 并不总是现实,也不好调试…
The eapply
and eauto
variants
推迟量词的实例化
比如对于
1 | Example ceval_example1: |
没有 with
就会 Error: Unable to find an instance for the variable st'
但其实 st'
的取值在后面的步骤是很明显(很好 infer/unify)的,所以 eapply
works.