Brendan Hart 2019-2020

\begin{code}

{-# OPTIONS --safe --without-K #-}

open import MLTT.Spartan
open import UF.FunExt
open import UF.PropTrunc
open import UF.Subsingletons

module PCF.Lambda.ScottModelOfContexts
        (pt : propositional-truncations-exist)
        (fe :  {𝓤 𝓥}  funext 𝓤 𝓥)
        (pe : propext 𝓤₀)
       where

open PropositionalTruncation pt

open import DomainTheory.Basics.Dcpo pt fe 𝓤₀
open import DomainTheory.Basics.FunctionComposition pt fe 𝓤₀
open import DomainTheory.Basics.Pointed pt fe 𝓤₀
open import DomainTheory.Basics.Products pt fe
open import PCF.Lambda.AbstractSyntax pt
open import PCF.Lambda.ScottModelOfTypes pt fe pe
open import OrderedTypes.Poset fe
open import UF.Sets
open import UF.Subsingletons-Properties

open DcpoProductsGeneral 𝓤₀
open PosetAxioms

⊤ᵈᶜᵖᵒ : DCPO {𝓤₁} {𝓤₁}
⊤ᵈᶜᵖᵒ = 𝟙 , _⊑⟨⊤⟩_ , (s , p ,  _  ) , t , a) , dc
 where
   _⊑⟨⊤⟩_ : 𝟙 {𝓤₁}  𝟙 {𝓤₁}  𝓤₁ ̇
   x ⊑⟨⊤⟩ y = 𝟙

   s : is-set 𝟙
   s = props-are-sets 𝟙-is-prop

   p : is-prop-valued {𝓤₁} {𝓤₁} {𝟙}  x y  𝟙)
   p _ _   = refl

   r : is-reflexive _⊑⟨⊤⟩_
   r _ = 

   t : is-transitive {𝓤₁} {𝓤₁} {𝟙}  x y  𝟙)
   t _ _ _ _ _ = 

   a :  (x : 𝟙) y  x ⊑⟨⊤⟩ y  _  x  y
   a   _ _ = refl

   dc : is-directed-complete  x y  𝟙)
   dc _ _ _ =  , ((λ _  ) ,  _ _  ))

⊤ᵈᶜᵖᵒ⊥ : DCPO⊥ {𝓤₁} {𝓤₁}
⊤ᵈᶜᵖᵒ⊥ = ⊤ᵈᶜᵖᵒ , ( ,  y  ))

【_】 : {n : } (Γ : Context n)  DCPO⊥ {𝓤₁} {𝓤₁}
 ⟨⟩  = ⊤ᵈᶜᵖᵒ⊥
 Γ  x  =  Γ  ×ᵈᶜᵖᵒ⊥  x 

extract : {n : } {σ : type} {Γ : Context n}
         (x : Γ  σ)
         ( Γ  )   ( σ  )
extract {n} {σ} {a} Z d = pr₂ d
extract {n} {σ₁} {Γ  σ} (S x) d = extract x (pr₁ d)

Γ₁⊑Γ₂→lookups-less : {n : } {Γ : Context n} {σ : type}
                    (x : ( Γ  ))
                    (y : ( Γ  ))
                    x ⊑⟨( Γ  ) y
                    (z : Γ  σ)
                    extract z x ⊑⟨( σ  ) extract z y
Γ₁⊑Γ₂→lookups-less {.(succ _)} {Γ  σ} {.σ} x y e Z     = pr₂ e
Γ₁⊑Γ₂→lookups-less {.(succ _)} {Γ  τ} {σ}  x y e (S z) =
 Γ₁⊑Γ₂→lookups-less (pr₁ x) (pr₁ y) (pr₁ e) z

∘-of-prₓ-is-continuous : {n : } {Γ : Context n} {σ : type} (x : Γ  σ)
                        is-continuous ( Γ  ) ( σ  ) (extract x)
∘-of-prₓ-is-continuous {n} {Γ  σ} {σ} Z =
 continuity-of-function ( Γ  σ  ) ( σ  )
  (pr₂-is-continuous ( Γ  ) ( σ  ))

∘-of-prₓ-is-continuous {n} {Γ  τ} {σ} (S x) =
 continuity-of-function ( Γ  τ  ) ( σ  )
  ([ ( Γ  τ  ) , ( Γ  ) , ( σ  ) ] (extract x) ,
   ∘-of-prₓ-is-continuous x ∘ᵈᶜᵖᵒ pr₁-is-continuous ( Γ  ) ( τ  ))

var-DCPO : {n : } {σ : type} (Γ : Context n) (x : Γ  σ)
          DCPO[ ( Γ  ) , ( σ  ) ]
var-DCPO {n} {σ} Γ x = extract x , c
 where
  c : is-continuous ( Γ  ) ( σ  ) (extract x)
  c = ∘-of-prₓ-is-continuous x

var-DCPO⊥ : {n : } {σ : type} (Γ : Context n)
           (x : Γ  σ)→ DCPO⊥[  Γ  ,  σ  ]
var-DCPO⊥ Γ x = var-DCPO Γ x