2016-02-18 6 views
1

Я просто новичок в Coq, и я пытался доказать несколько элементарных теорем о натуральных числах. Я уже делал несколько, не очень изящно, но заканчивал меньше, чем меньше. Тем не менее, я полностью застрял на завершение этой теоремы:Как упростить A + 0> 0 в A> 0?

Theorem add_increase: (forall a b: nat, a > 0 -> a + b > b). 
Proof. 
    intros A. 
    intros B. 
    intros H. 
    case B. 

Ввод это, я получаю этот выход:

2 subgoals 
A, B : nat 
H : A > 0 
______________________________________(1/2) 
A + 0 > 0 
______________________________________(2/2) 
forall n : nat, A + S n > S n 

Очевидно, что первая цель является довольно тривиальной упростить гипотезы H. Однако я просто не могу понять, как сделать это простое упрощение.

ответ

3

Один из способов упростить это использовать довольно скучную лемму

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. 
+0

Ничего себе, это удивительно полный ответ. Спасибо, что нашли время, чтобы помочь новичкам, как я. Один вопрос, однако, есть способ контролировать название гипотезы, созданной путем доказательства первого индукционного подцелья? В частности, в add_zero_r, после первой строки, создается новая гипотеза с именем «IHn», есть ли способ присвоить эту гипотезу явному имени? – Others

+0

Да. Вы можете изменить имя 'IHn' на' IHn1', используя 'induction n as [| n1 IHn1] '. –

+0

Хорошо спасибо за помощь! – Others

0

Другое решение, используя различные натуральные числа библиотеки ssrnat и ssreflect стойкую язык (который необходим в библиотеке):

From mathcomp Require Import ssreflect ssrfun ssrbool eqtype ssrnat seq. 

Theorem add_increase a b : 0 < a -> b < a + b. 
Proof. by rewrite -{1}[b]add0n ltn_add2r. Qed. 

ltn_add2r : (m + p < n + p) = (m < n) Лемма доказана индукцией по p, непосредственно по индукции по p плюс коммутативность и другие легкие свойства добавления.

+1

Вы должны добавить, что это использование библиотеки ssreflect, а не vanilla Coq – Vinz

+0

О, конечно, я буду более конкретным, чем «использование другой библиотеки натуральных чисел», – ejgallego

2

Несколько стандартных лемм, таких как a + 0 = 0 и т. Д., Помещаются в базу данных подсказок arith.С ними auto обычно можно решить многие простые задачи такого рода, поэтому используйте auto with arith.

Require Import Arith. 
Theorem add_increase: (forall a b: nat, a > 0 -> a + b > b). 
    destruct a; intros b H. 
    - inversion H. (* base case, H: 0 > 0 *) 
    - simpl. auto with arith. 
Qed. 

Чтобы узнать, какие леммы auto используется, вы можете Print add_increase. В этом случае auto используются три леммы, и они в качестве альтернативы могут быть даны в явном виде to auto by auto using gt_le_S, le_lt_n_Sm, le_plus_r.

В общем, если вам нужна лемма, которую, по вашему мнению, уже доказали, вы можете найти ее с помощью SearchAbout. Используйте _ в качестве дикой карты или ?a в качестве именованной дикой карты. В вашем случае выше вы хотели что-то о добавлении нуля на правой, так

SearchAbout (_ + 0 = _). 

возвращается

plus_0_r: forall n : nat, n + 0 = n 
NPeano.Nat.add_0_r: forall n : nat, n + 0 = n 

Вы можете даже найти лемму в библиотеке, которая близка к тому, что вы хотите доказать.

SearchAbout (_ > _ -> _ + _ > _). 

находит

plus_gt_compat_l: forall n m p : nat, n > m -> p + n > p + m 

который довольно близко к add_increase.

Theorem add_increase: (forall a b: nat, a > 0 -> a + b > b). 
    intros. 
    pose (plus_gt_compat_l a 0 b H) as A. 
    repeat rewrite (plus_comm b) in A. 
    apply A. 
Qed. 
Смежные вопросы