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
的见证