@@ -10,48 +10,89 @@ module Data.List.Relation.Ternary.Appending.Properties where
1010
1111open import Data.List.Base using (List; [])
1212open import Data.List.Relation.Ternary.Appending
13+ open import Data.List.Relation.Binary.Pointwise as Pw using (Pointwise; []; _∷_)
14+ open import Data.Product.Base as Product using (∃-syntax; _×_; _,_)
15+ open import Function.Base using (id)
1316open import Data.List.Relation.Binary.Pointwise.Base as Pw using (Pointwise; []; _∷_)
1417open import Data.List.Relation.Binary.Pointwise.Properties as Pw using (transitive)
1518open import Level using (Level)
16- open import Relation.Binary.Core using (REL; Rel)
19+ open import Relation.Binary.Core using (REL; Rel; _⇒_ )
1720open import Relation.Binary.Definitions using (Trans)
1821open import Relation.Binary.PropositionalEquality.Core using (_≡_; refl)
22+ open import Relation.Binary.Construct.Composition using (_;_)
1923
2024private
2125 variable
22- a a′ b b′ c c′ l r : Level
23- A : Set a
24- A′ : Set a′
25- B : Set b
26- B′ : Set b′
27- C : Set c
28- C′ : Set c′
29- L : REL A C l
30- R : REL B C r
31- as : List A
32- bs : List B
33- cs : List C
34-
35- module _ {e} {E : REL C C′ e} {L′ : REL A C′ l} {R′ : REL B C′ r}
36- (LEL′ : Trans L E L′) (RER′ : Trans R E R′)
37- where
26+ a ℓ l r : Level
27+ A A′ B B′ C C′ D D′ : Set a
28+ R S T U V W X Y : REL A B ℓ
29+ as bs cs ds : List A
30+
31+ module _ (RST : Trans R S T) (USV : Trans U S V) where
3832
39- respʳ-≋ : ∀ {cs′} → Appending L R as bs cs → Pointwise E cs cs′ → Appending L′ R′ as bs cs′
40- respʳ-≋ ([]++ rs) es = []++ Pw.transitive RER′ rs es
41- respʳ-≋ (l ∷ lrs) (e ∷ es) = LEL′ l e ∷ respʳ-≋ lrs es
33+ respʳ-≋ : Appending R U as bs cs → Pointwise S cs ds → Appending T V as bs ds
34+ respʳ-≋ ([]++ rs) es = []++ Pw.transitive USV rs es
35+ respʳ-≋ (l ∷ lrs) (e ∷ es) = RST l e ∷ respʳ-≋ lrs es
4236
43- module _ {eᴬ eᴮ} {Eᴬ : REL A′ A eᴬ} {Eᴮ : REL B′ B eᴮ}
44- {L′ : REL A′ C l} (ELL′ : Trans Eᴬ L L′)
45- {R′ : REL B′ C r} (ERR′ : Trans Eᴮ R R′)
37+ module _ {T : REL A B l} (RST : Trans R S T)
38+ {W : REL A B r} (ERW : Trans U V W)
4639 where
4740
48- respˡ-≋ : ∀ {as′ bs′} → Pointwise Eᴬ as′ as → Pointwise Eᴮ bs′ bs →
49- Appending L R as bs cs → Appending L′ R′ as′ bs′ cs
50- respˡ-≋ [] esʳ ([]++ rs) = []++ Pw.transitive ERR′ esʳ rs
51- respˡ-≋ (eˡ ∷ esˡ) esʳ (l ∷ lrs) = ELL′ eˡ l ∷ respˡ-≋ esˡ esʳ lrs
41+ respˡ-≋ : ∀ {as′ bs′} → Pointwise R as′ as → Pointwise U bs′ bs →
42+ Appending S V as bs cs → Appending T W as′ bs′ cs
43+ respˡ-≋ [] esʳ ([]++ rs) = []++ Pw.transitive ERW esʳ rs
44+ respˡ-≋ (eˡ ∷ esˡ) esʳ (l ∷ lrs) = RST eˡ l ∷ respˡ-≋ esˡ esʳ lrs
5245
53- conicalˡ : Appending L R as bs [] → as ≡ []
46+ conicalˡ : Appending R S as bs [] → as ≡ []
5447conicalˡ ([]++ rs) = refl
5548
56- conicalʳ : Appending L R as bs [] → bs ≡ []
49+ conicalʳ : Appending R S as bs [] → bs ≡ []
5750conicalʳ ([]++ []) = refl
51+
52+ through→ :
53+ (R ⇒ (S ; T)) →
54+ ((U ; V) ⇒ (W ; T)) →
55+ ∃[ xs ] Pointwise U as xs × Appending V R xs bs cs →
56+ ∃[ ys ] Appending W S as bs ys × Pointwise T ys cs
57+ through→ f g (_ , [] , []++ rs) =
58+ let _ , rs′ , ps′ = Pw.unzip (Pw.map f rs) in
59+ _ , []++ rs′ , ps′
60+ through→ f g (_ , p ∷ ps , l ∷ lrs) =
61+ let _ , l′ , p′ = g (_ , p , l) in
62+ Product.map _ (Product.map (l′ ∷_) (p′ ∷_)) (through→ f g (_ , ps , lrs))
63+
64+ through← :
65+ ((R ; S) ⇒ T) →
66+ ((U ; S) ⇒ (V ; W)) →
67+ ∃[ ys ] Appending U R as bs ys × Pointwise S ys cs →
68+ ∃[ xs ] Pointwise V as xs × Appending W T xs bs cs
69+ through← f g (_ , []++ rs′ , ps′) =
70+ _ , [] , []++ (Pw.transitive (λ r′ p′ → f (_ , r′ , p′)) rs′ ps′)
71+ through← f g (_ , l′ ∷ lrs′ , p′ ∷ ps′) =
72+ let _ , p , l = g (_ , l′ , p′) in
73+ Product.map _ (Product.map (p ∷_) (l ∷_)) (through← f g (_ , lrs′ , ps′))
74+
75+ assoc→ :
76+ (R ⇒ (S ; T)) →
77+ ((U ; V) ⇒ (W ; T)) →
78+ ((Y ; V) ⇒ X) →
79+ ∃[ xs ] Appending Y U as bs xs × Appending V R xs cs ds →
80+ ∃[ ys ] Appending W S bs cs ys × Appending X T as ys ds
81+ assoc→ f g h (_ , []++ rs , lrs′) =
82+ let _ , mss , ss′ = through→ f g (_ , rs , lrs′) in
83+ _ , mss , []++ ss′
84+ assoc→ f g h (_ , l ∷ lrs , l′ ∷ lrs′) =
85+ Product.map₂ (Product.map₂ (h (_ , l , l′) ∷_)) (assoc→ f g h (_ , lrs , lrs′))
86+
87+ assoc← :
88+ ((S ; T) ⇒ R) →
89+ ((W ; T) ⇒ (U ; V)) →
90+ (X ⇒ (Y ; V)) →
91+ ∃[ ys ] Appending W S bs cs ys × Appending X T as ys ds →
92+ ∃[ xs ] Appending Y U as bs xs × Appending V R xs cs ds
93+ assoc← f g h (_ , mss , []++ ss′) =
94+ let _ , rs , lrs′ = through← f g (_ , mss , ss′) in
95+ _ , []++ rs , lrs′
96+ assoc← f g h (_ , mss , m′ ∷ mss′) =
97+ let _ , l , l′ = h m′ in
98+ Product.map _ (Product.map (l ∷_) (l′ ∷_)) (assoc← f g h (_ , mss , mss′))
0 commit comments