module Chapter7.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 ; suc)
open import Data.Fin hiding (pred ; suc)
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 Chapter4.Desc
open import Chapter4.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 { : Level}(P : Desc   Set) : Set (suc (suc )) where
  field
    subUniverse : Desc   Set (suc )
    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