pub use prop::*;
pub mod apl {
use super::prop::*;
pub fn a1<A, B>() -> Cond<A, Cond<B, A>>
where
A: Prop,
B: Prop,
{
unreachable!()
}
pub fn a2<A, B, C>() -> Cond<Cond<A, Cond<B, C>>, Cond<Cond<A, B>, Cond<A, C>>>
where
A: Prop,
B: Prop,
C: Prop,
{
unreachable!()
}
pub fn a3<A, B>() -> Cond<Cond<Neg<B>, Neg<A>>, Cond<Cond<Neg<B>, A>, B>>
where
A: Prop,
B: Prop,
{
unreachable!()
}
pub fn mp<A, B>() -> Box<dyn Fn(A, Cond<A, B>) -> B>
where
A: Prop,
B: Prop,
{
unreachable!()
}
}
pub mod prop {
pub trait Prop {}
pub struct Neg<T>(std::marker::PhantomData<T>);
impl<T> Prop for Neg<T> {}
pub struct Cond<T, U>(std::marker::PhantomData<T>, std::marker::PhantomData<U>);
impl<T, U> Prop for Cond<T, U> {}
}