Coq SSR反射和setoid重写

Coq SSR反射和setoid重写,coq,ssreflect,Coq,Ssreflect,我不能用setoids重写Ssreflect。虽然我认为这些信息与解决问题无关,但我在coq中使用了范畴理论的这一表述: 据我所知,如果可以解决合适的RewriteRelationTypeclass实例,那么Ssreflect的重写可以使用用户定义的等价关系 Context { x y : obj[C]}. About RewriteRelation. (* ∀ A : Type, crelation A → Prop *) Instance equivrw : (@RewriteRelat

我不能用setoids重写Ssreflect。虽然我认为这些信息与解决问题无关,但我在coq中使用了范畴理论的这一表述:

据我所知,如果可以解决合适的
RewriteRelation
Typeclass实例,那么Ssreflect的重写可以使用用户定义的等价关系

Context { x y : obj[C]}.

About RewriteRelation.
(* ∀ A : Type, crelation A → Prop *)

Instance equivrw : (@RewriteRelation (x ~> y) (@equiv (x ~> y) (homset x y))) := {}. (* defined and correctly type-checked *)
About equivrw.
(* RewriteRelation equiv (coq omits implicit arguments) *)

Lemma test_rwrel (a b c : x ~> y) : (@equiv (x ~> y) (homset x y) a b) -> (@equiv (x ~> y) (homset x y)  b c) -> (@equiv (x ~> y) (homset x y) a c).
Proof.
    move => ->.
    (* Fails: not a rewritable relation: (a ≈ b) in rule __top_assumption_ *)
相反,使用默认的重写策略是可行的(即使没有手动声明实例,因为库中已经声明了类似的内容)

有趣的是:

Instance equivrw : (@RewriteRelation False equiv) := {}.
Lemma test_rwrel (a b c : False) : (equiv a b) -> (equiv b c) -> (equiv a c).
Proof.
    move => ->.
    by []. 
Qed.
这个很好用

为什么SSReflect不使用我手动声明要通过用户定义的等价性重写的RewriteRelation实例? 提前谢谢

编辑: 我已经弄明白为什么Ssreflect看不到我的关系。显然,您只能使用手册中记录的
add Parametric Relation
添加要与Ssreflect重写一起使用的关系,并且
RewriteRelation
实例不会更改任何内容。我尝试使用axioms创建一个伪关系,并使用
Add Parametric relation
添加它,而
重写
工作正常。但现在我又有麻烦了。我希望能够使用的关系具有类型
creation(x~>y)
(即
(x~>y)->(x~>y)->type
),但要使用
添加参数关系
我需要一个带有类型
关系(x~>y)
(即
(x~>y)->(x~>y)->属性的术语
。为什么有两种不同的关系(
关系
相关性
)是否已在标准库中定义? 如何将
关系
转换为
关系
,而不会出现不一致性错误?
我仍然不明白上面的例子为什么用
False
有效。

将一个关系声明为
重写关系是不够的,也没有必要。你必须证明重写在逻辑上是有效的,最常见的是传递性(但你通常也需要自反性,甚至对称性)

正如您已经注意到的,setoid重写插件实际上由两个孪生系统组成,一个用于
Prop
中的关系,另一个用于
Type
(其模块名称前缀为
C
)中的关系。您通常只使用一个或另一个系统,具体取决于您的关系类型

我不确定SSReflect是否会改变一些事情,但下面是一个没有它的setoid重写的示例:

  • 需要Setoid。
    激活插件
  • 要求导入等效性。
    如果使用
    类型
    关系,或
    要求导入等效性。
    如果使用
    属性
    关系
  • 实现等价关系属性的实例(所有3个的
    自反
    对称
    传递
    、或
    等价
  • 如果你正在重写的术语不在目标的顶层,你可能还必须证明
    引理是正确的
  • 请注意,在步骤3中,如果您没有/无法证明所有三个属性,则不允许您在所有方向上重写

    据我所知,文档中的
    Add Parametric Relation
    等命令只是为这些实例设计的样板文件。但在我看来,作为用户,它们添加了不必要的间接层;直接声明实例会让事情更容易理解(特别是如果您已经熟悉类型类)


    你能提供一个完整的例子吗?否则很难看出问题出在哪里。@ejgallego我不能使用任何coqjs环境,因为我使用的范畴理论库没有包含在任何沙箱中,而是我的代码(对于第二个片段,但文件的其余部分在两个版本之间是相同的)。我刚刚尝试使用您的解决方案(手动声明重写关系、自反、传递实例),但使用Ssreflect的重写无法工作。使用标准coq重写一切都可以-但当我使用Ssreflect时,它会给我以下错误:
    不是可重写关系:(等效a b)
    。我想重点是Ssreflect不能使用
    creation
    s重写。
    Require Setoid. (* 1 *)
    Require Import CMorphisms. (* 2 *)
    
    Axiom obj : Type.
    Axiom equiv : obj -> obj -> Type.
    Axiom cat : forall a b c, equiv a b -> equiv b c -> equiv a c.
    
    (* 3 *)
    Instance Transitive_equiv : Transitive equiv.
    Proof.
      exact cat.
    Qed.
    
    (* Example usage *)
    Goal forall a b c,
        equiv a b -> equiv b c -> equiv a c.
    Proof.
      intros a b c H1 H2.
      rewrite H1.
      (* or,
      rewrite H2
      *)