{-# OPTIONS --without-K --exact-split #-}

open import Data.Product

-- Type of Coinductive predicates
-- See Appendix B of
-- "A topological reading of coinductive
--  predicates in Dependent Type Theory"

module Coinductive.Constructors.Coind-types
  {A : Set}
  (I : A  Set)
  (C : (a : A)  I a  A  Set)
  where

  postulate
    CoInd : A  Set
    El : (a : A) (i : I a) (p : CoInd a)  Σ A λ b  C a i b × CoInd b
    coind :
       {P : A  Set}
       (c :  a i  P a  Σ A λ b  C a i b × P b)
       (a : A)  P a  CoInd a