\begin{code}
module PCF.Environments where
open import Data.Bool.Base
using (Bool; if_then_else_)
open import Data.Maybe.Base
using (Maybe; just; nothing)
open import Agda.Builtin.Nat
using (Nat; _==_)
open import Relation.Binary.PropositionalEquality.Core
using (_ā”_; refl; trans; cong)
open import PCF.Domain-Notation
using (ā„)
open import PCF.Types
using (Types; Ī¹; o; _ā_; š)
open import PCF.Variables
using (š±; var; Env)
Ļā„ : Env
Ļā„ Ī± = ā„
_[_/_] : {Ļ : Types} ā Env ā š Ļ ā š± Ļ ā Env
Ļ [ x / Ī± ] = Ī» Ī±ā² ā h Ļ x Ī± Ī±ā² (Ī± ==V Ī±ā²) where
h : {Ļ Ļ : Types} ā Env ā š Ļ ā š± Ļ ā š± Ļ ā Maybe (Ļ ā” Ļ) ā š Ļ
h Ļ x Ī± Ī±ā² (just refl) = x
h Ļ x Ī± Ī±ā² nothing = Ļ Ī±ā²
_==T_ : (Ļ Ļ : Types) ā Maybe (Ļ ā” Ļ)
(Ļ ā Ļ) ==T (Ļā² ā Ļā²) = f (Ļ ==T Ļā²) (Ļ ==T Ļā²) where
f : Maybe (Ļ ā” Ļā²) ā Maybe (Ļ ā” Ļā²) ā Maybe ((Ļ ā Ļ) ā” (Ļā² ā Ļā²))
f = Ī» { (just p) (just q) ā just (trans (cong (_ā Ļ) p) (cong (Ļā² ā_) q))
; _ _ ā nothing }
Ī¹ ==T Ī¹ = just refl
o ==T o = just refl
_ ==T _ = nothing
_==V_ : {Ļ Ļ : Types} ā š± Ļ ā š± Ļ ā Maybe (Ļ ā” Ļ)
var i Ļ ==V var iā² Ļ =
if i == iā² then Ļ ==T Ļ else nothing
\end{code}