module Chapter4.Derivable where

open import Function

open import Level

open import Data.Bool 
open import Data.Empty
open import Data.Maybe hiding (Eq)
open import Data.Unit hiding (_≟_)
open import Data.Nat hiding (compare ; _≟_ ; pred)
open import Data.Fin hiding (pred)
open import Data.Product
open import Data.Sum

open import Relation.Nullary
open import Relation.Nullary.Decidable
open import Relation.Binary
open import Relation.Binary.PropositionalEquality

open import Chapter2.Desc
open import Chapter2.Desc.Fixpoint



SemiDec : ∀{}  Set   Set 
SemiDec A = Maybe A

IsTrue :  {} {P : Set }  SemiDec P  Set
IsTrue (just _) = 
IsTrue nothing = 

toSemiWitness : ∀{} {P : Set } {Q : SemiDec P}  IsTrue Q  P
toSemiWitness {Q = just p} _  = p
toSemiWitness {Q = nothing} ()


record Derive (P : Desc  Set) : Set₂ where
  field
    subUniverse : Desc  Set₁
    belongTo : (D : Desc)  SemiDec (subUniverse D)
    derive : {D : Desc}  subUniverse D  P D

deriving : ∀{P}  (prop : Derive P)(D : Desc)  IsTrue (Derive.belongTo prop D)  P D
deriving prop D q = Derive.derive prop (toSemiWitness {Q = belongTo D} q)
  where open Derive prop