我不能将 Ssreflect 的重写与 setoid 一起使用。虽然我认为这些信息与解决问题无关,但我在 coq 中使用了这种类别理论的表述:https ://github.com/jwiegley/category-theory 。
据我所知,如果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 看不到我的关系。显然,您可以添加要与 Ssreflect 的重写一起使用的关系,仅Add Parametric Relation
在手册中记录,并且RewriteRelation
实例不会更改任何内容。我试图使用公理创建一个假关系并将其添加Add Parametric Relation
并rewriting
正常工作。但现在我又遇到了麻烦。我希望能够使用的关系具有类型crelation (x ~> y)
(即(x ~> y) -> (x ~> y) -> Type
),但要使用Add Parametric Relation
我需要一个具有类型的术语relation (x ~> y)
(即(x ~> y) -> (x ~> y) -> Prop
。为什么在标准库中定义了两种不同类型的关系(relation
和crelation
)?我怎么能将 a 转换crelation
为 arelation
没有得到宇宙不一致错误?而且我仍然不明白为什么上面的例子False
有效。