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.ScottModelOfTerms
        (pt : propositional-truncations-exist)
        (fe : βˆ€ {𝓀 π“₯} β†’ funext 𝓀 π“₯)
        (pe : propext 𝓀₀)
       where

open PropositionalTruncation pt

open import DomainTheory.Basics.Curry pt fe 𝓀₀
open import DomainTheory.Basics.FunctionComposition pt fe 𝓀₀
open import DomainTheory.Basics.LeastFixedPoint pt fe 𝓀₀
open import DomainTheory.Basics.Miscelanea pt fe 𝓀₀
open import DomainTheory.Basics.Pointed pt fe 𝓀₀
open import DomainTheory.Basics.Products pt fe
open import DomainTheory.Lifting.LiftingSet pt fe 𝓀₀ pe
open import Lifting.Construction 𝓀₀
open import Lifting.Monad 𝓀₀ hiding (ΞΌ)
open import Naturals.Properties
open import PCF.Lambda.AbstractSyntax pt
open import PCF.Lambda.ScottModelOfContexts pt fe pe
open import PCF.Lambda.ScottModelOfIfZero pt fe pe
open import PCF.Lambda.ScottModelOfTypes pt fe pe
open import UF.DiscreteAndSeparated

open DcpoProductsGeneral 𝓀₀

⟦_βŸ§β‚‘ : {n : β„•} {Ξ“ : Context n} {Οƒ : type} (t : PCF Ξ“ Οƒ)
     β†’ DCPOβŠ₯[ 【 Ξ“ 】 , ⟦ Οƒ ⟧ ]

⟦ Zero {_} {Ξ“} βŸ§β‚‘ =
 (Ξ» _ β†’ Ξ· zero) , constant-functions-are-continuous (【 Ξ“ 】 ⁻) (⟦ ΞΉ ⟧ ⁻)

⟦ Succ {_} {Ξ“} t βŸ§β‚‘ =
 [ 【 Ξ“ 】 , ⟦ ΞΉ ⟧ , ⟦ ΞΉ ⟧ ]
 (𝓛̇ succ , 𝓛̇-continuous β„•-is-set β„•-is-set succ) βˆ˜α΅ˆαΆœα΅–α΅’βŠ₯ ⟦ t βŸ§β‚‘

⟦ Pred {_} {Ξ“} t βŸ§β‚‘ =
 [ 【 Ξ“ 】 , ⟦ ΞΉ ⟧ , ⟦ ΞΉ ⟧ ]
 (𝓛̇ pred , 𝓛̇-continuous β„•-is-set β„•-is-set pred) βˆ˜α΅ˆαΆœα΅–α΅’βŠ₯ ⟦ t βŸ§β‚‘

⟦ IfZero {_} {Ξ“} t t₁ tβ‚‚ βŸ§β‚‘ =
 β¦…ifZero⦆Γ Ξ“ ⟦ t₁ βŸ§β‚‘ ⟦ tβ‚‚ βŸ§β‚‘ ⟦ t βŸ§β‚‘

⟦ Ζ› {_} {Ξ“} {Οƒ} {Ο„} t βŸ§β‚‘ =
 curryα΅ˆαΆœα΅–α΅’βŠ₯ 【 Ξ“ 】 ⟦ Οƒ ⟧ ⟦ Ο„ ⟧ ⟦ t βŸ§β‚‘

⟦ _Β·_ {_} {Ξ“} {Οƒ} {Ο„} t t₁ βŸ§β‚‘ =
 [ 【 Ξ“ 】 , ( ⟦ Οƒ β‡’ Ο„ ⟧ Γ—α΅ˆαΆœα΅–α΅’βŠ₯ ⟦ Οƒ ⟧) , ⟦ Ο„ ⟧ ]
 (evalβŠ₯ ⟦ Οƒ ⟧ ⟦ Ο„ ⟧) βˆ˜α΅ˆαΆœα΅–α΅’βŠ₯ (to-Γ—-DCPOβŠ₯ 【 Ξ“ 】 ⟦ Οƒ β‡’ Ο„ ⟧ ⟦ Οƒ ⟧ ⟦ t βŸ§β‚‘ ⟦ t₁ βŸ§β‚‘)

⟦ v {_} {Ξ“} x βŸ§β‚‘ =
 var-DCPOβŠ₯ Ξ“ x

⟦ Fix {_} {Ξ“} {Οƒ} t βŸ§β‚‘ =
 [ 【 Ξ“ 】 , ⟦ Οƒ β‡’ Οƒ ⟧ , ⟦ Οƒ ⟧ ] (ΞΌ ⟦ Οƒ ⟧) βˆ˜α΅ˆαΆœα΅–α΅’βŠ₯ ⟦ t βŸ§β‚‘

\end{code}