module CCS.Fresh where

open import Prelude hiding (P)
open import Data.Nat
open import Data.Nat.Order
open import CCS.Syntax
open import CCS.Act

opaque
  max-var : P   
  max-var = fold-P _⊔_ zero

  # : P   
  # = suc  max-var

  ∈-≤max :  n p  n ∈ₚ p  n  max-var p
  ∈-≤max n (p  q) (inl n∈p) = ≤-⊔ˡ n (max-var p) (max-var q) (∈-≤max n p n∈p)
  ∈-≤max n (p  q) (inr n∈q) = ≤-⊔ʳ n (max-var p) (max-var q) (∈-≤max n q n∈q)
  ∈-≤max n (p  q) (inl n∈p) = ≤-⊔ˡ n (max-var p) (max-var q) (∈-≤max n p n∈p)
  ∈-≤max n (p  q) (inr n∈q) = ≤-⊔ʳ n (max-var p) (max-var q) (∈-≤max n q n∈q)
  ∈-≤max n (p  q) (inl n∈p) = ≤-⊔ˡ n (max-var p) (max-var q) (∈-≤max n p n∈p)
  ∈-≤max n (p  q) (inr n∈q) = ≤-⊔ʳ n (max-var p) (max-var q) (∈-≤max n q n∈q)
  ∈-≤max n (inp x · p) (inl n∈a) = ≤-⊔ˡ n x (max-var p) (subst (n ≤_) n∈a (≤-refl n))
  ∈-≤max n (out x · p) (inl n∈a) = ≤-⊔ˡ n x (max-var p) (subst (n ≤_) n∈a (≤-refl n))
  ∈-≤max n (inp x · p) (inr n∈p) = ≤-⊔ʳ n x (max-var p) (∈-≤max n p n∈p)
  ∈-≤max n (out x · p) (inr n∈p) = ≤-⊔ʳ n x (max-var p) (∈-≤max n p n∈p)
  ∈-≤max n (τ · p) (inr n∈p) = ∈-≤max n p n∈p
  ∈-≤max n (ν x - p) (inl n≡x) = ≤-⊔ˡ n x (max-var p) (subst (n ≤_) n≡x (≤-refl n))
  ∈-≤max n (ν x - p) (inr n∈p) = ≤-⊔ʳ n x (max-var p) (∈-≤max n p n∈p)
  ∈-≤max n (! p) n∈p = ∈-≤max n p n∈p

  #-∉ :  p  # p ∉ₚ p
  #-∉ p fp∈p = <-irrefl (max-var p) (∈-≤max (# p) p fp∈p)