use super::*;
use bool_alg::*;
#[derive(Copy, Clone)]
pub struct FEq(());
pub type Equal<X, A, B> = App<App<FEq, X>, Tup<A, B>>;
pub fn equal_ty<T: Prop>(_ty_t: Ty<T, Type<Z>>) -> Ty<App<FEq, T>, Pow<Bool, Tup<T, T>>> {
unimplemented!()
}
pub fn implicit_equal_is_const() -> IsConst<FEq> {unimplemented!()}
pub fn equal_is_const<T: Prop>(_: IsConst<T>) -> IsConst<App<FEq, T>> {unimplemented!()}
pub fn equal_refl<X: Prop, A: Prop>(_ty_a: Ty<A, X>) -> Eq<Equal<X, A, A>, Tr> {unimplemented!()}
pub fn equal_symmetry<X: Prop, A: Prop, B: Prop>(_: Equal<X, A, B>) -> Equal<X, B, A> {
unimplemented!()
}
pub fn equal_transitivity<X: Prop, A: Prop, B: Prop, C: Prop>(
_: Equal<X, A, B>,
_: Equal<X, B, C>
) -> Equal<X, A, C> {unimplemented!()}
pub fn equal_from_para_eq<X: Prop, A: Prop, B: Prop>(
_: Ty<A, X>,
_: Ty<B, X>,
_: Para<Eq<A, B>>
) -> Eq<Equal<X, A, B>, Fa> {unimplemented!()}
pub fn equal_lift<X: Prop, A: Prop, B: Prop>(
ty_a: Ty<A, X>,
x: Eq<A, B>
) -> Eq<Equal<X, A, B>, Tr> {
eq::eq_left(app_eq(tup_eq_snd(x))).0(equal_refl(ty_a))
}
pub fn equal_fa_lower<X: Prop, A: Prop, B: Prop>(
ty_a: Ty<A, X>,
x: Eq<Equal<X, A, B>, Fa>
) -> Not<Eq<A, B>> {
Rc::new(move |eq_ab| para_eq_tr_fa(eq::in_left_arg(x.clone(),
equal_lift(ty_a.clone(), eq_ab))))
}
pub fn tauto_eq_to_tauto_equal<X: Prop, A: Prop, B: Prop>(
ty_a: Tauto<Ty<A, X>>,
tauto_eq_ab: Tauto<Eq<A, B>>
) -> Tauto<Eq<Equal<X, A, B>, Tr>> {
fn f<X: Prop, A: Prop, B: Prop>(
(ty_a, eq_ab): And<Ty<A, X>, Eq<A, B>>
) -> Eq<Equal<X, A, B>, Tr> {equal_lift(ty_a, eq_ab)}
hooo::hooo_rev_and((ty_a, tauto_eq_ab)).trans(f)
}