open import 1Lab.Prelude

open import Data.Partial.Total
open import Data.Partial.Base
open import Data.Vec.Base

open import Realisability.PCA

import Realisability.PCA.Sugar as S
module Realisability.Data.Bool {β„“} (𝔸@(A , _) : PCA β„“) where
open S 𝔸
private variable
  a b : β†― ⌞ 𝔸 ⌟

Booleans in a PCAπŸ”—

`true : ↯⁺ 𝔸
`true = val ⟨ x ⟩ ⟨ y ⟩ x

`false : ↯⁺ 𝔸
`false = val ⟨ x ⟩ ⟨ y ⟩ y

`not : ↯⁺ A
`not = val ⟨ x ⟩ x `· `false `· `true

abstract
  `true↓₁ : ⌞ a ⌟ β†’ ⌞ `true ⋆ a ⌟
  `true↓₁ x = subst ⌞_⌟ (sym (abs-Ξ²β‚™ [] ((_ , x) ∷ []))) (abs↓ _ _)

  `false↓₁ : ⌞ a ⌟ β†’ ⌞ `false .fst % a ⌟
  `false↓₁ ah = subst ⌞_⌟ (sym (abs-Ξ²β‚™ [] ((_ , ah) ∷ []))) (abs↓ _ _)

  `false-Ξ² : ⌞ a ⌟ β†’ ⌞ b ⌟ β†’ `false ⋆ a ⋆ b ≑ b
  `false-Ξ² {a} {b} ah bh = abs-Ξ²β‚™ [] ((b , bh) ∷ (a , ah) ∷ [])

  `true-Ξ² : ⌞ a ⌟ β†’ ⌞ b ⌟ β†’ `true ⋆ a ⋆ b ≑ a
  `true-Ξ² {a} {b} ah bh = abs-Ξ²β‚™ [] ((b , bh) ∷ (a , ah) ∷ [])

  `not-Ξ²t : `not ⋆ `true ≑ `false .fst
  `not-Ξ²t = abs-Ξ² _ [] `true βˆ™ abs-Ξ²β‚™ [] (`true ∷ `false ∷ [])

  `not-Ξ²f : `not ⋆ `false ≑ `true .fst
  `not-Ξ²f = abs-Ξ² _ [] `false βˆ™ abs-Ξ²β‚™ [] (`true ∷ `false ∷ [])