module CCS.Fresh.Proc where

open import Prelude hiding (A)
open import CCS.Fresh
open import CCS.Proc

open import CCS.Alg
open import CCS.SemiModel

private
  A : Type
  A = 

open CCSAlg  ... 
open CCSSemiModel  ... 

instance
  _ : CCSAlg (Proc A)
  _ = procAlg

instance
  _ : CCSSemiModel (Proc A)
  _ = procMod


open import CCS.Proc.RestrictPar
open import Swaps {A = A}

ν-⌊-rewrite :  (ns : List A) (n : A) p q
             νₛ ns - ( ν n - p  q   Proc A) 
              νₛ (# (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 )) (ν-ρ-∉ᵖ n m  p  (∉ᵖ⇒∉ₚ m p (m∉  inl))) 

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

    ≡˘⟨ cong  e  νₛ ns - ((ν m - ρ (n /↔ m)  p )  e)) (ν-∉ᵖ m  q  (∉ᵖ⇒∉ₚ m q (m∉  inr))) 

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

    ≡⟨ cong (νₛ ns -_) (ν-ν-ν-⌊ m (ρ (n /↔ m)  p )  q ) 

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

    ≡˘⟨ cong (νₛ ns -_) (ν-⌊-ν m (ρ (n /↔ m)  p )  q ) 

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

    ≡⟨ cong  e  νₛ ns - ν m - ((ρ (n /↔ m)  p )  e)) (ν-∉ᵖ m  q  (∉ᵖ⇒∉ₚ m q (m∉  inr))) 

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

    ≡⟨ cong  e  νₛ ns - ν m - (e   q )) (ρ-hom ((n /↔ m) , iso-is-inj (n /⇔ m)) p) 

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

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

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

    

ν-sync-rewrite :  (n : A) (a : Act A) p q
             syncᵢₒ  a · p  (ν n -  q ) 
              ν (# ((a · p)  q)) - syncᵢₒ  a · p    (n /→ # ((a · p)  q)) q 
ν-sync-rewrite n a p q =
  let m  = # ((a · p)  q)
      m∉ = #-∉ ((a · p)  q)
  in

  syncᵢₒ  a · p  (ν n -  q )

    ≡⟨ cong₂ syncᵢₒ (sym (ν-∉ᵖ m  a · p  (∉ᵖ⇒∉ₚ m (a · p) (m∉  inl)))) (ν-ρ-∉ᵖ n m  q  (∉ᵖ⇒∉ₚ m q (m∉  inr))) 

  syncᵢₒ (ν m -  a · p ) (ν m - ρ (n /↔ m)  q )

    ≡⟨ ν-ν-ν-syncᵢₒ m  a · p  (ρ (n /↔ m)  q ) 

  ν m - syncᵢₒ (ν m -  a · p ) (ν m - ρ (n /↔ m)  q )

    ≡˘⟨ ν-ν-syncᵢₒ m  a · p  (ρ (n /↔ m)  q ) 

  ν m - syncᵢₒ (ν m -  a · p ) (ρ (n /↔ m)  q )

    ≡⟨ cong (ν m -_) (cong₂ syncᵢₒ (ν-∉ᵖ m  a · p  (∉ᵖ⇒∉ₚ m (a · p) (m∉  inl))) ((ρ-hom ((n /↔ m) , iso-is-inj (n /⇔ m)) q))) 

  ν m - syncᵢₒ  a · p    (n /↔ m) q 

    ≡˘⟨ cong  e  ν m - syncᵢₒ  a · p   e ) (ρ-∉-↔ n m q (m∉  inr)) 

  ν m - syncᵢₒ  a · p    (n /→ m) q