Coq:证明<;和≤;
我现在正在学习Coq,在一个更大的证明中,我被以下子证明难住了:Coq:证明<;和≤;,coq,proof,coq-tactic,Coq,Proof,Coq Tactic,我现在正在学习Coq,在一个更大的证明中,我被以下子证明难住了: Theorem sub : ∀ n m : nat, n ≤ m → n ≠ m → n < m. 这里,“n≤ “m”的归纳定义如下: Inductive le : nat → nat → Prop := | le_n : ∀ n : nat, le n n | le_S : ∀ n m : nat, (le n m) → (le n (S m)). 我还没走多远,但我的尝试是这样的: Theore
Theorem sub : ∀ n m : nat, n ≤ m → n ≠ m → n < m.
这里,“n≤ “m”的归纳定义如下:
Inductive le : nat → nat → Prop :=
| le_n : ∀ n : nat, le n n
| le_S : ∀ n m : nat, (le n m) → (le n (S m)).
我还没走多远,但我的尝试是这样的:
Theorem sub : ∀ n m : nat, n ≤ m → n ≠ m → n < m.
Proof.
unfold lt.
intro n.
induction n.
- induction m.
+ intros. exfalso. contradiction.
+ admit.
- admit.
Admitted.
我不知道如何利用这个假设来证明这个子目标。如果能给我提供正确的指导,我将不胜感激。既然
le
被定义为归纳谓词,那么对其进行归纳比n
更有意义le
没有任何引用0
甚至SN
(它确实有SM
),因此对n
进行归纳可能不是一种方法。对m
进行归纳可能有效,但可能比必要的难度更大
在开始正式证明之前,考虑一下如何非正式地证明这一点(尽管仍然使用相同的定义),通常会有所帮助。如果您假定n≤ m
,然后根据lt
的归纳定义,这意味着n
和m
是相同的,或者m
是某个数m'
的后继数,并且n
小于或等于m'
(你能看出lt
的定义为什么意味着这一点吗?)。在第一种情况下,我们必须使用附加的假设,n≠ m
推导出一个矛盾。在第二种情况下,我们甚至不需要它<代码>n≤ m'表示sn≤ S m'
,所以既然m=S m'
,sn≤ m
,即n
对于形式化,我们必须在最后一行证明n的假设≤ m
表示sn≤ S m
。你应该尝试类似的非正式分析来证明这一点。除此之外,非正式的证明应该直接形式化。H:n案例分析≤ m
只是自毁H.
还有一件事。这不是必要的,但从长远来看通常会有所帮助。在定义归纳类型(或谓词)时,如果您可以将每个构造函数中使用相同方式的参数分解出来,则可以使归纳原理更加强大。使用
le
,n
的方法是普遍量化的,并且对两个构造函数使用相同的方法。le
的每个实例都以le n
开头
Inductive le : nat → nat → Prop :=
| le_n : ∀ n : nat, le n n
| le_S : ∀ n m : nat, (le n m) → (le n (S m)).
这意味着我们可以将该索引分解为一个参数
Inductive le' (n: nat) : nat → Prop :=
| le_n' : le' n n
| le_S' : ∀ m : nat, (le' n m) → (le' n (S m)).
这将为您提供一个稍微简单/更好的归纳原理
le'_ind
: forall (n : nat) (P : nat -> Prop),
P n ->
(forall m : nat, le' n m -> P m -> P (S m)) ->
forall n0 : nat, le' n n0 -> P n0
将此与leu ind
进行比较
le_ind
: forall P : nat -> nat -> Prop,
(forall n : nat, P n n) ->
(forall n m : nat, le n m -> P n m -> P n (S m)) ->
forall n n0 : nat, le n n0 -> P n n0
基本上,这里发生的事情是,使用
leu ind
,您必须证明每个n
的一切。使用le''u ind
,您只需证明您正在使用的特定n
。这有时可以简化证明,尽管这不是证明定理的必要条件。要证明这两个谓词是等价的,这是一个很好的练习。除了@SCappella的答案外,请注意,介绍;lia。
也会解决这个问题。
le'_ind
: forall (n : nat) (P : nat -> Prop),
P n ->
(forall m : nat, le' n m -> P m -> P (S m)) ->
forall n0 : nat, le' n n0 -> P n0
le_ind
: forall P : nat -> nat -> Prop,
(forall n : nat, P n n) ->
(forall n m : nat, le n m -> P n m -> P n (S m)) ->
forall n n0 : nat, le n n0 -> P n n0