Я хочу доказать обращение неравенства при отрицании в натуральных числах:
forall i j : nat, i <= j -> forall w : nat, i <= w -> j <= w -> w - i >= w - j.
Я пытаюсь доказать по индукции. Сначала я тривиально доказываю это w - i >= w - i
с помощью рефлексии. Затем я пытаюсь доказать w - i >= w - S m
при условии, что w - i >= w - m
, и застреваю. Кажется, если я докажу w - m >= w - S m
, то дело сделано. Но я тоже не могу решить эту проблему. Может ли кто-нибудь помочь? Большое спасибо!
Почему в сети нет простого списка доступных тактик вместе с их описаниями?
Я не эксперт в этом, но вы можете структурировать это доказательство Coq
:
Require Import Arith.
Lemma le_minus : forall i j : nat, i <= j -> forall w : nat, i <= w -> j <= w -> w - i >= w - j.
Proof.
intros i j H1 w H2 H3.
(* Induction on j *)
induction j as [| m IHm].
- (* Base Case: j = 0 *)
assert (i = 0) as Hi0 by lia.
rewrite Hi0. simpl. auto.
- (* Inductive Step: j = S m *)
destruct (Nat.eq_dec i (S m)).
+ (* Case: i = S m *)
subst. lia.
+ (* Case: i < S m *)
assert (i <= m) as H4 by lia.
specialize (IHm H4 w H2).
apply le_trans with (w - m).
* apply IHm. lia.
* simpl. lia.
Qed.
Если j = 0
, то по условию i ≤ j
имеем i = 0
. Цель — w − 0 ≥ w − 0
, что тривиально.
j = S m
i ≤ m
(т. е. w − i ≥ w − m
) верна.w − i ≥ w − S m
.i = S m
или i < S m
.i = S m
, то w − i ≥ w − j
тривиально, так как w − S m ≥ w - S m
.i < S m
, мы используем гипотезу индукции, чтобы уменьшить цель, а затем применяем базовые арифметические рассуждения.intros
: знакомит с количественными переменными и предположениями.induction j as [| m IHm]
: Выполняет индукцию по jj.destruct (Nat.eq_dec i (S m))
: Анализ случая: i = S m
или i < S m
.assert (i = 0) as Hi0 by lia
: Вводит и доказывает необходимое равенство, используя тактику лиа.lia
: Мощная тактика, решающая задачи линейной арифметики.apply le_trans
: использует транзитивность ≥≥ для объединения результатов.Coq
ресурсов по тактике в ИнтернетеК сожалению, в сети нет «простого» списка Coq
тактик, и для этого нужно немало покопаться в Интернете.
Надеюсь, это поможет!
Благодаря @Alizain, после некоторых проб и ошибок я нашел работоспособный скрипт на основе ее/его ответа, в котором есть несколько опечаток:
Require Import Arith.
Require Import Lia.
Lemma le_minus : forall i j : nat, i <= j -> forall w : nat, i <= w -> j <= w -> w - i >= w - j.
Proof.
intros i j H1 w H2 H3.
(* Induction on j *)
induction j as [| m IHm].
- (* Base Case: j = 0 *)
assert (i = 0) as Hi0 by lia.
rewrite Hi0. auto.
- (* Inductive Step: j = S m *)
destruct (Nat.eq_dec i (S m)).
+ (* Case: i = S m *)
subst. lia.
+ (* Case: i < S m *)
assert (i <= m) as H4 by lia.
assert (m <= w) as H5 by lia.
specialize (IHm H4 H5).
apply le_trans with (w - m); lia.
Qed.
Обновлено:
На самом деле, это может быть намного проще, если использовать lia
:
Lemma le_minus : forall i j : nat, i <= j -> forall w : nat, i <= w -> j <= w -> w - i >= w - j.
Proof. lia. Qed.
Лия решает ее, иначе для доказательства «из основных определений»: однажды потребовалось и импортировано
Arith
(на самом делеPeanoNat
достаточно), развернитеge
, тогда доказательство очень просто, применяя теоремуNat.sub_le_mono_l
(даже не нужноi<=w
иj<=w
предположения)...