Один из способов упростить это использовать довольно скучную лемму
Lemma add_zero_r : forall n, n + 0 = n.
Proof.
intros n. induction n. reflexivity.
simpl. rewrite IHn. reflexivity.
Qed.
и в следующих использовать это, чтобы переписать цель:
Theorem add_increase: (forall a b: nat, a > 0 -> a + b > b).
Proof.
intros A.
intros B.
intros H.
case B.
rewrite (add_zero_r A).
assumption.
Для завершения доказательства другого случая, я использовал небольшая лемма и тактика, которая облегчает задачу доказательства вещей неравенствами над естественными.
Во-первых, я импортировал библиотеку Omega
.
Require Import Omega.
Докажите еще один скучный факт.
Lemma add_succ_r : forall n m, n + (S m) = S (n + m).
Proof.
intros n m. induction n. reflexivity.
simpl. rewrite IHn. reflexivity.
Qed.
и вернуться к add_increase prove
мы имеем следующую цель:
A, B : nat
H : A > 0
============================
forall n : nat, A + S n > S n
Это может быть решена путем:
intros C.
rewrite (add_succ_r A C).
omega.
Снова, я использовал предыдущий доказал лемму переписать цель. Тактика omega
очень полезна, так как это полная процедура принятия решения так называемого quantifier free Presburger arithmetic, и на основе вашего контекста он может решить цель automagically
.
Вот полное решение для вашего доказательства:
Require Import Omega.
Lemma add_zero_r : forall n, n + 0 = n.
Proof.
intros n. induction n. reflexivity.
simpl. rewrite IHn. reflexivity.
Qed.
Lemma add_succ_r : forall n m, n + (S m) = S (n + m).
Proof.
intros n m. induction n. reflexivity.
simpl. rewrite IHn. reflexivity.
Qed.
Theorem add_increase: (forall a b: nat, a > 0 -> a + b > b).
Proof.
intros A.
intros B.
intros H.
case B.
rewrite (add_zero_r A).
assumption.
intros C.
rewrite (add_succ_r A C).
omega.
Qed.
Ничего себе, это удивительно полный ответ. Спасибо, что нашли время, чтобы помочь новичкам, как я. Один вопрос, однако, есть способ контролировать название гипотезы, созданной путем доказательства первого индукционного подцелья? В частности, в add_zero_r, после первой строки, создается новая гипотеза с именем «IHn», есть ли способ присвоить эту гипотезу явному имени? – Others
Да. Вы можете изменить имя 'IHn' на' IHn1', используя 'induction n as [| n1 IHn1] '. –
Хорошо спасибо за помощь! – Others