关于Coq(使用Init库)的一个非常基本的问题:术语10
的类型为nat
,
类型nat
是归纳定义的:
Inductive nat : Set :=
| O : nat
| S : nat -> nat.
Q1。但“10”是S(S(...S(0)...))
的“捷径”?
Q2。是否有以下引理的最短(正式)证明? (不使用欧米茄)
Lemma gg : 3 <= 10.
apply le_S.
apply le_S.
apply le_S.
apply le_S.
apply le_S.
apply le_S.
apply le_S.
apply le_n.
Qed.
换句话说,n <= m
(只有Peano公理)的证明是否需要指数长度?
答案 0 :(得分:6)
Q1:是的。
Q2:你可以使用反射证明技术来消除这些琐碎的大样本。本章解释了您希望如何以及为什么要这样做:
答案 1 :(得分:5)
A1。右。
A2。据我所知,le
(<=
)的定义,你必须使用le_S
和le_n
来构建它的证据。
Inductive le (n : nat) : nat -> Prop :=
le_n : n <= n | le_S : forall m : nat, n <= m -> n <= S m
...除非你定义一个引理使你的工作更轻松。
您可以这样做:
Lemma gg : 3 <= 10.
Proof.
do 7 (apply le_S).
apply le_n.
Qed.
......或
Lemma gg' : 3 <= 10.
Proof. repeat constructor. Qed.
......或者反过来说:
Lemma le_s : forall n m, n <= m -> S n <= S m.
Proof.
intros. induction H. constructor.
constructor. apply IHle.
Qed.
Lemma gg'' : 3 <= 10.
Proof.
pose proof (le_n 0).
do 3 (apply le_s in H).
do 7 (apply le_S in H).
apply H.
Qed.
答案 2 :(得分:5)
以下是Ptival回答的一个例子。
Require Import Coq.Arith.Arith.
Check @eq_refl.
Check leb_complete.
Goal 3 <= 10. Proof. apply leb_complete. apply eq_refl. Qed.
Goal 30 <= 100. Proof. apply leb_complete. apply eq_refl. Qed.
Goal 300 <= 1000. Proof. apply leb_complete. apply eq_refl. Qed.
来想一想,omega
也不是一种反思的证据吗?或者它是否在OCaml中编程?