假设我在 Coq 中有以下定义:
Inductive Compare := Lt | Eq | Gt.
Fixpoint compare (x y : nat) : Compare :=
match x, y with
| 0, 0 => Eq
| 0, S _ => Lt
| S _, 0 => Gt
| S x', S y' => compare x' y'
end.
现在考虑这个引理:
Lemma foo : forall (x: nat),
(forall z, match compare x z with
| Lt => False
| Eq => False
| Gt => False
end) -> nat -> False.
Proof.
intros x H y.
此时证明状态如下所示:
x : nat
H : forall z : nat,
match compare x z with
| Lt => False
| Eq => False
| Gt => False
end
y : nat
============================
False
我想写 Ltacmatch goal
来检测:
a)有一个假设x : nat
被用作compare
量化假设内部某处的论据H
b) 还有一些其他类型的假设nat
——即y
——可以用来专门化量化假设。
c)一旦我们有这两件事H
专门y
我试着这样做:
match goal with
| [ X : nat, Y : nat
, H : forall (z : nat), context [ compare X z ] |- _ ] => specialize (H Y)
end.
但是这段代码至少有两点有问题:
context
在 a 下使用似乎forall
是不允许的。我想不出一个正确的方法来
X
作为参数传递给compare
它,因为它被认为是作为假设存在的东西。这样做是这样的: