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}