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.ScottModelOfIfZero
       (pt : propositional-truncations-exist)
       (fe : āˆ€ {š“¤ š“„} → funext š“¤ š“„)
       (pe : propext š“¤ā‚€)
       where

open PropositionalTruncation pt

open import DomainTheory.Basics.Curry pt fe š“¤ā‚€
open import DomainTheory.Basics.Exponential 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.Combinatory.PCFCombinators pt fe š“¤ā‚€
open import PCF.Lambda.AbstractSyntax pt
open import PCF.Lambda.ScottModelOfContexts pt fe pe

open DcpoProductsGeneral š“¤ā‚€
open IfZeroDenotationalSemantics pe


⦅ifZero⦆-uncurried' : DCPO⊄[ š“›įµˆā„• Ć—įµˆį¶œįµ–įµ’āŠ„ š“›įµˆā„• , š“›įµˆā„• āŸ¹įµˆį¶œįµ–įµ’āŠ„ š“›įµˆā„• ]
⦅ifZero⦆-uncurried' = uncurryįµˆį¶œįµ–įµ’āŠ„ š“›įµˆā„• š“›įµˆā„• (š“›įµˆā„• āŸ¹įµˆį¶œįµ–įµ’āŠ„ š“›įµˆā„•) ⦅ifZero⦆

⦅ifZero⦆-uncurried : DCPO⊄[ (š“›įµˆā„• Ć—įµˆį¶œįµ–įµ’āŠ„ š“›įµˆā„•) Ć—įµˆį¶œįµ–įµ’āŠ„ š“›įµˆā„• , š“›įµˆā„• ]
⦅ifZero⦆-uncurried = uncurryįµˆį¶œįµ–įµ’āŠ„ (š“›įµˆā„• Ć—įµˆį¶œįµ–įµ’āŠ„ š“›įµˆā„•) š“›įµˆā„• š“›įµˆā„• ⦅ifZero⦆-uncurried'

module _ {n : ā„•} (Ī“ : Context n) where

  ⦅ifZero⦆-arguments : DCPO⊄[ 怐 Ī“ 怑 , š“›įµˆā„• ]
                      → DCPO⊄[ 怐 Ī“ 怑 , š“›įµˆā„• ]
                      → DCPO⊄[ 怐 Ī“ 怑 , š“›įµˆā„• ]
                      → DCPO⊄[ 怐 Ī“ 怑 , (š“›įµˆā„• Ć—įµˆį¶œįµ–įµ’āŠ„ š“›įµˆā„•) Ć—įµˆį¶œįµ–įµ’āŠ„ š“›įµˆā„• ]
  ⦅ifZero⦆-arguments a b c = to-Ɨ-DCPO⊄ 怐 Ī“ 怑 (š“›įµˆā„• Ć—įµˆį¶œįµ–įµ’āŠ„ š“›įµˆā„•) š“›įµˆā„• f c
     where
      f : DCPO⊄[ 怐 Ī“ 怑 , š“›įµˆā„• Ć—įµˆį¶œįµ–įµ’āŠ„ š“›įµˆā„• ]
      f = to-Ɨ-DCPO⊄ 怐 Ī“ 怑 š“›įµˆā„• š“›įµˆā„• a b

  ⦅ifZero⦆Γ : DCPO⊄[ 怐 Ī“ 怑 , š“›įµˆā„• ]
              → DCPO⊄[ 怐 Ī“ 怑 , š“›įµˆā„• ]
              → DCPO⊄[ 怐 Ī“ 怑 , š“›įµˆā„• ]
              → DCPO⊄[ 怐 Ī“ 怑 , š“›įµˆā„• ]
  ⦅ifZero⦆Γ a b c = [ 怐 Ī“ 怑 , (š“›įµˆā„• Ć—įµˆį¶œįµ–įµ’āŠ„ š“›įµˆā„•) Ć—įµˆį¶œįµ–įµ’āŠ„ š“›įµˆā„• , š“›įµˆā„• ]
                       ⦅ifZero⦆-uncurried āˆ˜įµˆį¶œįµ–įµ’āŠ„ (⦅ifZero⦆-arguments a b c)
\end{code}