diff options
| author | Rutger Broekhoff | 2026-08-28 18:03:05 +0200 |
|---|---|---|
| committer | Rutger Broekhoff | 2026-08-28 18:03:05 +0200 |
| commit | 973aec43ea54bbf95b64fbcb636403401d1ca60e (patch) | |
| tree | 41b7911c420766a9b463245b9296f44c5bf35258 /server/formal/util.v | |
| download | routemon-973aec43ea54bbf95b64fbcb636403401d1ca60e.tar.gz routemon-973aec43ea54bbf95b64fbcb636403401d1ca60e.zip | |
Import from e4b104792206ee7ea64bf39c6b7d2c0c230f9d14
Diffstat (limited to 'server/formal/util.v')
| -rw-r--r-- | server/formal/util.v | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/server/formal/util.v b/server/formal/util.v new file mode 100644 index 0000000..8e16ffc --- /dev/null +++ b/server/formal/util.v | |||
| @@ -0,0 +1,92 @@ | |||
| 1 | From stdpp Require Import numbers option sorting ssreflect. | ||
| 2 | From stdpp Require Import options. | ||
| 3 | |||
| 4 | Definition transportf {X} (P : X → Type) {x x' : X} : x = x' → P x → P x'. | ||
| 5 | Proof. by induction 1. Defined. | ||
| 6 | |||
| 7 | Instance HdRel_pi {A} (R : relation A) `{!EqDecision A} `{!∀ x y, ProofIrrel (R x y)} a l : ProofIrrel (HdRel R a l). | ||
| 8 | Proof. | ||
| 9 | intros HR1 HR2. | ||
| 10 | assert (Hnil : ∀ xs (Hxs : [] = xs) (HR : HdRel R a xs), | ||
| 11 | HR = transportf _ Hxs (HdRel_nil R a)). | ||
| 12 | { intros. destruct HR; last done. | ||
| 13 | by replace Hxs with (eq_refl ([] : list A)); last apply eq_pi, list_eq_dec. } | ||
| 14 | assert (Hcons : ∀ xs x y xs' (Hxs : y :: xs' = xs) (HR : HdRel R x xs) (Hxy : R x y), | ||
| 15 | HR = transportf (HdRel R x) Hxs (HdRel_cons R x y xs' Hxy)). | ||
| 16 | { intros. destruct HR; first done. | ||
| 17 | injection Hxs as <- <-. | ||
| 18 | replace Hxs with (eq_refl (y :: xs')); last apply eq_pi, list_eq_dec. | ||
| 19 | simpl. | ||
| 20 | by replace r with Hxy by apply H. } | ||
| 21 | destruct l. | ||
| 22 | - trans (transportf (HdRel R a) eq_refl (HdRel_nil R a)). | ||
| 23 | + apply Hnil. | ||
| 24 | + symmetry. apply Hnil. | ||
| 25 | - apply HdRel_inv in HR1 as Haa0. | ||
| 26 | trans (transportf (HdRel R a) eq_refl (HdRel_cons R a a0 l Haa0)). | ||
| 27 | + apply Hcons. | ||
| 28 | + symmetry. apply Hcons. | ||
| 29 | Qed. | ||
| 30 | |||
| 31 | Instance Sorted_pi {A} (R : relation A) `{!EqDecision A} `{!∀ x y, ProofIrrel (R x y)} l : ProofIrrel (Sorted R l). | ||
| 32 | Proof. | ||
| 33 | intros HS1 HS2. | ||
| 34 | assert (Hbase : ∀ xs (Hxs : [] = xs) (HS : Sorted R xs), HS = transportf _ Hxs (Sorted_nil R)). | ||
| 35 | { intros. destruct HS; last done. | ||
| 36 | by replace Hxs with (eq_refl ([] : list A)); last apply eq_pi, list_eq_dec. } | ||
| 37 | assert (Hind : ∀ xs x xs' | ||
| 38 | (Hxs : x :: xs' = xs) (HS : Sorted R xs) | ||
| 39 | (Hx : HdRel R x xs') (HS' : Sorted R xs') | ||
| 40 | (IH : ∀ HS1' HS2' : Sorted R xs', HS1' = HS2'), | ||
| 41 | HS = transportf _ Hxs (Sorted_cons HS' Hx)). | ||
| 42 | { intros. destruct HS; first done. | ||
| 43 | injection Hxs as <- <-. | ||
| 44 | replace Hxs with (eq_refl (x :: xs')); last apply eq_pi, list_eq_dec. | ||
| 45 | simpl. | ||
| 46 | replace h with Hx by apply: HdRel_pi. | ||
| 47 | by replace HS with HS' by apply IH. } | ||
| 48 | induction l. | ||
| 49 | - trans (transportf _ eq_refl (Sorted_nil R)). | ||
| 50 | + apply Hbase. | ||
| 51 | + symmetry. apply Hbase. | ||
| 52 | - destruct (Sorted_inv HS1) as [Hl Hal]. | ||
| 53 | trans (transportf _ eq_refl (Sorted_cons Hl Hal)). | ||
| 54 | + apply Hind, IHl. | ||
| 55 | + symmetry. apply Hind, IHl. | ||
| 56 | Qed. | ||
| 57 | |||
| 58 | Instance Forall_pi {A} (P : A → Prop) (l : list A) `{!EqDecision A} `{!∀ a, ProofIrrel (P a)} : ProofIrrel (Forall P l). | ||
| 59 | Proof. | ||
| 60 | intros HF1 HF2. | ||
| 61 | assert (Hbase : ∀ xs (Hxs : [] = xs) (HF : Forall P xs), HF = transportf (Forall P) Hxs (ListDef.Forall_nil P)). | ||
| 62 | { intros xs Hxs HF. destruct HF; last done. | ||
| 63 | by replace Hxs with (eq_refl ([] : list A)); last apply eq_pi, list_eq_dec. } | ||
| 64 | assert (Hind : ∀ xs x xs' | ||
| 65 | (Hxs : x :: xs' = xs) (HF : Forall P xs) | ||
| 66 | (Hx : P x) (HF' : Forall P xs') | ||
| 67 | (IH : ∀ HF1' HF2' : Forall P xs', HF1' = HF2'), | ||
| 68 | HF = transportf _ Hxs (ListDef.Forall_cons P x xs' Hx HF')). | ||
| 69 | { intros. destruct HF; first done. | ||
| 70 | injection Hxs as <- <-. | ||
| 71 | replace Hxs with (eq_refl (x :: xs')); last apply eq_pi, list_eq_dec. | ||
| 72 | simpl. | ||
| 73 | replace p with Hx by apply H. | ||
| 74 | by replace HF with HF' by apply IH. } | ||
| 75 | induction l. | ||
| 76 | - trans (transportf _ eq_refl (ListDef.Forall_nil P)). | ||
| 77 | + apply Hbase. | ||
| 78 | + symmetry. apply Hbase. | ||
| 79 | - apply Forall_inv in HF1 as Ha. | ||
| 80 | apply Forall_inv_tail in HF1 as Hl. | ||
| 81 | trans (transportf _ eq_refl (ListDef.Forall_cons P a l Ha Hl)). | ||
| 82 | + apply Hind, IHl. | ||
| 83 | + symmetry. apply Hind, IHl. | ||
| 84 | Qed. | ||
| 85 | |||
| 86 | Instance ex_pi {A} {B : A → Prop} `{!ProofIrrel A} `{!∀ x, ProofIrrel (B x)} : | ||
| 87 | ProofIrrel (∃ (x : A), B x). | ||
| 88 | Proof. | ||
| 89 | intros [x Hx] [y Hy]. | ||
| 90 | assert (y = x) by apply proof_irrel. subst. | ||
| 91 | assert (Hx = Hy) by apply proof_irrel. by subst. | ||
| 92 | Qed. | ||