coq - 具有复杂类型的复杂函数的相等性
问题描述
我想证明以下引理。
Require Import CoLoR.Util.Vector.VecUtil.
Require Import Coq.Vectors.Vector.
From mathcomp Require Import ssreflect.
Lemma Vcast_func' (A:Type):
forall (n m l:nat)(v:t A (n+0))(eq:n+0=m+0)
(func1:t A (n+0) -> t A l)(func2:t A (m+0) -> t A l)
(foo: forall {n l:nat}, (t A (n+0) -> t A l) -> t A (n+0) -> t A (n+0)),
Equiv func1 func2 eq -> Vcast (foo func1 v) eq = foo func2 (Vcast v eq).
Proof.
move=> n m l v eq.
Abort.
我想根据Equality on complex functions使用解决方案。
但是,我不能这样做,case: m / eq
因为m
不能按原样推断m+0
。另外,我不能重写n+0=m+0
,n=m
因为n+0=m+0
在假设中使用。
有什么解决办法吗?
解决方案
这是一个解决方案:
Require Import CoLoR.Util.Vector.VecUtil.
Require Import Coq.Vectors.Vector.
From mathcomp Require Import ssreflect.
Require Import Coq.Logic.FunctionalExtensionality.
Require Import Coq.Logic.Eqdep_dec.
Definition Equiv {A n m l}(I:t A n -> t A l)(J:t A m -> t A l)(eq:n=m):Prop:=
forall (a : t A n), I a = J (Vcast a eq) .
Lemma Vcast_func (A:Type):
forall (n m l:nat)(v:t A (n+0))(eq:n+0=m+0)
(func1:t A (n+0) -> t A l)(func2:t A (m+0) -> t A l)
(foo: forall {n l:nat}, (t A (n+0) -> t A l) -> t A (n+0) -> t A (n+0)),
Equiv func1 func2 eq -> Vcast (foo func1 v) eq = foo func2 (Vcast v eq).
Proof.
move=> n m l v e.
have e' : n = m by rewrite -{1}(plus_n_O n) -{1}(plus_n_O m) in e.
rewrite -{}e' in e * => func1 func2 foo.
rewrite (UIP_refl_nat _ e) /= => {}e.
suff -> : func1 = func2 by [].
apply: functional_extensionality=> {}v.
exact: e.
Qed.
更详细地说:
既然
n + 0 = m + 0
,我们知道n = m
。这就是have
策略正在做的事情。因此,我们可以到处替换
m
。n
最后,由于引理,我们认为
e : n + 0 = n + 0
必须等于。eq_refl
UIP_refl_nat
推荐阅读
- xml - 如何遍历保存的 xml 文件来解析地址?
- python - 将 PubMed 的作者和隶属关系与 Python 匹配
- spring-cloud-config - 在 Spring Cloud 配置服务器中使用不记名令牌设置 bitbucket 访问
- vue.js - 来自 chokidar (D:\) 的错误:错误:EBUSY:资源繁忙或锁定,lstat 'D:\pagefile.sys'
- text - 在AutoCAD文本字段中使用上升/运行获取主题标签作为输出
- c# - 我们如何使用 Mailkit 在 ASP.NET Core 网站中存储用户的 GMail OAuth 访问令牌?
- c++ - 如何在 Visual Studio 2017 中打开 Visual Studio 2019 c++ 代码而不会出现错误?
- css - 如何使 div 过渡不那么刺耳?
- jenkins - Jenkins 无法部署到 nexus
- javascript - 在 chartjs 中包含 chartjszoom 后将无法缩放