Merge branch feature-partial-getlen into master
authorHelmut Grohne <grohne@cs.uni-bonn.de>
Mon, 17 Feb 2014 10:04:51 +0000 (11:04 +0100)
committerHelmut Grohne <grohne@cs.uni-bonn.de>
Mon, 17 Feb 2014 10:17:01 +0000 (11:17 +0100)
It allows defining get functions that are only defined for some vector
lengths. It retains backwards compatibility with the previous state via
a VecVec compatibility module. The biggest benefit is that now standard
library functions such as tail, take and drop can be passed to bff.

Conflicts: heavy
BFF.agda (imports, bff type clash)
Bidir.agda (imports, heavy bff type clash in theorem-{1,2} and
                    lemma-get-mapMV)
Generic.agda (imports)
Precond.agda (imports, bff type clash in assoc-enough)

1  2 
BFF.agda
Bidir.agda
Generic.agda
Precond.agda

diff --cc BFF.agda
+++ b/BFF.agda
@@@ -36,12 -33,22 +36,22 @@@ module PartialVecBFF (A : DecSetoid ℓ
    denumerate : {n : ℕ} → Vec Carrier n → Fin n → Carrier
    denumerate = flip lookupV
  
-   bff : (G : Get) → {n : ℕ} → (m : ℕ) → Vec Carrier n → Vec Carrier (Get.getlen G m) → Maybe (Vec Carrier m)
-   bff G m s v = let s′ = enumerate s
 -
 -  bff : (G : Get) → ({i : Get.|I| G} → Vec Carrier (Get.|gl₁| G i) → Vec Carrier (Get.|gl₂| G i) → Maybe (Vec Carrier (Get.|gl₁| G i)))
 -  bff G s v = let   s′ = enumerate s
++  bff : (G : Get) → {i : Get.|I| G} → (j : Get.|I| G) → Vec Carrier (Get.|gl₁| G i) → Vec Carrier (Get.|gl₂| G j) → Maybe (Vec Carrier (Get.|gl₁| G j))
++  bff G i s v = let s′ = enumerate s
                      t′ = Get.get G s′
                      g  = fromFunc (denumerate s)
                      g′ = delete-many t′ g
-                     t  = enumeratel m
 -                    h  = assoc t′ v
 -                    h′ = (flip union g′) <$> h
 -                in h′ >>= flip mapMV s′ ∘ flip lookupV
++                    t  = enumeratel (Get.|gl₁| G i)
 +                    h  = assoc (Get.get G t) v
-                     h′ = (flip union (reshape g′ m)) <$> h
++                    h′ = (flip union (reshape g′ (Get.|gl₁| G i))) <$> h
 +                in h′ >>= flip mapMV t ∘ flip lookupM
+ module VecBFF (A : DecSetoid ℓ₀ ℓ₀) where
+   open GetTypes.VecVec public using (Get)
+   open module A = DecSetoid A using (Carrier) renaming (_≟_ to deq)
+   open CheckInsert A
+   open PartialVecBFF A public using (assoc ; enumerate ; denumerate)
 -  bff : (G : Get) → ({n : ℕ} → Vec Carrier n → Vec Carrier (Get.getlen G n) → Maybe (Vec Carrier n))
++  bff : (G : Get) → {n : ℕ} → (m : ℕ) → Vec Carrier n → Vec Carrier (Get.getlen G m) → Maybe (Vec Carrier m)
+   bff G = PartialVecBFF.bff A (VecVec-to-PartialVecVec G)
diff --cc Bidir.agda
@@@ -31,7 -31,7 +31,7 @@@ open import FinMa
  import CheckInsert
  open CheckInsert A
  import BFF
- open BFF.VecBFF A using (assoc ; enumerate ; enumeratel ; denumerate ; bff)
 -open BFF.PartialVecBFF A using (assoc ; enumerate ; denumerate ; bff)
++open BFF.PartialVecBFF A using (assoc ; enumerate ; enumeratel ; denumerate ; bff)
  open Setoid using () renaming (_≈_ to _∋_≈_)
  open module A = DecSetoid A using (Carrier) renaming (_≟_ to deq)
  
@@@ -125,20 -125,18 +125,20 @@@ lemma-map-denumerate-enumerate (a ∷ a
    as ∎)
    where open ≡-Reasoning
  
- theorem-1 : (G : Get) → {m : ℕ} → (s : Vec Carrier m) → bff G m s (Get.get G s) ≡ just s
- theorem-1 G {m} s = begin
-   bff G m s (get s)
-     ≡⟨ cong (bff G m s ∘ get) (sym (lemma-map-denumerate-enumerate s)) ⟩
-   bff G m s (get (map (denumerate s) (enumerate s)))
-     ≡⟨ cong (bff G m s) (free-theorem (denumerate s) (enumerate s)) ⟩
-   bff G m s (map (denumerate s) (get (enumerate s)))
 -theorem-1 : (G : Get) → {i : Get.|I| G} → (s : Vec Carrier (Get.|gl₁| G i)) → bff G s (Get.get G s) ≡ just s
 -theorem-1 G s = begin
 -  bff G s (get s)
 -    ≡⟨ cong (bff G s ∘ get) (sym (lemma-map-denumerate-enumerate s)) ⟩
 -  bff G s (get (map (denumerate s) (enumerate s)))
 -    ≡⟨ cong (bff G s) (free-theorem (denumerate s) (enumerate s)) ⟩
 -  bff G s (map (denumerate s) (get (enumerate s)))
++theorem-1 : (G : Get) → {i : Get.|I| G} → (s : Vec Carrier (Get.|gl₁| G i)) → bff G i s (Get.get G s) ≡ just s
++theorem-1 G {i} s = begin
++  bff G i s (get s)
++    ≡⟨ cong (bff G i s ∘ get) (sym (lemma-map-denumerate-enumerate s)) ⟩
++  bff G i s (get (map (denumerate s) (enumerate s)))
++    ≡⟨ cong (bff G i s) (free-theorem (denumerate s) (enumerate s)) ⟩
++  bff G i s (map (denumerate s) (get (enumerate s)))
      ≡⟨ refl ⟩
    (h′↦r ∘ h↦h′) (assoc (get (enumerate s)) (map (denumerate s) (get (enumerate s))))
      ≡⟨ cong (h′↦r ∘ h↦h′) (lemma-1 (denumerate s) (get (enumerate s))) ⟩
    (h′↦r ∘ h↦h′ ∘ just) (restrict (denumerate s) (toList (get (enumerate s))))
      ≡⟨ refl ⟩
-   (h′↦r ∘ just) (union (restrict (denumerate s) (toList (get (enumerate s)))) (reshape (delete-many (get (enumerate s)) (fromFunc (denumerate s))) m))
++  (h′↦r ∘ just) (union (restrict (denumerate s) (toList (get (enumerate s)))) (reshape (delete-many (get (enumerate s)) (fromFunc (denumerate s))) (Get.|gl₁| G i)))
 +    ≡⟨ cong (h′↦r ∘ Maybe.just ∘ union (restrict (denumerate s) (toList (get (enumerate s))))) (lemma-reshape-id (delete-many (get (enumerate s)) (fromFunc (denumerate s)))) ⟩
    (h′↦r ∘ just) (union (restrict (denumerate s) (toList (get (enumerate s)))) (delete-many (get (enumerate s)) (fromFunc (denumerate s))))
      ≡⟨ cong (h′↦r ∘ just) (lemma-disjoint-union (denumerate s) (get (enumerate s))) ⟩
    (h′↦r ∘ just) (fromFunc (denumerate s))
    just s ∎
      where open ≡-Reasoning
            open Get G
-           h↦h′ = _<$>_ (flip union (reshape (delete-many (get (enumerate s)) (fromFunc (denumerate s))) m))
 -          h↦h′ = _<$>_ (flip union (delete-many (get (enumerate s)) (fromFunc (denumerate s))))
 -          h′↦r = flip _>>=_ (flip mapMV (enumerate s) ∘ flip lookupVec)
++          h↦h′ = _<$>_ (flip union (reshape (delete-many (get (enumerate s)) (fromFunc (denumerate s))) (Get.|gl₁| G i)))
 +          h′↦r = flip _>>=_ (flip mapMV (enumerate s) ∘ flip lookupM)
  
  
  lemma-<$>-just : {A B : Set} {f : A → B} {b : B} (ma : Maybe A) → f <$> ma ≡ just b → ∃ λ a → ma ≡ just a
@@@ -189,9 -189,8 +189,8 @@@ lemma-mapM-successful         (x ∷ xs
  lemma-mapM-successful         (x ∷ xs) p  | just y | just ys | [ p′ ] with lemma-mapM-successful xs p′
  lemma-mapM-successful         (x ∷ xs) p  | just y | just ys | [ p′ ] | w , pw = y ∷ w , cong (_∷_ (just y)) pw
  
- lemma-get-mapMV : {A B : Set} {f : A → Maybe B} {n : ℕ} {v : Vec A n} {r : Vec B n} → mapMV f v ≡ just r → (get : Get) → Get.get get <$> mapMV f v ≡ mapMV f (Get.get get v)
- lemma-get-mapMV {f = f} {v = v} p G = begin
+ lemma-get-mapMV : {A B : Set} {f : A → Maybe B} → (G : Get) → {i : Get.|I| G} {v : Vec A (Get.|gl₁| G i)} {r : Vec B (Get.|gl₁| G i)} → mapMV f v ≡ just r → Get.get G <$> mapMV f v ≡ mapMV f (Get.get G v)
 -lemma-get-mapMV {f = f} G {v = v} p = let w , pw = lemma-mapM-successful v p in begin
++lemma-get-mapMV {f = f} G {v = v} p = begin
    get <$> mapMV f v
      ≡⟨ cong (_<$>_ get) (sym (sequence-map f v)) ⟩
    get <$> (sequenceV (map f v))
  
  sequence-cong : {S : Setoid ℓ₀ ℓ₀} {n : ℕ} {m₁ m₂ : Setoid.Carrier (VecISetoid (MaybeSetoid S) at n)} → VecISetoid (MaybeSetoid S) at _ ∋ m₁ ≈ m₂ → MaybeSetoid (VecISetoid S at n) ∋ sequenceV m₁ ≈ sequenceV m₂
  sequence-cong {S}                                       VecEq.[]-cong = Setoid.refl (MaybeSetoid (VecISetoid S at _))
 -sequence-cong {S} {m₁ = just x ∷ xs} {m₂ = just y ∷ ys} (just x≈y VecEq.∷-cong xs≈ys) with sequenceV xs | sequenceV ys | sequence-cong xs≈ys
 -sequence-cong {S} {m₁ = just x ∷ xs} {m₂ = just y ∷ ys} (just x≈y VecEq.∷-cong xs≈ys) | just sxs | just sys | just p = MaybeEq.just (x≈y VecEq.∷-cong p)
 -sequence-cong {S} {m₁ = just x ∷ xs} {m₂ = just y ∷ ys} (just x≈y VecEq.∷-cong xs≈ys) | nothing | nothing | nothing = Setoid.refl (MaybeSetoid (VecISetoid S at _))
 -sequence-cong {S}                                       (nothing VecEq.∷-cong xs≈ys) = Setoid.refl (MaybeSetoid (VecISetoid S at _))
 -
 -theorem-2 : (G : Get) → {i : Get.|I| G} → (v : Vec Carrier (Get.|gl₂| G i)) → (s u : Vec Carrier (Get.|gl₁| G i)) → bff G s v ≡ just u → VecISetoid A.setoid at _ ∋ Get.get G u ≈ v
 -theorem-2 G v s u p with (lemma->>=-just ((flip union (delete-many (Get.get G (enumerate s)) (fromFunc (denumerate s)))) <$> (assoc (Get.get G (enumerate s)) v)) p)
 -theorem-2 G v s u p | h′ , ph′ with (lemma-<$>-just (assoc (Get.get G (enumerate s)) v) ph′)
 -theorem-2 G v s u p | h′ , ph′ | h , ph = drop-just (begin⟨ MaybeSetoid (VecISetoid A.setoid at _) ⟩
 +sequence-cong {S} {m₁ = just x ∷ xs} {m₂ = just y ∷ ys} (VecEq._∷-cong_ (just x≈y) xs≈ys) with sequenceV xs | sequenceV ys | sequence-cong xs≈ys
 +sequence-cong {S} {m₁ = just x ∷ xs} {m₂ = just y ∷ ys} (VecEq._∷-cong_ (just x≈y) xs≈ys) | just sxs | just sys | just p = MaybeEq.just (VecEq._∷-cong_ x≈y p)
 +sequence-cong {S} {m₁ = just x ∷ xs} {m₂ = just y ∷ ys} (VecEq._∷-cong_ (just x≈y) xs≈ys) | nothing | just sys | ()
 +sequence-cong {S} {m₁ = just x ∷ xs} {m₂ = just y ∷ ys} (VecEq._∷-cong_ (just x≈y) xs≈ys) | just sxs | nothing | ()
 +sequence-cong {S} {m₁ = just x ∷ xs} {m₂ = just y ∷ ys} (VecEq._∷-cong_ (just x≈y) xs≈ys) | nothing | nothing | nothing = Setoid.refl (MaybeSetoid (VecISetoid S at _))
 +sequence-cong {S}                                       (VecEq._∷-cong_ nothing xs≈ys) = Setoid.refl (MaybeSetoid (VecISetoid S at _))
 +
- theorem-2 : (G : Get) → {m : ℕ} → (n : ℕ) → (s : Vec Carrier m) → (v : Vec Carrier (Get.getlen G n)) → (u : Vec Carrier n) → bff G n s v ≡ just u → VecISetoid A.setoid at _ ∋ Get.get G u ≈ v
- theorem-2 G n s v u p with (lemma->>=-just ((flip union (reshape (delete-many (Get.get G (enumerate s)) (fromFunc (denumerate s))) n)) <$> (assoc (Get.get G (enumeratel n)) v)) p)
- theorem-2 G n s v u p | h′ , ph′ with (lemma-<$>-just (assoc (Get.get G (enumeratel n)) v) ph′)
- theorem-2 G n s v u p | h′ , ph′ | h , ph = drop-just (begin⟨ MaybeSetoid (VecISetoid A.setoid at _) ⟩
++theorem-2 : (G : Get) → {i : Get.|I| G} → (j : Get.|I| G) → (s : Vec Carrier (Get.|gl₁| G i)) → (v : Vec Carrier (Get.|gl₂| G j)) → (u : Vec Carrier (Get.|gl₁| G j)) → bff G j s v ≡ just u → VecISetoid A.setoid at _ ∋ Get.get G u ≈ v
++theorem-2 G j s v u p with (lemma->>=-just ((flip union (reshape (delete-many (Get.get G (enumerate s)) (fromFunc (denumerate s))) (Get.|gl₁| G j))) <$> (assoc (Get.get G (enumeratel (Get.|gl₁| G j))) v)) p)
++theorem-2 G j s v u p | h′ , ph′ with (lemma-<$>-just (assoc (Get.get G (enumeratel (Get.|gl₁| G j))) v) ph′)
++theorem-2 G j s v u p | h′ , ph′ | h , ph = drop-just (begin⟨ MaybeSetoid (VecISetoid A.setoid at _) ⟩
    get <$> (just u)
      ≡⟨ cong (_<$>_ get) (sym p) ⟩
-   get <$> (bff G n s v)
 -  get <$> (bff G s v)
++  get <$> (bff G j s v)
      ≡⟨ cong (_<$>_ get ∘ flip _>>=_ h′↦r ∘ _<$>_ h↦h′) ph ⟩
 -  get <$> mapMV (flip lookupM (h↦h′ h)) s′
 +  get <$> mapMV (flip lookupM (h↦h′ h)) t
-     ≡⟨ lemma-get-mapMV (trans (cong (flip _>>=_ h′↦r ∘ _<$>_ h↦h′) (sym ph)) p) G ⟩
+     ≡⟨ lemma-get-mapMV G (trans (cong (flip _>>=_ h′↦r ∘ _<$>_ h↦h′) (sym ph)) p) ⟩
 -  mapMV (flip lookupM (h↦h′ h)) (get s′)
 -    ≡⟨ sym (sequence-map (flip lookupM (h↦h′ h)) (get s′)) ⟩
 -  sequenceV (map (flip lookupM (h↦h′ h)) (get s′))
 -    ≡⟨ cong sequenceV (lemma-union-not-used h g′ (get s′) (lemma-assoc-domain (get s′) v h ph)) ⟩
 -  sequenceV (map (flip lookupM h) (get s′))
 -    ≈⟨ sequence-cong (lemma-2 (get s′) v h ph) ⟩
 +  mapMV (flip lookupM (h↦h′ h)) (get t)
 +    ≡⟨ sym (sequence-map (flip lookupM (h↦h′ h)) (get t)) ⟩
 +  sequenceV (map (flip lookupM (h↦h′ h)) (get t))
 +    ≡⟨ cong sequenceV (lemma-union-not-used h g′ (get t) (lemma-assoc-domain (get t) v h ph)) ⟩
 +  sequenceV (map (flip lookupM h) (get t))
 +    ≈⟨ sequence-cong (lemma-2 (get t) v h ph) ⟩
    sequenceV (map just v)
      ≡⟨ lemma-just-sequence v ⟩
    just v ∎)
            s′   = enumerate s
            g    = fromFunc (denumerate s)
            g′   = delete-many (get s′) g
-           t    = enumeratel n
-           h↦h′ = flip union (reshape g′ n)
 -          h↦h′ = flip union g′
 -          h′↦r = flip mapMV s′ ∘ flip lookupM
++          t    = enumeratel (Get.|gl₁| G j)
++          h↦h′ = flip union (reshape g′ (Get.|gl₁| G j))
 +          h′↦r = flip mapMV t ∘ flip lookupM
diff --cc Generic.agda
@@@ -8,12 -8,13 +8,13 @@@ open import Data.Nat using (ℕ ; zero 
  open import Data.Product using (__ ; _,_)
  open import Data.Vec using (Vec ; toList ; fromList ; map) renaming ([] to []V ; _∷_ to _∷V_)
  open import Data.Vec.Equality using () renaming (module Equality to VecEq)
 -open import Function using (_∘_ ; id)
 +open import Function using (_∘_ ; id ; flip)
+ open import Function.Equality using (_⟶_)
  open import Level using () renaming (zero to ℓ₀)
  open import Relation.Binary using (Setoid ; module Setoid)
  open import Relation.Binary.Core using (_≡_ ; refl)
  open import Relation.Binary.Indexed using (_at_) renaming (Setoid to ISetoid)
- open import Relation.Binary.PropositionalEquality using (_≗_ ; cong ; subst ; trans ; cong₂) renaming (setoid to PropEq)
 -open import Relation.Binary.PropositionalEquality using (_≗_ ; cong ; subst ; trans) renaming (setoid to EqSetoid)
++open import Relation.Binary.PropositionalEquality using (_≗_ ; cong ; subst ; trans ; cong₂) renaming (setoid to EqSetoid)
  
  open Setoid using () renaming (_≈_ to _∋_≈_)
  open Category.Functor.RawFunctor {Level.zero} Data.Maybe.functor using (_<$>_)
@@@ -31,14 -35,16 +35,14 @@@ mapMV f []V = just []
  mapMV f (x ∷V xs) = (f x) >>= (λ y → (_∷V_ y) <$> (mapMV f xs))
  
  mapMV-cong : {A B : Set} {f g : A → Maybe B} → f ≗ g → {n : ℕ} → mapMV {n = n} f ≗ mapMV g
 -mapMV-cong f≗g []V = refl
 -mapMV-cong {f = f} {g = g} f≗g (x ∷V xs) with f x | g x | f≗g x
 -mapMV-cong f≗g (x ∷V xs) | just y | .(just y) | refl = cong (_<$>_ (_∷V_ y)) (mapMV-cong f≗g xs)
 -mapMV-cong f≗g (x ∷V xs) | nothing | .nothing | refl = refl
 +mapMV-cong f≗g []V       = refl
 +mapMV-cong f≗g (x ∷V xs) = cong₂ _>>=_ (f≗g x) (cong (flip (_<$>_ ∘ _∷V_)) (mapMV-cong f≗g xs))
  
 -mapMV-purity : {A B : Set} {n : ℕ} → (f : A → B) → (v : Vec A n) → mapMV (just ∘ f) v ≡ just (map f v)
 -mapMV-purity f []V = refl
 -mapMV-purity f (x ∷V xs) rewrite mapMV-purity f xs = refl
 +mapMV-purity : {A B : Set} {n : ℕ} → (f : A → B) → (v : Vec A n) → mapMV (Maybe.just ∘ f) v ≡ just (map f v)
 +mapMV-purity f []V       = refl
 +mapMV-purity f (x ∷V xs) = cong (_<$>_ (_∷V_ (f x))) (mapMV-purity f xs)
  
- maybeEq-from-≡ : {A : Set} {a b : Maybe A} → a ≡ b → MaybeEq (PropEq A) ∋ a ≈ b
+ maybeEq-from-≡ : {A : Set} {a b : Maybe A} → a ≡ b → MaybeEq (EqSetoid A) ∋ a ≈ b
  maybeEq-from-≡ {a = just x}  {b = .(just x)} refl = just refl
  maybeEq-from-≡ {a = nothing} {b = .nothing}  refl = nothing
  
diff --cc Precond.agda
@@@ -18,8 -18,9 +18,9 @@@ import Data.List.Al
  open import Data.List.Any using (here ; there)
  open Data.List.Any.Membership-≡ using (_∉_)
  open import Data.Maybe using (just)
 -open import Data.Product using (∃ ; _,_ ; proj₂)
 +open import Data.Product using (∃ ; _,_ ; proj₁ ; proj₂)
  open import Function using (flip ; _∘_ ; id)
+ open import Relation.Binary using (Setoid)
  open import Relation.Binary.PropositionalEquality using (refl ; cong ; inspect ; [_] ; sym ; decSetoid)
  open Relation.Binary.PropositionalEquality.≡-Reasoning using (begin_ ; _≡⟨_⟩_ ; _∎)
  open import Relation.Nullary using (yes ; no)
@@@ -29,11 -30,14 +30,11 @@@ open import FinMap using (FinMapMaybe 
  import CheckInsert
  open CheckInsert (decSetoid deq) using (checkInsert ; lemma-checkInsert-new ; lemma-lookupM-checkInsert-other)
  import BFF
 -open import Bidir (decSetoid deq) using (_in-domain-of_ ; lemma-assoc-domain ; lemma-just-sequence)
 +import Bidir
 +open Bidir (decSetoid deq) using (_in-domain-of_ ; lemma-assoc-domain ; lemma-just-sequence)
  import GetTypes
- open GetTypes.VecVec using (Get ; module Get)
- open BFF.VecBFF (decSetoid deq) using (assoc ; enumerate ; denumerate ; bff ; enumeratel)
+ open GetTypes.PartialVecVec using (Get ; module Get)
 -open BFF.PartialVecBFF (decSetoid deq) using (assoc ; enumerate ; denumerate ; bff)
 -
 -lemma-lookup-map-just : {n : ℕ} (f : Fin n) {A : Set} (v : Vec A n) → lookup f (map Maybe.just v) ≡ Maybe.just (lookup f v)
 -lemma-lookup-map-just zero    (x ∷ xs) = refl
 -lemma-lookup-map-just (suc f) (x ∷ xs) = lemma-lookup-map-just f xs
++open BFF.PartialVecBFF (decSetoid deq) using (assoc ; enumerate ; denumerate ; bff ; enumeratel)
  
  lemma-maybe-just : {A : Set} → (a : A) → (ma : Maybe A) → maybe′ Maybe.just (just a) ma ≡ Maybe.just (maybe′ id a ma)
  lemma-maybe-just a (just x) = refl
@@@ -64,32 -68,28 +65,32 @@@ lemma-union-delete-fromFunc {n = n} {i
              ≡⟨ cong (maybe′ just _) px ⟩
            just x
              ≡⟨ cong (maybe′ just _) (sym px) ⟩
 -          maybe′ just (lookupM i (delete-many is (map just g))) (lookup i h) ∎
 -        inner f | no f≢i = cong (flip (maybe′ just) (lookup f h)) (lemma-lookupM-delete (delete-many is (map just g)) f≢i)
 +          maybe′ just (lookupM i (delete-many is (fromFunc g))) (lookup i h) ∎
 +        inner f | no f≢i = cong (flip (maybe′ just) (lookup f h)) (lemma-lookupM-delete (delete-many is (fromFunc g)) f≢i)
  
- assoc-enough : (G : Get) → {m : ℕ} → (s : Vec Carrier m) → (v : Vec Carrier (Get.getlen G m)) → ∃ (λ h → assoc (Get.get G (enumeratel m)) v ≡ just h) → ∃ λ u → bff G m s v ≡ just u
- assoc-enough G {m} s v (h , p) = _ , (begin
-   bff G m s v
-     ≡⟨ cong (flip _>>=_ (flip mapMV t ∘ flip lookupM) ∘ _<$>_ (flip union (reshape g′ m))) p ⟩
-   mapMV (flip lookupM (union h (reshape g′ m))) t
-     ≡⟨ sym (sequence-map (flip lookupM (union h (reshape g′ m))) t) ⟩
-   sequenceV (map (flip lookupM (union h (reshape g′ m))) t)
 -assoc-enough : (G : Get) → {i : Get.|I| G} → (s : Vec Carrier (Get.|gl₁| G i)) → (v : Vec Carrier (Get.|gl₂| G i)) → ∃ (λ h → assoc (Get.get G (enumerate s)) v ≡ just h) → ∃ λ u → bff G s v ≡ just u
 -assoc-enough G s v (h , p) = let w , pw = lemma-union-delete-fromFunc (lemma-assoc-domain (get s′) v h p) in _ , (begin
 -  bff G s v
 -    ≡⟨ cong (flip _>>=_ (flip mapMV s′ ∘ flip lookupM) ∘ _<$>_ (flip union g′)) p ⟩
 -  mapMV (flip lookupM (union h g′)) s′
 -    ≡⟨ sym (sequence-map (flip lookupM (union h g′)) s′) ⟩
 -  sequenceV (map (flip lookupM (union h g′)) s′)
 -    ≡⟨ cong (sequenceV ∘ flip map s′ ∘ flip lookupM) pw ⟩
 -  sequenceV (map (flip lookupM (map just w)) s′)
 -    ≡⟨ cong sequenceV (map-cong (λ f → lemma-lookup-map-just f w) s′) ⟩
 -  sequenceV (map (Maybe.just ∘ flip lookup w) s′)
 -    ≡⟨ cong sequenceV (map-∘ just (flip lookup w) s′) ⟩
 -  sequenceV (map Maybe.just (map (flip lookup w) s′))
 -    ≡⟨ lemma-just-sequence (map (flip lookup w) s′) ⟩
 -  just (map (flip lookup w) s′) ∎)
++assoc-enough : (G : Get) → {i : Get.|I| G} → (s : Vec Carrier (Get.|gl₁| G i)) → (v : Vec Carrier (Get.|gl₂| G i)) → ∃ (λ h → assoc (Get.get G (enumerate s)) v ≡ just h) → ∃ λ u → bff G i s v ≡ just u
++assoc-enough G {i} s v (h , p) = _ , (begin
++  bff G i s v
++    ≡⟨ cong (flip _>>=_ (flip mapMV t ∘ flip lookupM) ∘ _<$>_ (flip union (reshape g′ (Get.|gl₁| G i)))) p ⟩
++  mapMV (flip lookupM (union h (reshape g′ (Get.|gl₁| G i)))) t
++    ≡⟨ sym (sequence-map (flip lookupM (union h (reshape g′ (Get.|gl₁| G i)))) t) ⟩
++  sequenceV (map (flip lookupM (union h (reshape g′ (Get.|gl₁| G i)))) t)
 +    ≡⟨ cong (sequenceV ∘ flip map t ∘ flip lookupM ∘ union h) (lemma-reshape-id g′) ⟩
 +  sequenceV (map (flip lookupM (union h g′)) t)
 +    ≡⟨ cong (sequenceV ∘ flip map t ∘ flip lookupM) (proj₂ wp) ⟩
 +  sequenceV (map (flip lookupM (fromFunc (proj₁ wp))) t)
 +    ≡⟨ cong sequenceV (map-cong (lemma-lookupM-fromFunc (proj₁ wp)) t) ⟩
 +  sequenceV (map (Maybe.just ∘ proj₁ wp) t)
 +    ≡⟨ cong sequenceV (map-∘ just (proj₁ wp) t) ⟩
 +  sequenceV (map Maybe.just (map (proj₁ wp) t))
 +    ≡⟨ lemma-just-sequence (map (proj₁ wp) t) ⟩
 +  just (map (proj₁ wp) t) ∎)
    where open Get G
          s′ = enumerate s
          g  = fromFunc (denumerate s)
          g′ = delete-many (get s′) g
-         t  = enumeratel m
++        t  = enumeratel (Get.|gl₁| G i)
 +        wp = lemma-union-delete-fromFunc (lemma-assoc-domain (get t) v h p)
  
  data All-different {A : Set} : List A → Set where
    different-[] : All-different []