open import Paths
open import Logic::HLevels
open import Logic::Dec
import Logic::False as False

open data PropTrunc (A : Type)
| inj A
| trunc : isProp (PropTrunc A)

variable A B : Type

def rec (p : isProp B) (f : AB) : PropTrunc AB
| p, f, inj af a
| p, f, trunc a b ip (rec p f a) (rec p f b) i

def decidable (d : Dec A) (p : PropTrunc A) : A
| yes d, pd
| no d, pFalse::elim (rec False::FalseProp d p)

def join (p : PropTrunc (PropTrunc A)) : PropTrunc A
  // TODO: investigate the scope errorrec (\a b itrunc {A} a b i) (\xx) p