module LinearScan.Eqtype where
import Debug.Trace (trace, traceShow, traceShowId)
import qualified Prelude
import qualified Data.IntMap
import qualified Data.IntSet
import qualified Data.List
import qualified Data.Ord
import qualified Data.Functor.Identity
import qualified Hask.Utils
import qualified LinearScan.Ssrbool as Ssrbool
import qualified LinearScan.Ssrfun as Ssrfun
#ifdef __GLASGOW_HASKELL__
import qualified GHC.Base as GHC.Base
import qualified GHC.Prim as GHC.Prim
#else
import qualified LinearScan.IOExts as IOExts
#endif
#ifdef __GLASGOW_HASKELL__
unsafeCoerce = GHC.Base.unsafeCoerce#
#else
unsafeCoerce = IOExts.unsafeCoerce
#endif
#ifdef __GLASGOW_HASKELL__
type Any = GHC.Prim.Any
#else
type Any = ()
#endif
__ :: any
__ = Prelude.error "Logical or arity value used"
type Equality__Coq_axiom t = t -> t -> Ssrbool.Coq_reflect
data Equality__Coq_mixin_of t =
Equality__Mixin (Ssrbool.Coq_rel t) (Equality__Coq_axiom t)
_Equality__op :: (Equality__Coq_mixin_of a1) -> Ssrbool.Coq_rel a1
_Equality__op m =
case m of {
Equality__Mixin op0 x -> op0}
type Equality__Coq_type =
Equality__Coq_mixin_of Any
type Equality__Coq_sort = Any
_Equality__coq_class :: Equality__Coq_type -> Equality__Coq_mixin_of
Equality__Coq_sort
_Equality__coq_class cT =
cT
eq_op :: Equality__Coq_type -> Ssrbool.Coq_rel Equality__Coq_sort
eq_op t =
_Equality__op (_Equality__coq_class t)
eqP :: Equality__Coq_type -> Equality__Coq_axiom Equality__Coq_sort
eqP t =
let {_evar_0_ = \op0 a -> a} in
case t of {
Equality__Mixin x x0 -> _evar_0_ x x0}
eqbP :: Equality__Coq_axiom Prelude.Bool
eqbP _top_assumption_ =
let {
_evar_0_ = \_top_assumption_0 ->
let {_evar_0_ = Ssrbool.ReflectT} in
let {_evar_0_0 = Ssrbool.ReflectF} in
case _top_assumption_0 of {
Prelude.True -> _evar_0_;
Prelude.False -> _evar_0_0}}
in
let {
_evar_0_0 = \_top_assumption_0 ->
let {_evar_0_0 = Ssrbool.ReflectF} in
let {_evar_0_1 = Ssrbool.ReflectT} in
case _top_assumption_0 of {
Prelude.True -> _evar_0_0;
Prelude.False -> _evar_0_1}}
in
case _top_assumption_ of {
Prelude.True -> _evar_0_;
Prelude.False -> _evar_0_0}
bool_eqMixin :: Equality__Coq_mixin_of Prelude.Bool
bool_eqMixin =
Equality__Mixin (Prelude.==) eqbP
bool_eqType :: Equality__Coq_type
bool_eqType =
unsafeCoerce bool_eqMixin
data Coq_subType t =
SubType (Any -> t) (t -> () -> Any) (() -> (t -> () -> Any) -> Any -> Any)
type Coq_sub_sort t = Any
val :: (Ssrbool.Coq_pred a1) -> (Coq_subType a1) -> (Coq_sub_sort a1) -> a1
val p s =
case s of {
SubType val0 sub x -> val0}
coq_Sub :: (Ssrbool.Coq_pred a1) -> (Coq_subType a1) -> a1 -> Coq_sub_sort a1
coq_Sub p s x =
case s of {
SubType val0 sub x0 -> sub x __}
insub :: (Ssrbool.Coq_pred a1) -> (Coq_subType a1) -> a1 -> Prelude.Maybe
(Coq_sub_sort a1)
insub p sT x =
case Ssrbool.idP (p x) of {
Ssrbool.ReflectT -> Prelude.Just (coq_Sub p sT x);
Ssrbool.ReflectF -> Prelude.Nothing}
insubd :: (Ssrbool.Coq_pred a1) -> (Coq_subType a1) -> (Coq_sub_sort
a1) -> a1 -> Coq_sub_sort a1
insubd p sT u0 x =
Ssrfun._Option__coq_default u0 (insub p sT x)
sig_subType :: (Ssrbool.Coq_pred a1) -> Coq_subType a1
sig_subType p =
SubType (unsafeCoerce ) (unsafeCoerce (\x _ -> x)) (\_ k_S u ->
k_S (unsafeCoerce u) __)
inj_eqAxiom :: Equality__Coq_type -> (a1 -> Equality__Coq_sort) ->
Equality__Coq_axiom a1
inj_eqAxiom eT f x y =
Ssrbool.iffP (eq_op eT (f x) (f y)) (eqP eT (f x) (f y))
val_eqP :: Equality__Coq_type -> (Ssrbool.Coq_pred Equality__Coq_sort) ->
(Coq_subType Equality__Coq_sort) -> Equality__Coq_axiom
(Coq_sub_sort Equality__Coq_sort)
val_eqP t p sT =
inj_eqAxiom t (val p sT)
sig_eqMixin :: Equality__Coq_type -> (Ssrbool.Coq_pred Equality__Coq_sort) ->
Equality__Coq_mixin_of Equality__Coq_sort
sig_eqMixin t p =
Equality__Mixin (\x y -> eq_op t ( x) ( y))
(unsafeCoerce (val_eqP t (\x -> p x) (sig_subType p)))
sig_eqType :: Equality__Coq_type -> (Ssrbool.Coq_pred Equality__Coq_sort) ->
Equality__Coq_type
sig_eqType t p =
unsafeCoerce (sig_eqMixin t p)
pair_eq :: Equality__Coq_type -> Equality__Coq_type -> Ssrbool.Coq_simpl_rel
((,) Equality__Coq_sort Equality__Coq_sort)
pair_eq t1 t2 =
(\u v ->
(Prelude.&&) (eq_op t1 (Prelude.fst u) (Prelude.fst v))
(eq_op t2 (Prelude.snd u) (Prelude.snd v)))
pair_eqP :: Equality__Coq_type -> Equality__Coq_type -> Equality__Coq_axiom
((,) Equality__Coq_sort Equality__Coq_sort)
pair_eqP t1 t2 _top_assumption_ =
let {
_evar_0_ = \x1 x2 _top_assumption_0 ->
let {
_evar_0_ = \y1 y2 ->
Ssrbool.iffP ((Prelude.&&) (eq_op t1 x1 y1) (eq_op t2 x2 y2))
(Ssrbool.andP (eq_op t1 x1 y1) (eq_op t2 x2 y2))}
in
case _top_assumption_0 of {
(,) x x0 -> _evar_0_ x x0}}
in
case _top_assumption_ of {
(,) x x0 -> _evar_0_ x x0}
prod_eqMixin :: Equality__Coq_type -> Equality__Coq_type ->
Equality__Coq_mixin_of
((,) Equality__Coq_sort Equality__Coq_sort)
prod_eqMixin t1 t2 =
Equality__Mixin (Ssrbool.rel_of_simpl_rel (pair_eq t1 t2)) (pair_eqP t1 t2)
prod_eqType :: Equality__Coq_type -> Equality__Coq_type -> Equality__Coq_type
prod_eqType t1 t2 =
unsafeCoerce (prod_eqMixin t1 t2)
opt_eq :: Equality__Coq_type -> (Prelude.Maybe Equality__Coq_sort) ->
(Prelude.Maybe Equality__Coq_sort) -> Prelude.Bool
opt_eq t u v =
Ssrfun._Option__apply (\x ->
Ssrfun._Option__apply (eq_op t x) Prelude.False v)
(Prelude.not (Ssrbool.isSome v)) u
opt_eqP :: Equality__Coq_type -> Equality__Coq_axiom
(Prelude.Maybe Equality__Coq_sort)
opt_eqP t _top_assumption_ =
let {
_evar_0_ = \x _top_assumption_0 ->
let {_evar_0_ = \y -> Ssrbool.iffP (eq_op t x y) (eqP t x y)} in
let {_evar_0_0 = Ssrbool.ReflectF} in
case _top_assumption_0 of {
Prelude.Just x0 -> _evar_0_ x0;
Prelude.Nothing -> _evar_0_0}}
in
let {
_evar_0_0 = \_top_assumption_0 ->
let {_evar_0_0 = \y -> Ssrbool.ReflectF} in
let {_evar_0_1 = Ssrbool.ReflectT} in
case _top_assumption_0 of {
Prelude.Just x -> _evar_0_0 x;
Prelude.Nothing -> _evar_0_1}}
in
case _top_assumption_ of {
Prelude.Just x -> _evar_0_ x;
Prelude.Nothing -> _evar_0_0}
option_eqMixin :: Equality__Coq_type -> Equality__Coq_mixin_of
(Prelude.Maybe Equality__Coq_sort)
option_eqMixin t =
Equality__Mixin (opt_eq t) (opt_eqP t)
option_eqType :: Equality__Coq_type -> Equality__Coq_type
option_eqType t =
unsafeCoerce (option_eqMixin t)
sum_eq :: Equality__Coq_type -> Equality__Coq_type -> (Prelude.Either
Equality__Coq_sort Equality__Coq_sort) -> (Prelude.Either
Equality__Coq_sort Equality__Coq_sort) -> Prelude.Bool
sum_eq t1 t2 u v =
case u of {
Prelude.Left x ->
case v of {
Prelude.Left y -> eq_op t1 x y;
Prelude.Right s -> Prelude.False};
Prelude.Right x ->
case v of {
Prelude.Left s -> Prelude.False;
Prelude.Right y -> eq_op t2 x y}}
sum_eqP :: Equality__Coq_type -> Equality__Coq_type -> Equality__Coq_axiom
(Prelude.Either Equality__Coq_sort Equality__Coq_sort)
sum_eqP t1 t2 _top_assumption_ =
let {
_evar_0_ = \x _top_assumption_0 ->
let {_evar_0_ = \y -> Ssrbool.iffP (eq_op t1 x y) (eqP t1 x y)} in
let {_evar_0_0 = \y -> Ssrbool.ReflectF} in
case _top_assumption_0 of {
Prelude.Left x0 -> _evar_0_ x0;
Prelude.Right x0 -> _evar_0_0 x0}}
in
let {
_evar_0_0 = \x _top_assumption_0 ->
let {_evar_0_0 = \y -> Ssrbool.ReflectF} in
let {_evar_0_1 = \y -> Ssrbool.iffP (eq_op t2 x y) (eqP t2 x y)} in
case _top_assumption_0 of {
Prelude.Left x0 -> _evar_0_0 x0;
Prelude.Right x0 -> _evar_0_1 x0}}
in
case _top_assumption_ of {
Prelude.Left x -> _evar_0_ x;
Prelude.Right x -> _evar_0_0 x}
sum_eqMixin :: Equality__Coq_type -> Equality__Coq_type ->
Equality__Coq_mixin_of
(Prelude.Either Equality__Coq_sort Equality__Coq_sort)
sum_eqMixin t1 t2 =
Equality__Mixin (sum_eq t1 t2) (sum_eqP t1 t2)
sum_eqType :: Equality__Coq_type -> Equality__Coq_type -> Equality__Coq_type
sum_eqType t1 t2 =
unsafeCoerce (sum_eqMixin t1 t2)