Coq 雷尔:勒乌反对称理解

Coq 雷尔:勒乌反对称理解,coq,logical-foundations,Coq,Logical Foundations,从逻辑基础上再看一章。我得到了一个我试图理解的练习的解决方案: Definition antisymmetric {X: Type} (R: relation X) := forall a b : X, (R a b) -> (R b a) -> a = b. Theorem le_antisymmetric : antisymmetric le. Proof. unfold antisymmetric. intros a b [| b' H1] H2. - ref

从逻辑基础上再看一章。我得到了一个我试图理解的练习的解决方案:

Definition antisymmetric {X: Type} (R: relation X) :=
  forall a b : X, (R a b) -> (R b a) -> a = b.

Theorem le_antisymmetric :
  antisymmetric le.
Proof.
  unfold antisymmetric. intros a b [| b' H1] H2.
  - reflexivity.
  - absurd (S b' <= b').
    + apply le_Sn_n.
    + etransitivity ; eassumption.
第二个子目标:

a, b, b' : nat
H1 : a <= b'
H2 : S b' <= a
============================
a = S b'
a,b,b”:nat

H1:a
介绍a b[|b'H1]H2
相当于

intros a b H H2.
destruct H as [| b' H1].
destruct
模式通常遵循这样的规则:如果一个归纳类型有一个构造函数(例如产品),那么对于该归纳类型中的
x
destruct x作为[a b c..]
进行(非递归)归纳,并将新变量重命名为
a
b
c
,等。当归纳类型有多个构造函数时,会出现多个情况。为此,可以使用
析构函数x作为[abc…| def…|]
。如果需要,可以嵌套这些销毁模式,例如,
destructx as[[ab]|[c[d|e]]]
。请注意,如果构造函数不带参数,则没有可重命名的内容,因此可以将模式保留为空

特别是,像自然数这样的东西可以用
析构函数n作为[|n']
进行析构函数。这分为以下情况:
n
为零(并且构造函数没有参数,因此
|
左侧没有任何内容)或者
n
n'
的后续项。类似地,可以将列表分解为
destruct li as[|a li']
,将列表分为
nil
cons a li'
两种情况。
左侧的空格是不必要的,因此您可以将li作为[| li']
进行
解构

具体地说,在你的案例中,
le
被定义为一种归纳类型,沿着

Inductive le (n : nat) : nat -> Prop :=
| le_n : le n n
| le_S : forall m : nat, le n m -> le n (S m).
因此有两种情况:一种是没有参数的情况,另一种是后续情况,其中参数是
m:nat
H:len m
。因此,销毁模式是
[|mh]


回答你的第二个问题,
荒谬(sb'False
)。使用
False
的归纳原则,这允许我们为任何类型生成见证,尤其是
a=sb'

你可以通过最少的实验看出
荒谬的
产生了什么样的证明术语

Goal forall A B: Type, A.
Proof.
  intros A B.
  absurd B.
  Show Proof.

这应该打印
(乐趣A B:Type=>False\rect A(?Goal?Goal0))
。第一个目标(
?目标
)的类型为
~B
(即
B->False
)。第二个目标(
?Goal0
)的类型为
B
。如果我们可以同时提供这两种类型,那么
?Goal?Goal0
的类型为
False
,因此
False\rect A(?Goal?Goal0)
生成类型为
A

的见证,介绍A b[|b'H1]H2
相当于

intros a b H H2.
destruct H as [| b' H1].
destruct
模式通常遵循这样的规则:如果一个归纳类型有一个构造函数(例如产品),那么对于该归纳类型中的
x
destruct x作为[a b c..]
进行(非递归)归纳,并将新变量重命名为
a
b
c
,等。当归纳类型有多个构造函数时,会出现多个情况。为此,可以使用
析构函数x作为[abc…| def…|]
。如果需要,可以嵌套这些销毁模式,例如,
destructx as[[ab]|[c[d|e]]]
。请注意,如果构造函数不带参数,则没有可重命名的内容,因此可以将模式保留为空

特别是,像自然数这样的东西可以用
析构函数n作为[|n']
进行析构函数。这分为以下情况:
n
为零(并且构造函数没有参数,因此
|
左侧没有任何内容)或者
n
n'
的后续项。类似地,可以将列表分解为
destruct li as[|a li']
,将列表分为
nil
cons a li'
两种情况。
左侧的空格是不必要的,因此您可以将li作为[| li']
进行
解构

具体地说,在你的案例中,
le
被定义为一种归纳类型,沿着

Inductive le (n : nat) : nat -> Prop :=
| le_n : le n n
| le_S : forall m : nat, le n m -> le n (S m).
因此有两种情况:一种是没有参数的情况,另一种是后续情况,其中参数是
m:nat
H:len m
。因此,销毁模式是
[|mh]


回答你的第二个问题,
荒谬(sb'False
)。使用
False
的归纳原则,这允许我们为任何类型生成见证,尤其是
a=sb'

你可以通过最少的实验看出
荒谬的
产生了什么样的证明术语

Goal forall A B: Type, A.
Proof.
  intros A B.
  absurd B.
  Show Proof.
这应该打印
(乐趣A B:Type=>False\rect A(?Goal?Goal0))
。第一个目标(
?目标
)的类型为
~B
(即
B->False
)。第二个目标(
?Goal0
)的类型为
B
。如果我们可以同时提供这两个,那么
?Goal?Goal0
的类型为
False
,因此
False\u rect A(?Goal?Goal0)
生成类型为
A
的见证