我想证明,对于任何自然数,n + 1都大于0。
定义我自己的大于函数这很好用:
Fixpoint my_gt (n : nat) (m : nat) : bool
:= match n with
| O => false
| S n' => match m with
| O => true
| S m' => my_gt n' m'
end
end.
Lemma GT1: forall n, my_gt (S n) O = true. reflexivity. Qed.
但是当我使用默认的“>”时 - 关系Coq拒绝消息“Tactic failure:关系gt不是声明的反身关系。也许你需要需要Setoid库”。因为我确实需要Setoid库,所以我不明白为什么Coq似乎没有找到gt定义?
Require Export Coq.Setoids.Setoid.
Lemma GT2: forall n, S n > O. reflexivity.
答案 0 :(得分:1)
如果你看一下Coq的gt
定义,那么你会认为这只是lt
上的符号,这是le
以上的符号:
gt = fun n m : nat => m < n
: nat -> nat -> Prop
lt = fun n m : nat => S n <= m
: nat -> nat -> Prop
Inductive le (n : nat) : nat -> Prop :=
le_n : n <= n | le_S : forall m : nat, n <= m -> n <= S m
现在你可以看到,它并没有被声明为一个函数,而是一个归纳谓词,所以你不能简单地“计算”#34;得到解决方案。要证明这样的目标,您必须使用constructor
和induction
等策略来证明自己的目标。
请注意,您的关系位于bool
,而Coq位于Prop
(比较某些类型的两个元素的一般方法可能无法判定)。对于自然数的特定情况,您可以在leb
模块中的某处找到Arith
,其行为与您相同:
Require Import Arith.
Print leb.
Lemma GT2: forall n, leb O (S n) = true.
reflexivity.
Qed.
最佳, 诉