{-# OPTIONS --no-termination-check  #-}

open import Prelude hiding (P; A)

module CCS.Fresh.Hyp where

open import Data.Nat

private
  A : Type
  A = 

open import CCS.Alg
open import CCS.SemiModel
import CCS.Proc as 
open import Algebra

open  using (Proc)

open import Data.Set renaming (⟦_⟧ to 𝒦⟦_⟧)

open import Hyper.Base
open import CCS.Hyp.Definition A (Proc A)

open CCSAlg  ... 
open CCSSemiModel  ... 

instance
  _ : CCSAlg (Proc A)
  _ = ℙ.procAlg

instance
  _ : CCSSemiModel (Proc A)
  _ = ℙ.procMod

open import CCS.Hyp.Properties {R = Proc A} ℙ.procMod hiding (⊕⌊)

instance
  _ : CCSAlg Communicator
  _ = hypAlg

instance
  _ : CCSSemiModel Communicator
  _ = hypMod


open import CCS.Hyp.Interp {R = Proc A} ℙ.procAlg  it 

open import CCS.Hyp.Rho {R = Proc A} ⊕-semilattice
open import CCS.Hyp.Properties.Restrict {R = Proc A} ⊕-semilattice  it 
open import CCS.Hyp.Properties.RestrictPar {R = Proc A} ⊕-semilattice  it 

open import CCS.Fresh
open import Swaps

ν-⌊-rewrite :  (ns : List A) n p q
             νₛ ns -  ν n - p  q ⟧ᶜ 
              νₛ (# (p  q)  ns) -   (n /→ # (p  q)) p  q 
ν-⌊-rewrite ns n p q =
  let m = # (p  q)
      m∉ = #-∉ (p  q)
  in

  νₛ ns -  ν n - p  q 

    ≡⟨⟩

  νₛ ns - (ν n -  p    q )

    ≡˘⟨ cong  e  νₛ ns - (e   q ) ) (ν-ρ-∉ m n p (m∉  inl)) 

  νₛ ns - (ν m - ρ (n  m)  p    q )

    ≡˘⟨ cong  e  νₛ ns - (ν m - ρ (n  m)  p   e)) (ν-∉ m q (m∉  inr) ) 

  νₛ ns - (ν m - ρ (n  m)  p   ν m -  q )

    ≡⟨ cong (νₛ ns -_) (ν-ν-ν-⌊ m _ _) 

  νₛ ns - ν m - (ν m - ρ (n  m)  p   ν m -  q )

    ≡˘⟨ cong (νₛ ns -_) (ν-⌊-ν m _ _) 

  νₛ ns - ν m - (ρ (n  m)  p   ν m -  q )

    ≡⟨ cong  e  νₛ ns - ν m - (ρ (n  m)  p   e)) (ν-∉ m q (m∉  inr)) 

  νₛ ns - ν m - (ρ (n  m)  p    q )

    ≡⟨ cong  e  νₛ m  ns - (e   q )) (ρ-hom (n /⇔ m) p)  

  νₛ ns - ν m - (  (n /↔ m) p    q )

    ≡˘⟨ cong  e  νₛ m  ns - ( e    q )) ( ρ-∉-↔ n m p (m∉  inl)) 

  νₛ ns - ν m - (  (n /→ m) p    q )

    

open import Data.Fin

ν-sync-rewrite :  (ns : List A) (n : A) (a : Act A) p q
             νₛ ns - syncᵢₒ  a · p ⟧ᶜ (ν n -  q ⟧ᶜ) 
              νₛ (# ((a · p)  q)  ns) - syncᵢₒ  a · p    (n /→ # ((a · p)  q)) q 
ν-sync-rewrite ns n a p q = cong-ι (funExt ∘′ lemma)
  where
  m : A
  m = # ((a · p)  q)

  m∉ : m ∉ₚ ((a · p)  q)
  m∉ = #-∉ ((a · p)  q)

  lemma :  r h  ι (νₛ ns - syncᵢₒ  a · p ⟧ᶜ (ν n -  q ⟧ᶜ)) r h  ι (νₛ (m  ns) - syncᵢₒ  a · p    (n /→ m) q ) r h
  lemma r h with ns ₛ∈ₘ? h
  ... | yes (i , ns∈h) =
    ι (νₛ ns - syncᵢₒ  a · p ⟧ᶜ (ν n -  q ⟧ᶜ)) r h ≡⟨ ι-∈-νₛ ns _ _ h (i , ns∈h) 
    𝟘 ≡˘⟨ ι-∈-νₛ (m  ns) _ _ h (fs i , ns∈h) 
    ι (νₛ (m  ns) - syncᵢₒ  a · p    (n /→ m) q ) r h 
  ... | no ns∉h with m ∈ₘ? h
  ... | no m∉h =

    ι (νₛ ns - syncᵢₒ  a · p ⟧ᶜ (ν n -  q ⟧ᶜ)) r h

      ≡⟨ ι-∉-νₛ ns _ _ h ns∉h 

    ι (syncᵢₒ  a · p ⟧ᶜ (ν n -  q ⟧ᶜ)) (νₛ ns - r) h

      ≡⟨⟩

    ι  a · p ⟧ᶜ ((ν n -  q ⟧ᶜ)  (νₛ ns - r)) h

      ≡˘⟨ cong  e  ι  a · p ⟧ᶜ (e  (νₛ ns - r)) h) (ν-ρ-∉ m n q (m∉  inr)) 

    ι  a · p ⟧ᶜ ((ν m - ρ (n  m)  q ⟧ᶜ)  (νₛ ns - r)) h

      ≡˘⟨ cong  e  ι e ((ν m - ρ (n  m)  q ⟧ᶜ)  (νₛ ns - r)) h) (ν-∉ m (a · p) (m∉  inl)) 

    ι (ν m -  a · p ⟧ᶜ) ((ν m - ρ (n  m)  q ⟧ᶜ)  (νₛ ns - r)) h

      ≡⟨ cong (bool _ _) (it-doesn't (m ∈ₘ? h) m∉h) 

    ι  a · p ⟧ᶜ (ν m - ((ν m - ρ (n  m)  q ⟧ᶜ)  (νₛ ns - r))) h

      ≡⟨ cong (flip (ι  a · p ) h) (ν-ν-⌊ m _ _) 

    ι  a · p ⟧ᶜ (ν m - ((ν m - ρ (n  m)  q ⟧ᶜ)  (ν m - νₛ ns - r))) h

      ≡˘⟨ cong (flip (ι  a · p ) h) (ν-⌊-ν m _ _) 

    ι  a · p ⟧ᶜ (ν m - (ρ (n  m)  q ⟧ᶜ  (ν m - νₛ ns - r))) h

      ≡˘⟨ cong (bool _ _) (it-doesn't (m ∈ₘ? h) m∉h) 

    ι (ν m -  a · p ⟧ᶜ) ((ρ (n  m)  q ⟧ᶜ  (ν m - νₛ ns - r))) h

      ≡⟨ cong  e  ι e (ρ (n  m)  q ⟧ᶜ  (ν m - νₛ ns - r)) h) (ν-∉ m (a · p) (m∉  inl)) 

    ι  a · p ⟧ᶜ (ρ (n  m)  q ⟧ᶜ  (ν m - νₛ ns - r)) h

      ≡⟨⟩

    ι (syncᵢₒ  a · p ⟧ᶜ (ρ (n  m)  q ⟧ᶜ)) (ν m - νₛ ns - r) h

      ≡˘⟨ cong (bool _ _) (it-doesn't (m ∈ₘ? h) m∉h) 

    ι (ν m - syncᵢₒ  a · p ⟧ᶜ (ρ (n  m)  q ⟧ᶜ)) (νₛ ns - r) h

      ≡˘⟨ ι-∉-νₛ ns _ _ h ns∉h 

    ι (νₛ (m  ns) - syncᵢₒ  a · p ⟧ᶜ (ρ (n  m)  q ⟧ᶜ)) r h

      ≡⟨ cong  e  ι (νₛ (m  ns) - syncᵢₒ  a · p ⟧ᶜ e) r h) (ρ-hom (n /⇔ m) q) 

    ι (νₛ (m  ns) - syncᵢₒ  a · p    (n /↔ m) q ) r h

      ≡˘⟨ cong  e  ι (νₛ (m  ns) - syncᵢₒ  a · p ⟧ᶜ  e ) r h) (ρ-∉-↔ n m q (m∉  inr)) 

    ι (νₛ (m  ns) - syncᵢₒ  a · p    (n /→ m) q ) r h 

  lemma r (𝕚 (inp b)) | no ns∉h | yes m∈h =

    ι (νₛ ns - syncᵢₒ  a · p ⟧ᶜ (ν n -  q ⟧ᶜ)) r (𝕚 (inp b))

      ≡⟨ ι-∉-νₛ ns _ _ (𝕚 (inp b)) ns∉h 

    ι (syncᵢₒ  a · p ⟧ᶜ (ν n -  q ⟧ᶜ)) (νₛ ns - r) (𝕚 (inp b))

      ≡⟨⟩

    ι  a · p ⟧ᶜ ((ν n -  q ⟧ᶜ)  (νₛ ns - r)) (𝕚 (inp b))

      ≡⟨ ι-∉-inp→𝟘 (a · p) ((ν n -  q ⟧ᶜ)  (νₛ ns - r)) b (m∉  inl  subst (_∈ₚ (a · p)) (sym m∈h)) 

    𝟘

      ≡˘⟨ cong (bool _ _) (it-does (m  b) m∈h) 

    ι (ν m - syncᵢₒ  a · p ⟧ᶜ   (n /→ m) q ⟧ᶜ) (νₛ ns - r) (𝕚 (inp b))

      ≡˘⟨ ι-∉-νₛ ns _ _ (𝕚 (inp b)) ns∉h 

    ι (νₛ (m  ns) - syncᵢₒ  a · p    (n /→ m) q ) r (𝕚 (inp b)) 

  lemma r (𝕚 (out b)) | no ns∉h | yes m∈h =

    ι (νₛ ns - syncᵢₒ  a · p ⟧ᶜ (ν n -  q ⟧ᶜ)) r (𝕚 (out b))

      ≡⟨ ι-∉-νₛ ns _ _ (𝕚 (out b)) ns∉h 

    ι (syncᵢₒ  a · p ⟧ᶜ (ν n -  q ⟧ᶜ)) (νₛ ns - r) (𝕚 (out b))

      ≡⟨⟩

    ι  a · p ⟧ᶜ ((ν n -  q ⟧ᶜ)  (νₛ ns - r)) (𝕚 (out b))

      ≡⟨ ι-𝕚-out→𝟘 (a · p) ((ν n -  q ⟧ᶜ)  (νₛ ns - r)) b 

    𝟘

      ≡˘⟨ cong (bool _ _) (it-does (m  b) m∈h) 

    ι (ν m - syncᵢₒ  a · p ⟧ᶜ   (n /→ m) q ⟧ᶜ) (νₛ ns - r) (𝕚 (out b))

      ≡˘⟨ ι-∉-νₛ ns _ _ (𝕚 (out b)) ns∉h 

    ι (νₛ (m  ns) - syncᵢₒ  a · p    (n /→ m) q ) r (𝕚 (out b))