Застрял на простом неравенстве доказательства натуральных чисел в Coq

Я хочу доказать обращение неравенства при отрицании в натуральных числах:

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, то дело сделано. Но я тоже не могу решить эту проблему. Может ли кто-нибудь помочь? Большое спасибо!

Почему в сети нет простого списка доступных тактик вместе с их описаниями?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
54
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я не эксперт в этом, но вы можете структурировать это доказательство 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 предположения)...

Julio Di Egidio 03.09.2024 13:44

Другие вопросы по теме