证明构造函数是 Coq 中的偏函数
Proving constructors are partial functions in Coq
归纳定义如下:
Inductive A :=
mkA : nat -> A.
证明构造函数是部分函数可以编码为:
Lemma constructor_functional :
forall i1 i2, mkA i1 <> mkA i2 -> i1 <> i2.
虽然证明起来很简单,但对每个定义的类型都这样做听起来很奇怪。
是否有编码此 属性 的策略?或者图书馆里的一些等价物?尽管通过搜索 (_ <> _)
.
我没有在 ssreflect 中找到任何东西
您可以声明一个通用引理,将此结果包含在每个 Coq 函数中。由于像您的 mkA
这样的构造函数只是函数,因此结果也适用于它们。
Lemma function_functional :
forall (X Y : Type) (f : X -> Y) (x1 x2 : X),
f x1 <> f x2 -> x1 <> x2.
Proof.
intros X Y f x1 x2 H1 H2.
apply H1.
now rewrite H2.
Qed.
这条语句实际上是标准库中下面一条语句的反面。
Lemma f_equal :
forall (X Y : Type) (f : X -> Y) (x1 x2 : X),
x1 = x2 -> f x1 = f x2.
归纳定义如下:
Inductive A :=
mkA : nat -> A.
证明构造函数是部分函数可以编码为:
Lemma constructor_functional :
forall i1 i2, mkA i1 <> mkA i2 -> i1 <> i2.
虽然证明起来很简单,但对每个定义的类型都这样做听起来很奇怪。
是否有编码此 属性 的策略?或者图书馆里的一些等价物?尽管通过搜索 (_ <> _)
.
您可以声明一个通用引理,将此结果包含在每个 Coq 函数中。由于像您的 mkA
这样的构造函数只是函数,因此结果也适用于它们。
Lemma function_functional :
forall (X Y : Type) (f : X -> Y) (x1 x2 : X),
f x1 <> f x2 -> x1 <> x2.
Proof.
intros X Y f x1 x2 H1 H2.
apply H1.
now rewrite H2.
Qed.
这条语句实际上是标准库中下面一条语句的反面。
Lemma f_equal :
forall (X Y : Type) (f : X -> Y) (x1 x2 : X),
x1 = x2 -> f x1 = f x2.