open import Relation.Binary.Core using (Rel)
open import Action
open import Data.List hiding ([_])
open import Data.List.Membership.Propositional
open import Data.List.Relation.Unary.Any
open import Level renaming (suc to lsuc)
open import Data.Fin hiding (_>_ ; #_)
open import Relation.Binary.Definitions using (DecidableEquality)
open import Relation.Unary hiding (∅ ; _∖_)
open import Relation.Nullary.Decidable
open import Data.Bool
open import Data.Nat
module Guarded {ℓ} (A : Set ℓ) {dec : DecidableEquality A} {Action : Act A dec} where
open Act Action
open Action.Renaming A dec Action
import Syntax
open Syntax A {dec} {Action}
data guarded {n} : (P : Proc n) → Set ℓ where
guarded-∅ : guarded ∅
guarded-+ : ∀ {P Q} →
guarded P →
guarded Q →
guarded (P + Q)
guarded-∣ : ∀ {P Q} →
guarded P →
guarded Q →
guarded (P ∣ Q)
guarded-∖ : ∀ {P} {α} →
guarded P →
guarded (P ∖ α)
guarded-ren : ∀ {P} {φ} →
guarded P →
guarded (P [ φ ])
guarded-∙ : ∀ {α} {P} →
guarded (α ∙ P)
guarded-fix : ∀ {P} →
guarded P →
guarded (fix P)
guarded-subst : ∀ {n} {P : Proc (suc n)} {σ : Fin (suc n) → Proc n} → guarded P → guarded (subst σ P)
guarded-subst guarded-∅ = guarded-∅
guarded-subst (guarded-+ p q) = guarded-+ (guarded-subst p) (guarded-subst q)
guarded-subst (guarded-∣ p q) = guarded-∣ (guarded-subst p) (guarded-subst q)
guarded-subst (guarded-∖ x) = guarded-∖ (guarded-subst x)
guarded-subst (guarded-ren x) = guarded-ren (guarded-subst x)
guarded-subst guarded-∙ = guarded-∙
guarded-subst (guarded-fix x) = guarded-fix (guarded-subst x)
guarded-dec : ∀ {n} → Decidable (guarded {n})
guarded-dec ∅ = yes guarded-∅
guarded-dec (# x) = no (λ ())
guarded-dec (α ∙ P) = yes guarded-∙
guarded-dec (P + Q) with guarded-dec P | guarded-dec Q
... | yes p | yes q = yes (guarded-+ p q)
... | yes p | no q = no (λ {(guarded-+ x y) → q y})
... | no p | yes q = no (λ {(guarded-+ x y) → p x})
... | no p | no q = no (λ {(guarded-+ x y) → q y})
guarded-dec (P ∣ Q) with guarded-dec P | guarded-dec Q
... | yes p | yes q = yes (guarded-∣ p q)
... | yes p | no q = no (λ {(guarded-∣ x y) → q y})
... | no p | yes q = no (λ {(guarded-∣ x y) → p x})
... | no p | no q = no (λ {(guarded-∣ x y) → q y})
guarded-dec (P ∖ a) with guarded-dec P
... | yes p = yes (guarded-∖ p)
... | no p = no (λ {(guarded-∖ x) → p x})
guarded-dec (P [ φ ]) with guarded-dec P
... | yes p = yes (guarded-ren p)
... | no p = no (λ {(guarded-ren x) → p x})
guarded-dec (fix P) with guarded-dec P
... | yes p = yes (guarded-fix p)
... | no p = no (λ {(guarded-fix x) → p x})