Rev | Line | |
---|
[698] | 1 | include "ASM/BitVectorTrie.ma". |
---|
[746] | 2 | include "ASM/Util.ma". |
---|
[491] | 3 | |
---|
| 4 | definition BitVectorTrieSet ≝ BitVectorTrie unit. |
---|
| 5 | |
---|
| 6 | let rec set_member (n: nat) (p: Vector bool n) (b: BitVectorTrieSet n) on p: bool ≝ |
---|
| 7 | (match p return λx. λ_. n = x → bool with |
---|
| 8 | [ VEmpty ⇒ |
---|
| 9 | ( match b return λx. λ_. x = 0 → bool with |
---|
| 10 | [ Leaf _ ⇒ λprf. true |
---|
| 11 | | Stub _ ⇒ λprf. false |
---|
| 12 | | _ ⇒ λabsd. ? |
---|
| 13 | ]) |
---|
| 14 | | VCons o hd tl ⇒ |
---|
| 15 | (match b return λx. λ_. x = S o → bool with |
---|
| 16 | [ Leaf _ ⇒ λabsd. ? |
---|
| 17 | | Stub _ ⇒ λprf. false |
---|
| 18 | | Node p l r ⇒ |
---|
| 19 | match hd with |
---|
| 20 | [ true ⇒ λprf: S p = S o. set_member o tl (r⌈p ↦ o⌉) |
---|
| 21 | | false ⇒ λprf: S p = S o. set_member o tl (l⌈p ↦ o⌉) |
---|
| 22 | ] |
---|
| 23 | ]) |
---|
| 24 | ]) (refl ? n). |
---|
| 25 | [3,4: |
---|
| 26 | @ injective_S |
---|
| 27 | assumption |
---|
| 28 | |1,2: |
---|
| 29 | destruct |
---|
| 30 | ] |
---|
| 31 | qed. |
---|
| 32 | |
---|
| 33 | let rec set_union (n: nat) (b: BitVectorTrieSet n) on b: BitVectorTrieSet n → BitVectorTrieSet n ≝ |
---|
| 34 | match b return λx. λ_. BitVectorTrieSet x → BitVectorTrieSet x with |
---|
| 35 | [ Stub _ ⇒ λc. c |
---|
| 36 | | Leaf l ⇒ λc. Leaf ? l |
---|
| 37 | | Node p l r ⇒ |
---|
| 38 | λc. |
---|
| 39 | (match c return λx. λ_. x = (S p) → BitVectorTrieSet (S p) with |
---|
| 40 | [ Node p' l' r' ⇒ λprf. Node ? ? (set_union ? l (l'⌈p' ↦ p⌉)) (set_union ? r (r'⌈p' ↦ p⌉)) |
---|
| 41 | | Stub _ ⇒ λprf. Node ? p l r |
---|
| 42 | | Leaf _ ⇒ λabsd. ? |
---|
| 43 | ] (refl ? (S p))) |
---|
| 44 | ]. |
---|
| 45 | [1: |
---|
| 46 | destruct(absd) |
---|
| 47 | |2,3: |
---|
| 48 | @ injective_S |
---|
| 49 | assumption |
---|
| 50 | ] |
---|
| 51 | qed. |
---|
| 52 | |
---|
[746] | 53 | let rec set_eq (n: nat) (b: BitVectorTrieSet n) (c: BitVectorTrieSet n) on b: bool ≝ |
---|
| 54 | match b return λh. λ_. n = h → bool with |
---|
| 55 | [ Stub s ⇒ |
---|
| 56 | match c with |
---|
| 57 | [ Stub s' ⇒ λ_. eq_nat s s' |
---|
| 58 | | _ ⇒ λ_. false |
---|
| 59 | ] |
---|
| 60 | | Leaf l ⇒ |
---|
| 61 | match c with |
---|
| 62 | [ Leaf l' ⇒ λ_. true (* dpm: l and l' both unit *) |
---|
| 63 | | _ ⇒ λ_. false |
---|
| 64 | ] |
---|
| 65 | | Node h l r ⇒ |
---|
| 66 | match c with |
---|
| 67 | [ Node h' l' r' ⇒ λprf. andb (set_eq h l ?) (set_eq h r ?) |
---|
| 68 | | _ ⇒ λ_. false |
---|
| 69 | ] |
---|
| 70 | ] (refl ? n). |
---|
| 71 | [ 1: @ r |
---|
| 72 | | 2: lapply (injective_S … prf) |
---|
| 73 | # H |
---|
| 74 | < H |
---|
| 75 | @ r' |
---|
| 76 | ] |
---|
| 77 | qed. |
---|
| 78 | |
---|
[491] | 79 | definition set_insert ≝ |
---|
| 80 | λn: nat. |
---|
| 81 | λb: BitVector n. |
---|
| 82 | λs: BitVectorTrieSet n. |
---|
| 83 | insert unit n b it s. |
---|
| 84 | |
---|
[746] | 85 | definition set_empty ≝ λn. Stub unit n. |
---|
| 86 | |
---|
| 87 | definition set_singleton ≝ |
---|
| 88 | λn: nat. |
---|
| 89 | λb: BitVector n. |
---|
| 90 | insert unit n b it (set_empty ?). |
---|
Note: See
TracBrowser
for help on using the repository browser.