\begin{code}
{-# OPTIONS --cubical --safe #-}

module Snippets.Bool where

open import Level

module BoolDefn where
\end{code}
%<*bool-def>
\begin{code}
  data Bool : Type₀ where
    false  : Bool
    true   : Bool
\end{code}
%</bool-def>
\begin{code}

open import Data.Bool hiding (not)
open import Prelude hiding (_∧_; not)

\end{code}
%<*bool-val>
\begin{code}
a-boolean : Bool
a-boolean = true
\end{code}
%</bool-val>
\begin{code}
module LambdaNot where
\end{code}
%<*lambda-not>
\begin{code}
  not : Bool  Bool
  not = λ  { false   true
            ; true    false
            }
\end{code}
%</lambda-not>
%<*not-def>
\begin{code}
not : Bool  Bool
not false  = true
not true   = false
\end{code}
%</not-def>
\begin{code}
infixl 6 _∧_
\end{code}
%<*and-def>
\begin{code}
_∧_ : Bool  Bool  Bool
false   false  = false
false   true   = false
true    false  = false
true    true   = true
\end{code}
%</and-def>
\begin{code}
open import Cardinality.Finite.SplitEnumerable
open import Cardinality.Finite.SplitEnumerable.Search
open import Cardinality.Finite.SplitEnumerable.Instances
open import Cardinality.Finite.SplitEnumerable.Inductive
open import Cardinality.Finite.SplitEnumerable.Isomorphism
open import Cardinality.Finite.ManifestBishop
open import Data.Bool.Properties using (discreteBool)

infixl 4 _≟_
_≟_ = discreteBool
\end{code}
%<*bool-assoc-auto-proof>
\begin{code}
∧-assoc :  x y z  (x  y)  z  x  (y  z)
∧-assoc = ∀↯ⁿ 3 λ x y z  (x  y)  z  x  (y  z)
\end{code}
%</bool-assoc-auto-proof>
%<*some-assoc>
\begin{code}
some-assoc : Σ[ f  (Bool  Bool  Bool) ]  x y z  f (f x y) z  f x (f y z)
some-assoc = ∃↯ⁿ 1 λ f  ∀?ⁿ 3 λ x y z  f (f x y) z  f x (f y z)
\end{code}
%</some-assoc>
%<*obvious>
\begin{code}
obvious : true  false  false
obvious = refl
\end{code}
%</obvious>
\begin{code}
\end{code}
%<*is-true>
\begin{code}
True : Dec A  Type₀
True (yes  _) = 
True (no   _) = 
\end{code}
%</is-true>
%<*from-true>
\begin{code}
toWitness :  (decision : Dec A) 
            { _ : True decision }  A
toWitness (yes x) = x
\end{code}
%</from-true>
\begin{code}
open import Relation.Nullary.Decidable.Logic
open import Relation.Nullary.Decidable

from-true : (dec : Dec A)  { _ : T (does dec) }  A
from-true (yes p) = p
\end{code}
%<*extremely-obvious>
\begin{code}
extremely-obvious : true  false
extremely-obvious = from-true (! (true  false))
\end{code}
%</extremely-obvious>
\begin{code}
module PreInst′ where
  open PreInst
\end{code}
%<*pre-inst-proof>
\begin{code}
  ∧-idem :  x  x  x  x
  ∧-idem = ∀↯ ℰ!⟨2⟩ λ x  x  x  x
\end{code}
%</pre-inst-proof>
\begin{code}
open WithInst
\end{code}
%<*with-inst-proof>
\begin{code}
∧-idem :  x  x  x  x
∧-idem = ∀↯ λ x  x  x  x
\end{code}
%</with-inst-proof>
\begin{code}
module BadCurrying where
\end{code}
%<*and-comm>
\begin{code}
  ∧-comm :  x y  x  y  y  x
  ∧-comm = curry (∀↯ (uncurry  x y  x  y  y  x )))
\end{code}
%</and-comm>
\begin{code}
open import Data.Fin
\end{code}
%<*finite-sigma-inst>
\begin{code}
_ : ℰ! (Σ[ s  Bool ] (if s then Fin 3 else Fin 4))
_ = it
\end{code}
%</finite-sigma-inst>
%<*and-comm-auto>
\begin{code}
∧-comm :  x y  x  y  y  x
∧-comm = ∀↯ⁿ 2 λ x y  x  y  y  x
\end{code}
%</and-comm-auto>

%<*boolean>
\begin{code}
Boolean : Type₀
Boolean = Bool
\end{code}
%</boolean>
\begin{code}
open BoolDefn public
\end{code}