module CoercionExpr.Precision where
open import Data.Nat
open import Data.Unit using (β€; tt)
open import Data.Bool using (true; false) renaming (Bool to πΉ)
open import Data.List hiding ([_])
open import Data.Product renaming (_,_ to β¨_,_β©)
open import Data.Sum using (_β_)
open import Data.Maybe
open import Relation.Nullary using (Β¬_; Dec; yes; no)
open import Relation.Binary.PropositionalEquality using (_β‘_; refl)
open import Function using (case_of_)
open import Common.Utils
open import Common.SecurityLabels
open import Common.BlameLabels
open import CoercionExpr.CoercionExpr
infix 4 β’_β_
infix 4 β’l_β_
infix 4 β’r_β_
data β’_β_ : β {gβ gββ² gβ gββ²} (cΜ
: CExpr gβ β gβ) (cΜ
β² : CExpr gββ² β gββ²) β Set where
β-id : β {g gβ²}
β (gβgβ² : g ββ gβ²)
β β’ id g β id gβ²
β-cast : β {gβ gββ² gβ gββ² gβ gββ²}
{cΜ
: CExpr gβ β gβ} {cΜ
β² : CExpr gββ² β gββ²}
{c : β’ gβ β gβ} {cβ² : β’ gββ² β gββ²}
β β’ cΜ
β cΜ
β²
β gβ ββ gββ² β gβ ββ gββ²
β β’ cΜ
β¨Ύ c β cΜ
β² β¨Ύ cβ²
β-castl : β {gβ gββ² gβ gββ² gβ}
{cΜ
: CExpr gβ β gβ} {cΜ
β² : CExpr gββ² β gββ²}
{c : β’ gβ β gβ}
β β’ cΜ
β cΜ
β²
β gβ ββ gββ² β gβ ββ gββ²
β β’ cΜ
β¨Ύ c β cΜ
β²
β-castr : β {gβ gββ² gβ gββ² gββ²}
{cΜ
: CExpr gβ β gβ} {cΜ
β² : CExpr gββ² β gββ²}
{cβ² : β’ gββ² β gββ²}
β β’ cΜ
β cΜ
β²
β gβ ββ gββ² β gβ ββ gββ²
β β’ cΜ
β cΜ
β² β¨Ύ cβ²
β-β₯ : β {gβ gββ² gβ gββ²} {cΜ
: CExpr gβ β gβ} {p}
β gβ ββ gββ²
β gβ ββ gββ²
β β’ cΜ
β β₯ gββ² gββ² p
data β’l_β_ : β {gβ gβ} (cΜ
: CExpr gβ β gβ) (g : Label) β Set where
β-id : β {g gβ²}
β (gβgβ² : g ββ gβ²)
β β’l id g β gβ²
β-cast : β {gβ gβ gβ gβ²}
{cΜ
: CExpr gβ β gβ}
{c : β’ gβ β gβ}
β β’l cΜ
β gβ²
β gβ ββ gβ² β gβ ββ gβ²
β β’l cΜ
β¨Ύ c β gβ²
data β’r_β_ : β {gββ² gββ²} (g : Label) (cΜ
β² : CExpr gββ² β gββ²) β Set where
β-id : β {g gβ²}
β (gβgβ² : g ββ gβ²)
β β’r g β id gβ²
β-cast : β {g gββ² gββ² gββ²}
{cΜ
β² : CExpr gββ² β gββ²}
{cβ² : β’ gββ² β gββ²}
β β’r g β cΜ
β²
β g ββ gββ² β g ββ gββ²
β β’r g β cΜ
β² β¨Ύ cβ²
β-β₯ : β {g gββ² gββ²} {p}
β g ββ gββ²
β g ββ gββ²
β β’r g β β₯ gββ² gββ² p
prec-refl : β {gβ gβ} (cΜ
: CExpr gβ β gβ) β β’ cΜ
β cΜ
prec-refl (id _) = β-id ββ-refl
prec-refl (cΜ
β¨Ύ c) = β-cast (prec-refl cΜ
) ββ-refl ββ-refl
prec-refl (β₯ _ _ p) = β-β₯ ββ-refl ββ-refl
precββ : β {gβ gββ² gβ gββ²} (cΜ
: CExpr gβ β gβ) (cΜ
β² : CExpr gββ² β gββ²)
β β’ cΜ
β cΜ
β²
β (gβ ββ gββ²) Γ (gβ ββ gββ²)
precββ (id g) (id gβ²) (β-id gβgβ²) = β¨ gβgβ² , gβgβ² β©
precββ (cΜ
β¨Ύ c) (cΜ
β² β¨Ύ cβ²) (β-cast cΜ
βcΜ
β² _ gββgββ²) =
case precββ cΜ
cΜ
β² cΜ
βcΜ
β² of Ξ» where
β¨ gββgββ² , _ β© β β¨ gββgββ² , gββgββ² β©
precββ (cΜ
β¨Ύ c) cΜ
β² (β-castl cΜ
βcΜ
β² gββgββ² gββgββ²) =
case precββ cΜ
cΜ
β² cΜ
βcΜ
β² of Ξ» where
β¨ gββgββ² , _ β© β β¨ gββgββ² , gββgββ² β©
precββ cΜ
(cΜ
β² β¨Ύ cβ²) (β-castr cΜ
βcΜ
β² gββgββ² gββgββ²) =
case precββ cΜ
cΜ
β² cΜ
βcΜ
β² of Ξ» where
β¨ gββgββ² , _ β© β β¨ gββgββ² , gββgββ² β©
precββ cΜ
(β₯ _ _ _) (β-β₯ gββgββ² gββgββ²) = β¨ gββgββ² , gββgββ² β©
prec-leftββ : β {gβ gβ gβ²} (cΜ
: CExpr gβ β gβ)
β β’l cΜ
β gβ²
β (gβ ββ gβ²) Γ (gβ ββ gβ²)
prec-leftββ (id g) (β-id gβgβ²) = β¨ gβgβ² , gβgβ² β©
prec-leftββ (cΜ
β¨Ύ c) (β-cast cΜ
βgβ² gββgβ² gββgβ²) =
β¨ projβ (prec-leftββ cΜ
cΜ
βgβ²) , gββgβ² β©
prec-rightββ : β {g gββ² gββ²} (cΜ
β² : CExpr gββ² β gββ²)
β β’r g β cΜ
β²
β (g ββ gββ²) Γ (g ββ gββ²)
prec-rightββ (id _) (β-id gβgβ²) = β¨ gβgβ² , gβgβ² β©
prec-rightββ (_ β¨Ύ _) (β-cast gβcΜ
β² x y) = β¨ projβ (prec-rightββ _ gβcΜ
β²) , y β©
prec-rightββ (β₯ _ _ _) (β-β₯ x y) = β¨ x , y β©
β-left-expand : β {gβ gβ gβ²} {cΜ
: CExpr gβ β gβ}
β β’l cΜ
β gβ²
β β’ cΜ
β id gβ²
β-left-expand (β-id gβgβ²) = β-id gβgβ²
β-left-expand (β-cast cΜ
βgβ² gββgβ² gββgβ²) = β-castl (β-left-expand cΜ
βgβ²) gββgβ² gββgβ²
β-left-contract : β {gβ gβ gβ²} {cΜ
: CExpr gβ β gβ}
β β’ cΜ
β id gβ²
β β’l cΜ
β gβ²
β-left-contract (β-id gβgβ²) = β-id gβgβ²
β-left-contract (β-castl cΜ
βid gββgβ² gββgβ²) = β-cast (β-left-contract cΜ
βid) gββgβ² gββgβ²
β-right-expand : β {g gββ² gββ²} {cΜ
β² : CExpr gββ² β gββ²}
β β’r g β cΜ
β²
β β’ id g β cΜ
β²
β-right-expand (β-id gβgβ²) = β-id gβgβ²
β-right-expand (β-cast gβcΜ
β² gβgββ² gβgββ²) = β-castr (β-right-expand gβcΜ
β²) gβgββ² gβgββ²
β-right-expand (β-β₯ gβgββ² gβgββ²) = β-β₯ gβgββ² gβgββ²
β-right-contract : β {g gββ² gββ²} {cΜ
β² : CExpr gββ² β gββ²}
β β’ id g β cΜ
β²
β β’r g β cΜ
β²
β-right-contract (β-id gβgβ²) = β-id gβgβ²
β-right-contract (β-castr idβcΜ
β² gβgββ² gβgββ²) = β-cast (β-right-contract idβcΜ
β²) gβgββ² gβgββ²
β-right-contract (β-β₯ gβgββ² gβgββ²) = β-β₯ gβgββ² gβgββ²
pres-prec-left : β {gβ gβ gβ²} {cΜ
β cΜ
β : CExpr gβ β gβ}
β β’l cΜ
β β gβ²
β cΜ
β ββ cΜ
β
β β’l cΜ
β β gβ²
pres-prec-left (β-cast prec gββgβ² gββgβ²) (ΞΎ r) =
β-cast (pres-prec-left prec r) gββgβ² gββgβ²
pres-prec-left (β-cast () x xβ) ΞΎ-β₯
pres-prec-left (β-cast prec _ _) (id x) = prec
pres-prec-left (β-cast (β-cast prec lβl ββ) ββ lβl) (?-id x) = prec
pres-prec-left (β-cast (β-cast _ lβl ββ) ββ ()) (?-β x)
pres-prec-left (β-cast (β-cast prec lβl ββ) ββ ()) (?-β₯ x)
pres-prec-left-mult : β {gβ gβ gβ²} {cΜ
β cΜ
β : CExpr gβ β gβ}
β β’l cΜ
β β gβ²
β cΜ
β ββ cΜ
β
β β’l cΜ
β β gβ²
pres-prec-left-mult prec (_ β) = prec
pres-prec-left-mult prec (_ βββ¨ r β© r*) = pres-prec-left-mult (pres-prec-left prec r) r*
pres-prec-right : β {g gβ gβ} {cΜ
β cΜ
β : CExpr gβ β gβ}
β β’r g β cΜ
β
β cΜ
β ββ cΜ
β
β β’r g β cΜ
β
pres-prec-right (β-cast prec gβgβ gβgβ) (ΞΎ r) = β-cast (pres-prec-right prec r) gβgβ gβgβ
pres-prec-right (β-cast (β-β₯ gβgβ _) _ gβgβ) ΞΎ-β₯ = β-β₯ gβgβ gβgβ
pres-prec-right (β-cast prec _ _) (id _) = prec
pres-prec-right (β-cast (β-cast prec _ _) ββ _) (?-id _) = prec
pres-prec-right (β-cast (β-cast prec _ _) ββ _) (?-β _) = β-cast prec ββ ββ
pres-prec-right (β-cast (β-cast prec _ _) _ gβlow) (?-β₯ _) = β-β₯ (projβ (prec-rightββ _ prec)) gβlow
pres-prec-right-mult : β {g gβ gβ} {cΜ
β cΜ
β : CExpr gβ β gβ}
β β’r g β cΜ
β
β cΜ
β ββ cΜ
β
β β’r g β cΜ
β
pres-prec-right-mult prec (_ β) = prec
pres-prec-right-mult prec (_ βββ¨ r β© r*) = pres-prec-right-mult (pres-prec-right prec r) r*
prec-inj-left : β {g gβ² β}
(cΜ
β : CExpr g β β) (cΜ
ββ² : CExpr gβ² β l β)
β CVal cΜ
β β CVal cΜ
ββ²
β β’ cΜ
β β cΜ
ββ² β¨Ύ β !
β β’ cΜ
β β cΜ
ββ²
prec-inj-left (cΜ
β β¨Ύ c) cΜ
ββ² v vβ² (β-cast cΜ
ββcΜ
ββ² gβββ ββ) = β-castl cΜ
ββcΜ
ββ² gβββ ββ
prec-inj-left (cΜ
β β¨Ύ id .β) cΜ
ββ² () vβ² (β-castl cΜ
ββcΜ
ββ²β¨Ύ! ββ ββ)
prec-inj-left cΜ
β cΜ
ββ² v vβ² (β-castr cΜ
ββcΜ
ββ²β¨Ύ! ββ ββ) = cΜ
ββcΜ
ββ²β¨Ύ!
prec-left-safe : β {β g gβ² p} {cΜ
: CExpr l β β g}
β β’l cΜ
β gβ²
β Β¬ (cΜ
ββ β₯ (l β) g p)
prec-left-safe (β-id gβgβ²) (.(id (l _)) βββ¨ () β© _)
prec-left-safe (β-cast prec x y) (_ βββ¨ ΞΎ r β© r*) =
prec-left-safe (β-cast (pres-prec-left prec r) x y) r*
prec-left-safe (β-cast () _ _) (_ βββ¨ ΞΎ-β₯ β© _ β)
prec-left-safe (β-cast prec _ _) (_ βββ¨ id _ β© r*) =
prec-left-safe prec r*
prec-left-safe (β-cast (β-cast prec _ _) _ _) (_ βββ¨ ?-id _ β© r*) =
prec-left-safe prec r*
prec-left-safe (β-cast (β-cast _ lβl _) _ ()) (_ βββ¨ ?-β _ β© _)
prec-left-safe (β-cast (β-cast _ lβl _) _ ()) (_ βββ¨ ?-β₯ _ β© _ β)
!ββ : β’ id (l low) β¨Ύ (low !) β id (l low) β¨Ύ β
!ββ = β-cast (β-id lβl) lβl ββ
!ββ! : β’ id (l low) β¨Ύ (low !) β id (l low) β¨Ύ β β¨Ύ (high !)
!ββ! = β-castr (β-cast (β-id lβl) lβl ββ) ββ ββ
β!ββ : β’ id (l low) β¨Ύ β β¨Ύ (high !) β id (l low) β¨Ύ β
β!ββ = β-castl (prec-refl _) lβl ββ