广义重写构造函数下的等效术语?

如何解决广义重写构造函数下的等效术语?

我有一个归纳类型 Env,它是一个带有多个 cons 构造函数的 snoclist

Inductive Env : Set :=
 | Env_Empty : Env
 | Env_ConsA (env : Env) (a : A)
 | Env_ConsB (env : Env) (b : B)
 ...

AB 类型无关紧要,所以我没有给出它们。我在这些环境中定义了一个等价关系 EqEnv,并使用 generalized rewriting 的文档将其声明为自反、对称和传递(等价)关系:

Inductive EnvEq : Env -> Env -> Prop := ...
Notation "A =~ B" := (EnvEq A B) (at level 70) : type_scope.

Add Relation Env EnvEq
  reflexivity  proved by eq_env_refl
  symmetry     proved by eq_env_sym
  transitivity proved by eq_env_trans
    as eq_env_rel.

注意符号 =~。现在,这允许在给定 x =~ y 的情况下将一些 x 重写为 y,但前提是它们没有出现在构造函数/函数应用程序/(binder?)下。我自己想出了环境串联 +++ 的情况:

Fixpoint env_concat (env1 : Env) (env2 : Env) : Env := ...
Notation "A +++ B" := (env_concat A B) (at level 60).

Theorem env_concat_compat :
    forall x x' : Env,EnvEq x x' ->
    forall y y' : Env,EnvEq y y' ->
           EnvEq (x +++ y) (x' +++ y').

Add Morphism env_concat
  with signature EnvEq ==> EnvEq ==> EnvEq as eq_env_conc.
Proof.
  exact env_concat_compat.
Qed.

(必须说我不完全理解签名中的 ==>。我知道它结合了 ++>--> 但我对它们的作用感到困惑).

现在,我被困在不返回 Env 而是在 Env 上参数化的操作,即构造函数。文档中有一节“在活页夹下重写”,在这种情况下,构造函数是活页夹吗?当我听到 binder 时,我会想到 lambda 抽象,但我认为在这里它们是指构造函数,或者至少构造函数是一种类型的 binder。

Inductive WfEnv : Env -> Prop := ...

我希望,根据一些假设 H : x =~ y,能够通过调用 WfEnv x 或(如果需要)WfEnv yrewrite H 重写为 rewrite_setoid H。我可以给出一个引理 x =~ y -> WfEnv x <-> WfEnv y,但我正在寻找重写支持

对于下一步,我希望重写不仅通过 Env 参数化而且还通过其他类型参数化的构造函数。这些类型可以通过正常(莱布尼茨)相等来要求相等。

Inductive Foo : Env -> A -> Prop := ...

这里我希望,给定一些 hypothesis H1 : x =~ yH2 : a = b,将 Foo x a 重写为 Foo y b。同样,我可以写一个引理 x =~y -> a = b -> Foo x a <-> Foo y b,但我正在寻找重写支持

解决方法

您可以将 WfEnv 声明为关系 EnvEq 的态射,如下所示:

Add Parametric Morphism : WfEnv
    with signature EnvEq ==> iff as yourmorphism1.
Proof.
  (* apply here your lemma [x =~ y -> WfEnv x <-> WfEnv y] *)
Qed.

此声明允许重写 Env 下的等效 WfEnv。带有额外参数的同上:

Add Parametric Morphism : Foo
    with signature EnvEq ==> (@eq A) ==> iff as yourmorphism2.
Proof.
  (* x =~y -> a = b -> Foo x a <-> Foo y b *)
Qed.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?