From 58038d636d9f1225f8355c22102823e3168ad56c Mon Sep 17 00:00:00 2001 From: Helmut Grohne Date: Mon, 22 Oct 2012 11:05:34 +0200 Subject: now parameterize BFF And update Bidir and Precond, cause they import BFF. --- BFF.agda | 51 ++++++++++++++++++++++++++------------------------- Bidir.agda | 50 +++++++++++++++++++++++++------------------------- Precond.agda | 14 +++++++------- 3 files changed, 58 insertions(+), 57 deletions(-) diff --git a/BFF.agda b/BFF.agda index 612c2c3..b7502ce 100644 --- a/BFF.agda +++ b/BFF.agda @@ -6,6 +6,7 @@ open import Data.Maybe using (Maybe ; just ; nothing ; maybe′) open import Data.List using (List ; [] ; _∷_ ; map ; length) open import Data.Vec using (Vec ; toList ; fromList ; tabulate ; allFin) renaming (lookup to lookupV ; map to mapV ; [] to []V ; _∷_ to _∷V_) open import Function using (id ; _∘_ ; flip) +open import Relation.Binary.Core using (Decidable ; _≡_) open import FinMap open import CheckInsert @@ -17,43 +18,43 @@ _>>=_ = flip (flip maybe′ nothing) fmap : {A B : Set} → (A → B) → Maybe A → Maybe B fmap f = maybe′ (λ a → just (f a)) nothing -module ListBFF where +module ListBFF (Carrier : Set) (deq : Decidable {A = Carrier} _≡_) where open FreeTheorems.ListList public using (get-type) - assoc : {A : Set} {n : ℕ} → EqInst A → List (Fin n) → List A → Maybe (FinMapMaybe n A) - assoc _ [] [] = just empty - assoc eq (i ∷ is) (b ∷ bs) = (assoc eq is bs) >>= (checkInsert eq i b) - assoc _ _ _ = nothing + assoc : {n : ℕ} → List (Fin n) → List Carrier → Maybe (FinMapMaybe n Carrier) + assoc [] [] = just empty + assoc (i ∷ is) (b ∷ bs) = (assoc is bs) >>= (checkInsert deq i b) + assoc _ _ = nothing - enumerate : {A : Set} → (l : List A) → List (Fin (length l)) + enumerate : (l : List Carrier) → List (Fin (length l)) enumerate l = toList (tabulate id) - denumerate : {A : Set} (l : List A) → Fin (length l) → A + denumerate : (l : List Carrier) → Fin (length l) → Carrier denumerate l = flip lookupV (fromList l) - bff : get-type → ({B : Set} → EqInst B → List B → List B → Maybe (List B)) - bff get eq s v = let s′ = enumerate s - g = fromFunc (denumerate s) - h = assoc eq (get s′) v - h′ = fmap (flip union g) h - in fmap (flip map s′ ∘ flip lookup) h′ + bff : get-type → (List Carrier → List Carrier → Maybe (List Carrier)) + bff get s v = let s′ = enumerate s + g = fromFunc (denumerate s) + h = assoc (get s′) v + h′ = fmap (flip union g) h + in fmap (flip map s′ ∘ flip lookup) h′ -module VecBFF where +module VecBFF (Carrier : Set) (deq : Decidable {A = Carrier} _≡_) where open FreeTheorems.VecVec public using (get-type) - assoc : {A : Set} {n m : ℕ} → EqInst A → Vec (Fin n) m → Vec A m → Maybe (FinMapMaybe n A) - assoc _ []V []V = just empty - assoc eq (i ∷V is) (b ∷V bs) = (assoc eq is bs) >>= (checkInsert eq i b) + assoc : {n m : ℕ} → Vec (Fin n) m → Vec Carrier m → Maybe (FinMapMaybe n Carrier) + assoc []V []V = just empty + assoc (i ∷V is) (b ∷V bs) = (assoc is bs) >>= (checkInsert deq i b) - enumerate : {A : Set} {n : ℕ} → Vec A n → Vec (Fin n) n + enumerate : {n : ℕ} → Vec Carrier n → Vec (Fin n) n enumerate _ = tabulate id - denumerate : {A : Set} {n : ℕ} → Vec A n → Fin n → A + denumerate : {n : ℕ} → Vec Carrier n → Fin n → Carrier denumerate = flip lookupV - bff : {getlen : ℕ → ℕ} → (get-type getlen) → ({B : Set} {n : ℕ} → EqInst B → Vec B n → Vec B (getlen n) → Maybe (Vec B n)) - bff get eq s v = let s′ = enumerate s - g = fromFunc (denumerate s) - h = assoc eq (get s′) v - h′ = fmap (flip union g) h - in fmap (flip mapV s′ ∘ flip lookupV) h′ + bff : {getlen : ℕ → ℕ} → (get-type getlen) → ({n : ℕ} → Vec Carrier n → Vec Carrier (getlen n) → Maybe (Vec Carrier n)) + bff get s v = let s′ = enumerate s + g = fromFunc (denumerate s) + h = assoc (get s′) v + h′ = fmap (flip union g) h + in fmap (flip mapV s′ ∘ flip lookupV) h′ diff --git a/Bidir.agda b/Bidir.agda index c3e3273..1b68e60 100644 --- a/Bidir.agda +++ b/Bidir.agda @@ -26,14 +26,14 @@ open FreeTheorems.VecVec using (get-type ; free-theorem) open import FinMap open import CheckInsert open import BFF using (_>>=_ ; fmap) -open BFF.VecBFF using (assoc ; enumerate ; denumerate ; bff) +open BFF.VecBFF Carrier deq using (assoc ; enumerate ; denumerate ; bff) -lemma-1 : {m n : ℕ} → (f : Fin n → Carrier) → (is : Vec (Fin n) m) → assoc deq is (map f is) ≡ just (restrict f (toList is)) +lemma-1 : {m n : ℕ} → (f : Fin n → Carrier) → (is : Vec (Fin n) m) → assoc is (map f is) ≡ just (restrict f (toList is)) lemma-1 f [] = refl lemma-1 f (i ∷ is′) = begin - assoc deq (i ∷ is′) (map f (i ∷ is′)) + assoc (i ∷ is′) (map f (i ∷ is′)) ≡⟨ refl ⟩ - assoc deq is′ (map f is′) >>= checkInsert deq i (f i) + assoc is′ (map f is′) >>= checkInsert deq i (f i) ≡⟨ cong (λ m → m >>= checkInsert deq i (f i)) (lemma-1 f is′) ⟩ just (restrict f (toList is′)) >>= (checkInsert deq i (f i)) ≡⟨ refl ⟩ @@ -41,8 +41,8 @@ lemma-1 f (i ∷ is′) = begin ≡⟨ lemma-checkInsert-restrict deq f i (toList is′) ⟩ just (restrict f (toList (i ∷ is′))) ∎ -lemma-lookupM-assoc : {m n : ℕ} → (i : Fin n) → (is : Vec (Fin n) m) → (x : Carrier) → (xs : Vec Carrier m) → (h : FinMapMaybe n Carrier) → assoc deq (i ∷ is) (x ∷ xs) ≡ just h → lookupM i h ≡ just x -lemma-lookupM-assoc i is x xs h p with assoc deq is xs +lemma-lookupM-assoc : {m n : ℕ} → (i : Fin n) → (is : Vec (Fin n) m) → (x : Carrier) → (xs : Vec Carrier m) → (h : FinMapMaybe n Carrier) → assoc (i ∷ is) (x ∷ xs) ≡ just h → lookupM i h ≡ just x +lemma-lookupM-assoc i is x xs h p with assoc is xs lemma-lookupM-assoc i is x xs h () | nothing lemma-lookupM-assoc i is x xs h p | just h' = apply-checkInsertProof deq i x h' record { same = λ lookupM≡justx → begin @@ -60,14 +60,14 @@ lemma-lookupM-assoc i is x xs h p | just h' = apply-checkInsertProof deq i x ; wrong = λ x' x≢x' lookupM≡justx' → lemma-just≢nothing (trans (sym p) (lemma-checkInsert-wrong deq i x h' x' x≢x' lookupM≡justx')) } -lemma-∉-lookupM-assoc : {m n : ℕ} → (i : Fin n) → (is : Vec (Fin n) m) → (xs : Vec Carrier m) → (h : FinMapMaybe n Carrier) → assoc deq is xs ≡ just h → (i ∉ toList is) → lookupM i h ≡ nothing +lemma-∉-lookupM-assoc : {m n : ℕ} → (i : Fin n) → (is : Vec (Fin n) m) → (xs : Vec Carrier m) → (h : FinMapMaybe n Carrier) → assoc is xs ≡ just h → (i ∉ toList is) → lookupM i h ≡ nothing lemma-∉-lookupM-assoc i [] [] h ph i∉is = begin lookupM i h ≡⟨ cong (lookupM i) (sym (lemma-from-just ph)) ⟩ lookupM i empty ≡⟨ lemma-lookupM-empty i ⟩ nothing ∎ -lemma-∉-lookupM-assoc i (i' ∷ is') (x' ∷ xs') h ph i∉is with assoc deq is' xs' | inspect (assoc deq is') xs' +lemma-∉-lookupM-assoc i (i' ∷ is') (x' ∷ xs') h ph i∉is with assoc is' xs' | inspect (assoc is') xs' lemma-∉-lookupM-assoc i (i' ∷ is') (x' ∷ xs') h () i∉is | nothing | [ ph' ] lemma-∉-lookupM-assoc i (i' ∷ is') (x' ∷ xs') h ph i∉is | just h' | [ ph' ] = apply-checkInsertProof deq i' x' h' record { same = λ lookupM-i'-h'≡just-x' → begin @@ -90,9 +90,9 @@ lemma-∉-lookupM-assoc i (i' ∷ is') (x' ∷ xs') h ph i∉is | just h' | [ ph _in-domain-of_ : {n : ℕ} {A : Set} → (is : List (Fin n)) → (FinMapMaybe n A) → Set _in-domain-of_ is h = All (λ i → ∃ λ x → lookupM i h ≡ just x) is -lemma-assoc-domain : {m n : ℕ} → (is : Vec (Fin n) m) → (xs : Vec Carrier m) → (h : FinMapMaybe n Carrier) → assoc deq is xs ≡ just h → (toList is) in-domain-of h +lemma-assoc-domain : {m n : ℕ} → (is : Vec (Fin n) m) → (xs : Vec Carrier m) → (h : FinMapMaybe n Carrier) → assoc is xs ≡ just h → (toList is) in-domain-of h lemma-assoc-domain [] [] h ph = Data.List.All.[] -lemma-assoc-domain (i' ∷ is') (x' ∷ xs') h ph with assoc deq is' xs' | inspect (assoc deq is') xs' +lemma-assoc-domain (i' ∷ is') (x' ∷ xs') h ph with assoc is' xs' | inspect (assoc is') xs' lemma-assoc-domain (i' ∷ is') (x' ∷ xs') h () | nothing | [ ph' ] lemma-assoc-domain (i' ∷ is') (x' ∷ xs') h ph | just h' | [ ph' ] = apply-checkInsertProof deq i' x' h' record { same = λ lookupM-i'-h'≡just-x' → Data.List.All._∷_ @@ -115,7 +115,7 @@ lemma-map-lookupM-insert i (i' ∷ is') x h i∉is ph = begin ≡⟨ cong (_∷_ (lookupM i' h)) (lemma-map-lookupM-insert i is' x h (i∉is ∘ there) (Data.List.All.tail ph)) ⟩ lookupM i' h ∷ map (flip lookupM h) is' ∎ -lemma-map-lookupM-assoc : {m n : ℕ} → (i : Fin n) → (is : Vec (Fin n) m) → (x : Carrier) → (xs : Vec Carrier m) → (h : FinMapMaybe n Carrier) → (h' : FinMapMaybe n Carrier) → assoc deq is xs ≡ just h' → checkInsert deq i x h' ≡ just h → map (flip lookupM h) is ≡ map (flip lookupM h') is +lemma-map-lookupM-assoc : {m n : ℕ} → (i : Fin n) → (is : Vec (Fin n) m) → (x : Carrier) → (xs : Vec Carrier m) → (h : FinMapMaybe n Carrier) → (h' : FinMapMaybe n Carrier) → assoc is xs ≡ just h' → checkInsert deq i x h' ≡ just h → map (flip lookupM h) is ≡ map (flip lookupM h') is lemma-map-lookupM-assoc i [] x [] h h' ph' ph = refl lemma-map-lookupM-assoc i (i' ∷ is') x (x' ∷ xs') h h' ph' ph with any (_≟_ i) (toList (i' ∷ is')) lemma-map-lookupM-assoc i (i' ∷ is') x (x' ∷ xs') h h' ph' ph | yes p with Data.List.All.lookup (lemma-assoc-domain (i' ∷ is') (x' ∷ xs') h' ph') p @@ -130,16 +130,16 @@ lemma-map-lookupM-assoc i (i' ∷ is') x (x' ∷ xs') h h' ph' ph | no ¬p rewri ≡⟨ lemma-map-lookupM-insert i (i' ∷ is') x h' ¬p (lemma-assoc-domain (i' ∷ is') (x' ∷ xs') h' ph') ⟩ map (flip lookupM h') (i' ∷ is') ∎ -lemma-2 : {m n : ℕ} → (is : Vec (Fin n) m) → (v : Vec Carrier m) → (h : FinMapMaybe n Carrier) → assoc deq is v ≡ just h → map (flip lookupM h) is ≡ map just v +lemma-2 : {m n : ℕ} → (is : Vec (Fin n) m) → (v : Vec Carrier m) → (h : FinMapMaybe n Carrier) → assoc is v ≡ just h → map (flip lookupM h) is ≡ map just v lemma-2 [] [] h p = refl -lemma-2 (i ∷ is) (x ∷ xs) h p with assoc deq is xs | inspect (assoc deq is) xs +lemma-2 (i ∷ is) (x ∷ xs) h p with assoc is xs | inspect (assoc is) xs lemma-2 (i ∷ is) (x ∷ xs) h () | nothing | _ lemma-2 (i ∷ is) (x ∷ xs) h p | just h' | [ ir ] = begin map (flip lookupM h) (i ∷ is) ≡⟨ refl ⟩ lookupM i h ∷ map (flip lookupM h) is ≡⟨ cong (flip _∷_ (map (flip lookupM h) is)) (lemma-lookupM-assoc i is x xs h (begin - assoc deq (i ∷ is) (x ∷ xs) + assoc (i ∷ is) (x ∷ xs) ≡⟨ cong (flip _>>=_ (checkInsert deq i x)) ir ⟩ checkInsert deq i x h' ≡⟨ p ⟩ @@ -152,7 +152,7 @@ lemma-2 (i ∷ is) (x ∷ xs) h p | just h' | [ ir ] = begin ≡⟨ refl ⟩ map just (x ∷ xs) ∎ -lemma-map-denumerate-enumerate : {m : ℕ} {A : Set} → (as : Vec A m) → map (denumerate as) (enumerate as) ≡ as +lemma-map-denumerate-enumerate : {m : ℕ} → (as : Vec Carrier m) → map (denumerate as) (enumerate as) ≡ as lemma-map-denumerate-enumerate [] = refl lemma-map-denumerate-enumerate (a ∷ as) = cong (_∷_ a) (begin map (flip lookupVec (a ∷ as)) (tabulate Fin.suc) @@ -167,15 +167,15 @@ lemma-map-denumerate-enumerate (a ∷ as) = cong (_∷_ a) (begin ≡⟨ lemma-map-denumerate-enumerate as ⟩ as ∎) -theorem-1 : {getlen : ℕ → ℕ} → (get : get-type getlen) → {m : ℕ} → (s : Vec Carrier m) → bff get deq s (get s) ≡ just s +theorem-1 : {getlen : ℕ → ℕ} → (get : get-type getlen) → {m : ℕ} → (s : Vec Carrier m) → bff get s (get s) ≡ just s theorem-1 get s = begin - bff get deq s (get s) - ≡⟨ cong (bff get deq s ∘ get) (sym (lemma-map-denumerate-enumerate s)) ⟩ - bff get deq s (get (map (denumerate s) (enumerate s))) - ≡⟨ cong (bff get deq s) (free-theorem get (denumerate s) (enumerate s)) ⟩ - bff get deq s (map (denumerate s) (get (enumerate s))) + bff get s (get s) + ≡⟨ cong (bff get s ∘ get) (sym (lemma-map-denumerate-enumerate s)) ⟩ + bff get s (get (map (denumerate s) (enumerate s))) + ≡⟨ cong (bff get s) (free-theorem get (denumerate s) (enumerate s)) ⟩ + bff get s (map (denumerate s) (get (enumerate s))) ≡⟨ refl ⟩ - fmap (flip map (enumerate s) ∘ flip lookup) (fmap (flip union (fromFunc (denumerate s))) (assoc deq (get (enumerate s)) (map (denumerate s) (get (enumerate s))))) + fmap (flip map (enumerate s) ∘ flip lookup) (fmap (flip union (fromFunc (denumerate s))) (assoc (get (enumerate s)) (map (denumerate s) (get (enumerate s))))) ≡⟨ cong (fmap (flip map (enumerate s) ∘ flip lookup) ∘ fmap (flip union (fromFunc (denumerate s)))) (lemma-1 (denumerate s) (get (enumerate s))) ⟩ fmap (flip map (enumerate s) ∘ flip lookup) (fmap (flip union (fromFunc (flip lookupVec s))) (just (restrict (denumerate s) (toList (get (enumerate s)))))) ≡⟨ refl ⟩ @@ -220,8 +220,8 @@ lemma-union-not-used h h' (i ∷ is') p | x , lookupM-i-h≡just-x = begin ≡⟨ cong (_∷_ (lookupM i h)) (lemma-union-not-used h h' is' (Data.List.All.tail p)) ⟩ lookupM i h ∷ map (flip lookupM h) is' ∎ -theorem-2 : {getlen : ℕ → ℕ} (get : get-type getlen) → {m : ℕ} → (v : Vec Carrier (getlen m)) → (s u : Vec Carrier m) → bff get deq s v ≡ just u → get u ≡ v -theorem-2 get v s u p with lemma-fmap-just (assoc deq (get (enumerate s)) v) (proj₂ (lemma-fmap-just (fmap (flip union (fromFunc (denumerate s))) (assoc deq (get (enumerate s)) v)) p)) +theorem-2 : {getlen : ℕ → ℕ} (get : get-type getlen) → {m : ℕ} → (v : Vec Carrier (getlen m)) → (s u : Vec Carrier m) → bff get s v ≡ just u → get u ≡ v +theorem-2 get v s u p with lemma-fmap-just (assoc (get (enumerate s)) v) (proj₂ (lemma-fmap-just (fmap (flip union (fromFunc (denumerate s))) (assoc (get (enumerate s)) v)) p)) theorem-2 get v s u p | h , ph = begin get u ≡⟨ lemma-from-just (begin @@ -229,7 +229,7 @@ theorem-2 get v s u p | h , ph = begin ≡⟨ refl ⟩ fmap get (just u) ≡⟨ cong (fmap get) (sym p) ⟩ - fmap get (bff get deq s v) + fmap get (bff get s v) ≡⟨ cong (fmap get ∘ fmap (flip map (enumerate s) ∘ flip lookup) ∘ fmap (flip union (fromFunc (denumerate s)))) ph ⟩ fmap get (fmap (flip map (enumerate s) ∘ flip lookup) (fmap (flip union (fromFunc (denumerate s))) (just h))) ≡⟨ refl ⟩ diff --git a/Precond.agda b/Precond.agda index 7976b0a..5011e41 100644 --- a/Precond.agda +++ b/Precond.agda @@ -20,13 +20,13 @@ open import BFF using (fmap ; _>>=_) import Bidir open Bidir Carrier deq using (lemma-∉-lookupM-assoc) -open BFF.VecBFF using (get-type ; assoc ; enumerate ; denumerate ; bff) +open BFF.VecBFF Carrier deq using (get-type ; assoc ; enumerate ; denumerate ; bff) -assoc-enough : {getlen : ℕ → ℕ} (get : get-type getlen) → {m : ℕ} → (s : Vec Carrier m) → (v : Vec Carrier (getlen m)) → (h : FinMapMaybe m Carrier) → assoc deq (get (enumerate s)) v ≡ just h → ∃ λ u → bff get deq s v ≡ just u +assoc-enough : {getlen : ℕ → ℕ} (get : get-type getlen) → {m : ℕ} → (s : Vec Carrier m) → (v : Vec Carrier (getlen m)) → (h : FinMapMaybe m Carrier) → assoc (get (enumerate s)) v ≡ just h → ∃ λ u → bff get s v ≡ just u assoc-enough get {m} s v h p = map (flip lookup (union h g)) s′ , (begin - bff get deq s v + bff get s v ≡⟨ refl ⟩ - fmap (flip map s′ ∘ flip lookup) (fmap (flip union g) (assoc deq (get s′) v)) + fmap (flip map s′ ∘ flip lookup) (fmap (flip union g) (assoc (get s′) v)) ≡⟨ cong (fmap (flip map s′ ∘ flip lookup)) (cong (fmap (flip union g)) p) ⟩ fmap (flip map s′ ∘ flip lookup) (fmap (flip union g) (just h)) ≡⟨ refl ⟩ @@ -61,13 +61,13 @@ different-∉ x [] p () different-∉ x (y ∷ ys) p (here px) = p zero (suc zero) (λ ()) px different-∉ x (y ∷ ys) p (there pxs) = different-∉ x ys (different-drop y (x ∷ ys) (different-swap x y ys p)) pxs -different-assoc : {m n : ℕ} → (u : Vec (Fin n) m) → (v : Vec Carrier m) → all-different u → ∃ λ h → assoc deq u v ≡ just h +different-assoc : {m n : ℕ} → (u : Vec (Fin n) m) → (v : Vec Carrier m) → all-different u → ∃ λ h → assoc u v ≡ just h different-assoc [] [] p = empty , refl different-assoc (u ∷ us) (v ∷ vs) p with different-assoc us vs (λ i j i≢j → p (suc i) (suc j) (i≢j ∘ suc-injective)) different-assoc (u ∷ us) (v ∷ vs) p | h , p' = insert u v h , (begin - assoc deq (u ∷ us) (v ∷ vs) + assoc (u ∷ us) (v ∷ vs) ≡⟨ refl ⟩ - assoc deq us vs >>= checkInsert deq u v + assoc us vs >>= checkInsert deq u v ≡⟨ cong (flip _>>=_ (checkInsert deq u v)) p' ⟩ checkInsert deq u v h ≡⟨ lemma-checkInsert-new deq u v h (lemma-∉-lookupM-assoc u us vs h p' (different-∉ u us p)) ⟩ -- cgit v1.2.3