open import Data.Product
open import Relation.Binary.Construct.Closure.ReflexiveTransitive
open import Relation.Binary
open import Stoughton.Var
module ParallelReduction (๐ : Set) {๐ฑ : Set} (var : Enum ๐ฑ) where
open import Stoughton.Syntax ๐ ๐ฑ (Enum._โ_ var)
open import Stoughton.Substitution ๐ var
open import Beta ๐ var
open import BetaReduction ๐ var
private
_โ_ = Enum._โ_ var
infixl 3 _โ_
data _โ_ : ฮ โ ฮ โ Set where
โc : {k : ๐} โ c k โ c k
โv : {x : ๐ฑ} โ v x โ v x
โฮป : โ {x A A' M M'} โ A โ A' โ M โ M' โ ฮป[ x โถ A ] M โ ฮป[ x โถ A' ] M'
โฮ : {x : ๐ฑ}{A A' M M' : ฮ} โ A โ A' โ M โ M' โ ฮ [ x โถ A ] M โ ฮ [ x โถ A' ] M'
โยท : {M M' N N' : ฮ} โ M โ M' โ N โ N' โ M ยท N โ M' ยท N'
โฮฒ : {x : ๐ฑ}{A M M' N N' : ฮ} โ M โ M' โ N โ N' โ (ฮป[ x โถ A ] M) ยท N โ M' [ x := N' ]
โฯ : Reflexive _โ_
โฯ {c k} = โc
โฯ {v x} = โv
โฯ {M ยท N} = โยท โฯ โฯ
โฯ {ฮป[ x โถ A ] M} = โฮป โฯ โฯ
โฯ {ฮ [ x โถ A ] M} = โฮ โฯ โฯ
manyStepBetaContainsPar : _โ_ โ _โฮฒ*โ_
manyStepBetaContainsPar โc = ฮต
manyStepBetaContainsPar โv = ฮต
manyStepBetaContainsPar (โฮป AโB MโN) = abs-star-ty (manyStepBetaContainsPar AโB) โ
โ
abs-star (manyStepBetaContainsPar MโN)
manyStepBetaContainsPar (โฮ AโB MโN) =
pi-star-ty (manyStepBetaContainsPar AโB) โ
โ
pi-star (manyStepBetaContainsPar MโN)
manyStepBetaContainsPar (โยท {M} {M'} {N} {N'} MโM' NโN') =
app-star-l (manyStepBetaContainsPar MโM') โ
โ
app-star-r (manyStepBetaContainsPar NโN')
manyStepBetaContainsPar (โฮฒ {x} {A} {M} {M'} {N} {N'} MโM' NโN') =
app-star-l (abs-star (manyStepBetaContainsPar MโM')) โ
โ
app-star-r (manyStepBetaContainsPar NโN') โ
โ
โcxt ฮฒ โ
ฮต
manyStepBetaContainsStarPar : Star _โ_ โ _โฮฒ*โ_
manyStepBetaContainsStarPar ฮต = ฮต
manyStepBetaContainsStarPar (MโN โ
Nโ*P) = manyStepBetaContainsPar MโN โ
โ
manyStepBetaContainsStarPar Nโ*P
parContainsOneStep : _โฮฒ_ โ _โ_
parContainsOneStep (โcxt ฮฒ) = โฮฒ โฯ โฯ
parContainsOneStep (โฮปR MโN) = โฮป โฯ (parContainsOneStep MโN)
parContainsOneStep (โฮ R MโN) = โฮ โฯ (parContainsOneStep MโN)
parContainsOneStep (โฮปL MโN) = โฮป (parContainsOneStep MโN) โฯ
parContainsOneStep (โฮ L MโN) = โฮ (parContainsOneStep MโN) โฯ
parContainsOneStep (โยทR MโN) = โยท โฯ (parContainsOneStep MโN)
parContainsOneStep (โยทL MโN) = โยท (parContainsOneStep MโN) โฯ
starParContainsManyStep : _โฮฒ*โ_ โ Star _โ_
starParContainsManyStep ฮต = ฮต
starParContainsManyStep (MโN โ
Nโ*P) = parContainsOneStep MโN โ
starParContainsManyStep Nโ*P
manyStepBetaEqualsStarPar : _โฮฒ*โ_ โ Star _โ_
manyStepBetaEqualsStarPar = starParContainsManyStep , manyStepBetaContainsStarPar