module Chapter6.Patch.Coherence where

open import Data.Unit
open import Data.Product

open import Chapter1.Logic

open import Chapter2.IDesc.Fixpoint

open import Chapter5.Ornament
open import Chapter5.Ornament.Algebra 
open import Chapter5.Reornament
open import Chapter5.Reornament.Make
open import Chapter5.Reornament.Algebra
open import Chapter5.Reornament.Coherence

open import Chapter6.Functions
open import Chapter6.FunOrnament
open import Chapter6.Patch
open import Chapter6.Patch.Apply


⊢Coherence : ∀{T}  (T⁺ : FunctionOrn T)(f :  T ⟧Type)
             (p : Patch f T⁺)   T⁺ ⟧Coherence f (patch T⁺ f p)
⊢Coherence (μ⁺ o [ inv i⁺ ]→ T⁺) f f⁺ = 
  λ x  ⊢Coherence T⁺ 
                   (f (forgetOrnament o x)) 
                   (f⁺ (forgetOrnament o x)
                       (makeAlg o x))
⊢Coherence (μ⁺ o [ inv i⁺  T⁺) (x , xs) (x⁺ , xs⁺) = 
  coherentOrn o x⁺ , ⊢Coherence T⁺ xs xs⁺
⊢Coherence `⊤ tt tt = tt