summaryrefslogtreecommitdiff
path: root/LiftGet.agda
diff options
context:
space:
mode:
Diffstat (limited to 'LiftGet.agda')
-rw-r--r--LiftGet.agda114
1 files changed, 76 insertions, 38 deletions
diff --git a/LiftGet.agda b/LiftGet.agda
index 3c07fd7..7731f6b 100644
--- a/LiftGet.agda
+++ b/LiftGet.agda
@@ -8,7 +8,7 @@ open import Data.List.Properties using (length-map)
open import Data.Product using (∃ ; _,_ ; proj₁ ; proj₂)
open import Function using (_∘_ ; flip ; const)
open import Relation.Binary.Core using (_≡_)
-open import Relation.Binary.PropositionalEquality using (_≗_ ; sym ; cong ; refl)
+open import Relation.Binary.PropositionalEquality using (_≗_ ; sym ; cong ; refl ; subst ; trans ; proof-irrelevance)
open Relation.Binary.PropositionalEquality.≡-Reasoning using (begin_ ; _≡⟨_⟩_ ; _∎)
get-type : Set₁
@@ -44,15 +44,12 @@ length-toList : {A : Set} {n : ℕ} → (v : Vec A n) → length (toList v) ≡
length-toList []V = refl
length-toList (x ∷V xs) = cong suc (length-toList xs)
-vec-length : {A : Set} {n m : ℕ} → n ≡ m → Vec A n → Vec A m
-vec-length refl v = v
-
toList-fromList : {A : Set} → (l : List A) → toList (fromList l) ≡ l
toList-fromList [] = refl
toList-fromList (x ∷ xs) = cong (_∷_ x) (toList-fromList xs)
-vec-length-same : {A : Set} → (l : List A) → {n : ℕ} → (p : length l ≡ n) → toList (vec-length p (fromList l)) ≡ l
-vec-length-same l refl = toList-fromList l
+toList-subst : {A : Set} → {n m : ℕ} (v : Vec A n) → (p : n ≡ m) → toList (subst (Vec A) p v) ≡ toList v
+toList-subst v refl = refl
getList-to-getVec-length-property : (get : get-type) → {C : Set} → {m : ℕ} → (v : Vec C m) → length (get (toList v)) ≡ length (get (replicate m tt))
getList-to-getVec-length-property get {_} {m} v = begin
@@ -67,23 +64,40 @@ getList-to-getVec get = getlen , get'
where getlen : ℕ → ℕ
getlen = getList-to-getlen get
get' : {C : Set} {m : ℕ} → Vec C m → Vec C (getlen m)
- get' v = vec-length (getList-to-getVec-length-property get v) (fromList (get (toList v)))
-
-{-
--- We cannot formulate the first commutation property, because the type of
--- fromList (get l) depends on the concrete l, more specifically its length.
-get-commut-1 : (get : get-type) → (fromList ∘ get) ≗ (proj₂ (getList-to-getVec get)) ∘ fromList
-get-commut-1 get l = ?
--}
+ get' {C} v = subst (Vec C) (getList-to-getVec-length-property get v) (fromList (get (toList v)))
+
+subst-subst : {A : Set} (T : A → Set) {a b c : A} → (p : a ≡ b) → (p' : b ≡ c) → (x : T a)→ subst T p' (subst T p x) ≡ subst T (trans p p') x
+subst-subst T refl p' x = refl
+
+subst-fromList : {A : Set} {x y : List A} → (p : y ≡ x) → subst (Vec A) (cong length p) (fromList y) ≡ fromList x
+subst-fromList refl = refl
+
+get-commut-1 : (get : get-type) {A : Set} → (l : List A) → fromList (get l) ≡ subst (Vec A) (sym (getList-length get l)) (proj₂ (getList-to-getVec get) (fromList l))
+get-commut-1 get {A} l = begin
+ fromList (get l)
+ ≡⟨ sym (subst-fromList (cong get (toList-fromList l))) ⟩
+ subst (Vec A) (cong length (cong get (toList-fromList l))) (fromList (get (toList (fromList l))))
+ ≡⟨ cong (flip (subst (Vec A)) (fromList (get (toList (fromList l))))) (proof-irrelevance (cong length (cong get (toList-fromList l))) (trans p p')) ⟩
+ subst (Vec A) (trans p p') (fromList (get (toList (fromList l))))
+ ≡⟨ sym (subst-subst (Vec A) p p' (fromList (get (toList (fromList l))))) ⟩
+ subst (Vec A) p' (subst (Vec A) p (fromList (get (toList (fromList l)))))
+ ≡⟨ refl ⟩
+ subst (Vec A) p' (proj₂ (getList-to-getVec get) (fromList l)) ∎
+ where p : length (get (toList (fromList l))) ≡ length (get (replicate (length l) tt))
+ p = getList-to-getVec-length-property get (fromList l)
+ p' : length (get (replicate (length l) tt)) ≡ length (get l)
+ p' = sym (getList-length get l)
get-trafo-1 : (get : get-type) → {B : Set} → getVec-to-getList (proj₂ (getList-to-getVec get)) {B} ≗ get {B}
-get-trafo-1 get l = begin
+get-trafo-1 get {B} l = begin
getVec-to-getList (proj₂ (getList-to-getVec get)) l
≡⟨ refl ⟩
toList (proj₂ (getList-to-getVec get) (fromList l))
≡⟨ refl ⟩
- toList (vec-length (getList-to-getVec-length-property get (fromList l)) (fromList (get (toList (fromList l)))))
- ≡⟨ vec-length-same (get (toList (fromList l))) (getList-to-getVec-length-property get (fromList l)) ⟩
+ toList (subst (Vec B) (getList-to-getVec-length-property get (fromList l)) (fromList (get (toList (fromList l)))))
+ ≡⟨ toList-subst (fromList (get (toList (fromList l)))) (getList-to-getVec-length-property get (fromList l)) ⟩
+ toList (fromList (get (toList (fromList l))))
+ ≡⟨ toList-fromList (get (toList (fromList l))) ⟩
get (toList (fromList l))
≡⟨ cong get (toList-fromList l) ⟩
get l ∎
@@ -91,47 +105,71 @@ get-trafo-1 get l = begin
vec-len : {A : Set} {n : ℕ} → Vec A n → ℕ
vec-len {_} {n} _ = n
-vec-len-via-list : {A : Set} {n : ℕ} → (v : Vec A n) → length (toList v) ≡ vec-len v
-vec-len-via-list []V = refl
-vec-len-via-list (x ∷V xs) = cong suc (vec-len-via-list xs)
-
length-replicate : {A : Set} {a : A} → (n : ℕ) → length (replicate n a) ≡ n
length-replicate 0 = refl
length-replicate (suc n) = cong suc (length-replicate n)
-{-
--- We cannot write the following property, because the expressions
--- fromList (toList v) and v have different type. The type differs in the
--- length. Somehow we would have to embed a proof that those types are in fact
--- the same into the type signature of the function.
-fromList-toList : {A : Set} {n : ℕ} → (v : Vec A n) → fromList (toList v) ≡ v
-fromList-toList v = ?
--}
+subst-cong : {A : Set} → (T : A → Set) → {g : A → A} → {a b : A} → (f : {c : A} → T c → T (g c)) → (p : a ≡ b) → f ∘ subst T p ≗ subst T (cong g p) ∘ f
+subst-cong T f refl _ = refl
+
+fromList-toList : {A : Set} {n : ℕ} → (v : Vec A n) → fromList (toList v) ≡ subst (Vec A) (sym (length-toList v)) v
+fromList-toList []V = refl
+fromList-toList {A} (x ∷V xs) = begin
+ x ∷V fromList (toList xs)
+ ≡⟨ cong (_∷V_ x) (fromList-toList xs) ⟩
+ x ∷V subst (Vec A) (sym (length-toList xs)) xs
+ ≡⟨ subst-cong (Vec A) (_∷V_ x) (sym (length-toList xs)) xs ⟩
+ subst (Vec A) (cong suc (sym (length-toList xs))) (x ∷V xs)
+ ≡⟨ cong (λ p → subst (Vec A) p (x ∷V xs)) (proof-irrelevance (cong suc (sym (length-toList xs))) (sym (cong suc (length-toList xs)))) ⟩
+ subst (Vec A) (sym (length-toList (x ∷V xs))) (x ∷V xs) ∎
get-commut-2 : (getlen : ℕ → ℕ) → (get : getV-type getlen) → {B : Set} {n : ℕ} → (toList ∘ get {B} {n}) ≗ (getVec-to-getList get) ∘ toList
-get-commut-2 getlen get v = {!!}
+get-commut-2 getlen get {B} v = begin
+ toList (get v)
+ ≡⟨ sym (toList-subst (get v) (cong getlen (sym (length-toList v)))) ⟩
+ toList (subst (Vec B) (cong getlen (sym (length-toList v))) (get v))
+ ≡⟨ cong toList (sym (subst-cong (Vec B) get (sym (length-toList v)) v)) ⟩
+ toList (get (subst (Vec B) (sym (length-toList v)) v))
+ ≡⟨ cong (toList ∘ get) (sym (fromList-toList v)) ⟩
+ toList (get (fromList (toList v))) ∎
get-trafo-2-getlen : (getlen : ℕ → ℕ) → (get : getV-type getlen) → proj₁ (getList-to-getVec (getVec-to-getList get)) ≗ getlen
get-trafo-2-getlen getlen get n = begin
proj₁ (getList-to-getVec (getVec-to-getList get)) n
≡⟨ refl ⟩
length (toList (get (fromList (replicate n tt))))
- ≡⟨ vec-len-via-list (get (fromList (replicate n tt))) ⟩
+ ≡⟨ length-toList (get (fromList (replicate n tt))) ⟩
vec-len (get (fromList (replicate n tt)))
≡⟨ cong getlen (length-replicate n) ⟩
getlen n ∎
getVec-getlen : {getlen₁ getlen₂ : ℕ → ℕ} → (get : getV-type getlen₁) → getlen₁ ≗ getlen₂ → getV-type getlen₂
-getVec-getlen get p {B} {n} v = vec-length (p n) (get v)
+getVec-getlen get p {B} {n} v = subst (Vec B) (p n) (get v)
get-trafo-2-get : (getlen : ℕ → ℕ) → (get : getV-type getlen) → {B : Set} {n : ℕ} → proj₂ (getList-to-getVec (getVec-to-getList get)) {B} {n} ≗ getVec-getlen get (sym ∘ (get-trafo-2-getlen getlen get))
-get-trafo-2-get getlen get v = begin
+get-trafo-2-get getlen get {B} {n} v = begin
proj₂ (getList-to-getVec (getVec-to-getList get)) v
≡⟨ refl ⟩
- vec-length (getList-to-getVec-length-property (getVec-to-getList get) v) (fromList (toList (get (fromList (toList v)))))
- ≡⟨ {!!} ⟩
- vec-length (sym (get-trafo-2-getlen getlen get (vec-len v))) (vec-length (cong getlen (length-toList v)) (get (fromList (toList v))))
- ≡⟨ {!!} ⟩
- vec-length (sym (get-trafo-2-getlen getlen get (vec-len v))) (get v)
+ subst (Vec B) p (fromList (toList (get (fromList (toList v)))))
+ ≡⟨ cong (subst (Vec B) p) (fromList-toList (get (fromList (toList v)))) ⟩
+ subst (Vec B) p (subst (Vec B) p' (get (fromList (toList v))))
+ ≡⟨ subst-subst (Vec B) p' p (get (fromList (toList v))) ⟩
+ subst (Vec B) (trans p' p) (get (fromList (toList v)))
+ ≡⟨ cong (subst (Vec B) (trans p' p) ∘ get) (fromList-toList v) ⟩
+ subst (Vec B) (trans p' p) (get (subst (Vec B) (sym (length-toList v)) v))
+ ≡⟨ cong (subst (Vec B) (trans p' p)) (subst-cong (Vec B) get (sym (length-toList v)) v) ⟩
+ subst (Vec B) (trans p' p) (subst (Vec B) (cong getlen (sym (length-toList v))) (get v))
+ ≡⟨ subst-subst (Vec B) (cong getlen (sym (length-toList v))) (trans p' p) (get v) ⟩
+ subst (Vec B) (trans (cong getlen (sym (length-toList v))) (trans p' p)) (get v)
+ ≡⟨ cong (flip (subst (Vec B)) (get v)) (proof-irrelevance (trans (cong getlen (sym (length-toList v))) (trans p' p)) p'') ⟩
+ subst (Vec B) p'' (get v)
≡⟨ refl ⟩
getVec-getlen get (sym ∘ (get-trafo-2-getlen getlen get)) v ∎
+ where n' : ℕ
+ n' = length (toList (get (fromList (replicate n tt))))
+ p : length (toList (get (fromList (toList v)))) ≡ n'
+ p = getList-to-getVec-length-property (getVec-to-getList get) v
+ p' : getlen (length (toList v)) ≡ length (toList (get (fromList (toList v))))
+ p' = sym (length-toList (get (fromList (toList v))))
+ p'' : getlen n ≡ n'
+ p'' = sym (get-trafo-2-getlen getlen get (vec-len v))