Coq Ltac中一元数据构造函数的匹配
我正在做一些关于在Coq中形式化简单类型的lambda演算的练习,并希望使用Ltac自动化我的证明。在证明进步定理时:Coq Ltac中一元数据构造函数的匹配,coq,ltac,Coq,Ltac,我正在做一些关于在Coq中形式化简单类型的lambda演算的练习,并希望使用Ltac自动化我的证明。在证明进步定理时: Theorem progress : forall t T, empty |-- t \in T -> value t \/ exists t', t ==> t'. 我想出了这段Ltac代码: Ltac progress_when_stepping := (* right, because progress statement places stepp
Theorem progress : forall t T,
empty |-- t \in T -> value t \/ exists t', t ==> t'.
我想出了这段Ltac代码:
Ltac progress_when_stepping :=
(* right, because progress statement places stepping on the right of \/ *)
right;
(* use induction hypotheses *)
repeat
match goal with
| [ H : _ -> value _ \/ exists _, ?t1 ==> _ |- exists _, ?C ?t1 _ ==> _ ] =>
induction H; auto
| [ H : _ -> value _ \/ exists _, ?t2 ==> _, H0 : value ?t1 |-
exists _, ?C ?t1 ?t2 ==> _ ] =>
induction H; auto
| [ H : _ -> value _ \/ exists _, ?t1 ==> _ |- exists _, ?C ?t1 ==> _ ] =>
induction H; auto
end.
==>
表示单个评估步骤(通过小步语义)。每个比赛案例的目的是:
上下文标识[cpattern]
。
它匹配任何具有匹配cpattern的子项的术语。如果存在匹配项,可选标识将被指定为“匹配上下文”,即匹配子项替换为孔的初始项。
…
<> P>由于历史原因,“代码>上下文< /代码>用于考虑n个应用程序,如<代码>(F 1 2)< /C>作为一个整体,而不是一系列一元应用程序<代码>((f 1)2)< /C>。因此上下文[f?x]
将无法在(f 1 2)
中找到匹配的子项:如果模式是部分应用程序,则匹配的子项必然是具有完全相同数量参数的应用程序
所以,我想这是可行的(至少在我炮制的一个最小的人工例子上是可行的):
问题是
?C
与?C0?t0
形式的术语相匹配。您可以进行一些辅助匹配以排除这种情况
match goal with
…
| [ H : _ -> value _ \/ exists _, ?t1 ==> _ |- exists _, ?C ?t1 ==> _ ] =>
match C with
| ?C0 ?t0 => fail
| _ => induction H; auto
end
end.
这也将与构造器处于复杂环境中的目标相匹配,这意味着大量误报(例如,在否定条件下)。@Gilles你是对的。我想知道这是否适用于进度定理,也就是在这个特殊情况下。
match goal with
…
| [ H : _ -> value _ \/ exists _, ?t1 ==> _ |- exists _, ?C ?t1 ==> _ ] =>
match C with
| ?C0 ?t0 => fail
| _ => induction H; auto
end
end.