Skip to Content.
Sympa Menu

coq-club - Re: [Coq-Club] Simplify proofs with nested pattern matching (cases explosion)

coq-club AT inria.fr

Subject: The Coq mailing list

List archive

Re: [Coq-Club] Simplify proofs with nested pattern matching (cases explosion)


Chronological Thread 
  • From: Julien Forest <julien.forest AT ensiie.fr>
  • To: Xavier Leroy <xavier.leroy AT college-de-france.fr>
  • Cc: coq-club AT inria.fr
  • Subject: Re: [Coq-Club] Simplify proofs with nested pattern matching (cases explosion)
  • Date: Mon, 29 Jun 2020 20:29:47 +0200
  • Authentication-results: mail2-smtp-roc.national.inria.fr; spf=None smtp.pra=julien.forest AT ensiie.fr; spf=Pass smtp.mailfrom=julien.forest AT ensiie.fr; spf=None smtp.helo=postmaster AT mail.ensiie.fr
  • Ironport-phdr: 9a23:uf7UYBbiTUsjl23TAhYr+ez/LSx+4OfEezUN459isYplN5qZrs+/bnLW6fgltlLVR4KTs6sC17OL9fmxCCddvd6oizMrSNR0TRgLiMEbzUQLIfWuLgnFFsPsdDEwB89YVVVorDmROElRH9viNRWJ+iXhpTEdFQ/iOgVrO+/7BpDdj9it1+C15pbffxhEiCCybL9vLBi6txjdu80SjIdtKqs8xQbCr2dVdehR2W5mP0+YkQzm5se38p5j8iBQtOwk+sVdT6j0fLk2QKJBAjg+PG87+MPktR/YTQuS/XQcSXkZkgBJAwfe8h73WIr6vzbguep83CmaOtD2TawxVD+/4apnVAPkhSEaPDMi7mrZltJ/g75aoBK5phxw3YjUYJ2ONPFjeq/RZM4WSXZdUspUUSFKH4GyYJYVD+cZM+hWr5fzqUYNoxS8CwmiA+zgxSNTi3/zwaE3yf4sHBva0AEiGd8FrXTarM/yNKcXSe27yLTIzTHCb/xI3zf29YjGchc7of6SRrJwbdfaxE4tFwPYilWQqJLqPzWP2uQDtGib9fRvVfmzi2M8tQ5xpCOvxsYtiobXnI4VxErE+Dx/zY0oKtK2VFR1bsS4EJtMqS6aLY12T9s8T2xopCo3xL4LtJq/cSUO1Jkq2x/SZfybfoWL4B/vSOifLDh5iX9qZr6yhwu+/Ei9x+DyWcS5zVhEojdKnNTRsH0GyhLd6s+CSvRn/0eh3y6C1wHV6uFeIEA7j7DXK5A7wrM2i5EdslzDEzfrlEjygqKabEUp9+ey5+j6ZrjrpoWQO5Fphg3gKqgjmM+yDf4lPgUKUGWX4/mw2bPt8EHjXblGk+A6n6/Eu57AP8sbvLS2AwpN34Yj9Rm/CzCm3cwdnXYdLVJFfAiLgJbvO1HVIfD4DOmwj06ikDdx3/zGP7vhDYvRLnXbjbvsebhw51RcxQc819xT+pZZB7EbLP7tR0P9qsTUDhojPAy1x+bnBs991oQbWW+XAK+ZLafSsV6W6eIpOeWMaogVuCzjJPg++/7jlmE2mVkGfamo3JsYdmq0Hvp8I0mBe3rjns8BEXsWvgo5VOHllFqCUSdKa3muW6I8+yo0BZm9DYbDQ4CtmKaO0D26Hp1QfGBGC0qDHW3md4WeCL8wb3eiK9FgnyZMcbW7TJ5pgQGnqg730fxjI/DT6wUTspbn2dd4ouHe0B8o/Dp/AoKTyTfeYXtzmzYqWjs30aY3j0tnx0yfmfx6nvhZGNoV6fRTXxwmHZPa1O17Bpb8QFSSLZ+yVF+6T4D+UnkKRdUrzopLOh4lQojwvlX4xyOvRoQtufmLCZgzq/yO2nHwI4BwzW3H1aRngUN0GpITZ13jvbZ28k3oP6CMi1+Qzv/4eKIH3S/AsmmZnzLX7RNoFTVoWKCAZkgxI07frND3/ETHFub8BLI8MwpMj8CYePJH

On Mon, 29 Jun 2020 18:08:34 +0200
Xavier Leroy <xavier.leroy AT college-de-france.fr> wrote:

> On Mon, Jun 29, 2020 at 5:39 PM Gaëtan Gilbert <
> [...]
>
> [...]
>
> That's a very good trick, and it can be automated using Function
> instead of Definition, see ttps://
> coq.inria.fr/distrib/current/refman/language/gallina-extensions.html#coq:cmd.function
>
> Function is_valid b :=
> match b with
> | x00 | xff => true
> | _ => false (* 254 cases hidden in this _ *)
> end.
>
> will generate the inductive predicate R_is_valid and the proofs of
> equivalence with the is_valid function.
>
> Hope this helps,
>
> - Xavier Leroy

Just to illustrate both Gaëtan and Xavier ideas using Function.

Cheers,

Julien Forest
>
>
> [...]
> [...]
> [...]
> [...]
> [...]
> [...]
> [...]
> [...]
> [...]
> [...]
> [...]
> [...]
> [...]
> [...]
> [...]
> [...]
> [...]
> [...]
> [...]

Require Import Init.Byte.
Require Import Recdef.

Function is_valid b :=
  match b with
  | x00 | xff => true
  | _ => false (* 254 cases hidden in this _ *)
  end.

Lemma some_lemma : forall b, is_valid b = true -> b = x00 \/ b = xff.
Proof.
  intro b;functional induction (is_valid b).
  - intros _;left;reflexivity.
  - intros _;right;reflexivity.
  - discriminate.
Qed.


(* If you want to recover decidability of validity you still can
   (here by hand, or you can use some ssr stuff for decidable properties) *)
Definition valid_checker (b:byte) : { v:bool | v=true <-> is_valid b = true}.
Proof.
  functional induction (is_valid b).
  1,2: exists true;tauto.
  1: exists false;tauto.
Defined.



Archive powered by MHonArc 2.6.19+.

Top of Page