use crate::*;
use hooo::*;
use modal::Nec;
pub trait ConstructiveHoooRevNot {
fn hooo_rev_not<A: Prop, B: Prop>(&self) -> Pow<Pow<Not<A>, B>, Not<Pow<A, B>>>;
fn para_theory<A: Prop>(&self, th_a: Theory<A>) -> False {
let x: Not<Tauto<ExcM<A>>> = imply::in_left(th_a, |x| tauto_excm_to_uniform(x));
let x: Not<ExcM<A>> = self.hooo_rev_not()(x)(True);
A::nnexcm()(x)
}
}
pub trait ConstructivePowNot: Clone + 'static {
fn pow_not<A: Prop, B: Prop>(&self) -> Pow<Pow<A, Not<B>>, Not<Pow<A, B>>>;
fn theory_to_up<A: Prop>(&self, th_a: Theory<A>) -> mid::Up<A> {
let pow_not = self.pow_not();
let (ntauto_a, npara_a) = and::from_de_morgan(th_a);
(Rc::new(move |na| {
pow_not(npara_a.clone())(na)
}), ntauto_a)
}
fn eq_theory_and_nn_ntauto<A: Prop>(&self) -> Eq<Theory<A>, mid::Up<A>> {
let s = self.clone();
(Rc::new(move |th_a| s.theory_to_up(th_a)),
Rc::new(move |up| mid::up_to_theory(up)))
}
}
pub trait TautoHoooNot {
fn tauto_hooo_not<A: Prop, B: Prop>(&self) -> Tauto<Pow<Not<Pow<A, B>>, Pow<Not<A>, B>>>;
fn absurd(&self) -> False {
let a: Pow<True, False> = fa();
let b: Pow<Not<True>, False> = fa();
self.tauto_hooo_not()(True)(b)(a)
}
}
pub trait HoooNot {
fn hooo_not<A: Prop, B: Prop>(&self) -> Pow<Not<Pow<A, B>>, Pow<Not<A>, B>>;
fn absurd(&self) -> False {
let a: Pow<True, False> = fa();
let b: Pow<Not<True>, False> = fa();
self.hooo_not()(b)(a)
}
}
pub trait GlobalTautoHoooRevImply: Sized {
fn tauto_hooo_rev_imply<A: Prop, B: Prop, C: Prop>() ->
Pow<Pow<Imply<A, B>, C>, Tauto<Imply<Pow<A, C>, Pow<B, C>>>>;
fn hooo_rev_imply<A: Prop, B: Prop, C: Prop>(
x: Imply<Pow<A, C>, Pow<B, C>>
) -> Pow<Imply<A, B>, C> {
fn f<T: GlobalTautoHoooRevImply, A: Prop, B: Prop, C: Prop>(_: True) ->
Imply<Tauto<Imply<Pow<A, C>, Pow<B, C>>>, Tauto<Pow<Imply<A, B>, C>>> {
Rc::new(move |x| pow_lift(T::tauto_hooo_rev_imply()(x)))
}
Self::tauto_hooo_rev_imply()(f::<Self, A, B, C>)(True)(x)
}
fn imply_to_pow<A: Prop, B: Prop>(ab: Imply<A, B>) -> Pow<B, A> {
let x = pow_to_imply(tauto_pow_imply);
let x = Self::hooo_rev_imply(x);
x(True)(ab)
}
}
pub trait TautoHoooRevImply {
fn tauto_hooo_rev_imply<A: Prop, B: Prop, C: Prop>(&self) ->
Pow<Pow<Imply<A, B>, C>, Tauto<Imply<Pow<A, C>, Pow<B, C>>>>;
}
pub trait HoooRevImply {
fn hooo_rev_imply<A: Prop, B: Prop, C: Prop>(&self) ->
Pow<Pow<Imply<A, B>, C>, Imply<Pow<A, C>, Pow<B, C>>>;
fn imply_to_pow<A: Prop, B: Prop>(&self, ab: Imply<A, B>) -> Pow<B, A> {
let x = pow_to_imply(tauto_pow_imply);
let x = self.hooo_rev_imply()(x);
x(True)(ab)
}
}
pub trait TautoHoooNeq {
fn tauto_hooo_neq<A: Prop, B: Prop, C: Prop>(&self) ->
Pow<Tauto<Not<Eq<Pow<A, C>, Pow<B, C>>>>, Pow<Not<Eq<A, B>>, C>>;
fn absurd(&self) -> False {
self.tauto_hooo_neq()(fa::<Not<Eq<True, True>>>())(True)(eq::refl())
}
}
pub trait HoooNeq {
fn hooo_neq<A: Prop, B: Prop, C: Prop>(&self) ->
Pow<Not<Eq<Pow<A, C>, Pow<B, C>>>, Pow<Not<Eq<A, B>>, C>>;
fn absurd(&self) -> False {
self.hooo_neq()(fa::<Not<Eq<True, True>>>())(eq::refl())
}
}
pub trait TautoHoooNRImply {
fn tauto_hooo_nrimply<A: Prop, B: Prop, C: Prop>(&self) ->
Pow<Tauto<Not<Imply<Pow<B, C>, Pow<A, C>>>>, Pow<Not<Imply<B, A>>, C>>;
fn absurd(&self) -> False {
self.tauto_hooo_nrimply()(fa::<Not<Imply<True, True>>>())(True)(imply::id())
}
}
pub trait HoooNRImply {
fn hooo_nrimply<A: Prop, B: Prop, C: Prop>(&self) ->
Pow<Not<Imply<Pow<B, C>, Pow<A, C>>>, Pow<Not<Imply<B, A>>, C>>;
fn absurd(&self) -> False {
self.hooo_nrimply()(fa::<Not<Imply<True, True>>>())(imply::id())
}
}
pub trait TautoHoooDualImply {
fn tauto_hooo_dual_imply<A: Prop, B: Prop, C: Prop>(&self) ->
Pow<Tauto<Not<Imply<Pow<C, B>, Pow<C, A>>>>, Pow<C, Imply<A, B>>>;
fn absurd(&self) -> False {
fn f(_: Or<True, Not<True>>) -> True {True}
let (a, b) = hooo_dual_or(f);
let y = self.tauto_hooo_dual_imply()(b)(True);
Rc::new(move |pow_a_b: Pow<_, _>| y(pow_a_b.map_any()))(a)
}
}
pub trait HoooDualImply {
fn hooo_dual_imply<A: Prop, B: Prop, C: Prop>(&self) ->
Pow<Not<Imply<Pow<C, B>, Pow<C, A>>>, Pow<C, Imply<A, B>>>;
fn absurd(&self) -> False {
fn f(_: Or<True, Not<True>>) -> True {True}
let (a, b) = hooo_dual_or(f);
let y = self.hooo_dual_imply()(b);
Rc::new(move |pow_a_b: Pow<_, _>| y(pow_a_b.map_any()))(a)
}
}
pub trait HoooDualEq {
fn hooo_dual_eq<A: Prop, B: Prop, C: Prop>(&self) ->
Pow<Not<Eq<Pow<C, A>, Pow<C, B>>>, Pow<C, Eq<A, B>>>;
fn absurd(&self) -> False {
self.hooo_dual_eq::<True, True, True>()(tr())(eq::refl())
}
}
pub trait Lob {
fn lob<P: Prop>(_: Nec<Imply<Nec<P>, P>>) -> Nec<P>;
fn absurd() -> False {Self::lob(modal::lob_triv())(True)}
}