1use super::*;
2
3#[derive(Copy, Clone)]
7pub struct IsConst<A>(A);
8
9pub type IsVar<A> = Not<IsConst<A>>;
14
15pub trait VProp: Prop {
17 fn is_var() -> IsVar<Self>;
19}
20
21pub fn const_tup<A: Prop, B: Prop>(a: IsConst<A>, b: IsConst<B>) -> IsConst<Tup<A, B>> {
23 tup_is_const(a, b)
24}
25pub fn tup_const<A: Prop, B: Prop>(_x: IsConst<Tup<A, B>>) -> And<IsConst<A>, IsConst<B>> {
27 unimplemented!()
28}
29pub fn const_eq<A: Prop, B: Prop>((ab, ba): Eq<A, B>) -> Eq<IsConst<A>, IsConst<B>> {
33 (Rc::new(move |a| IsConst(ab(a.0))), Rc::new(move |b| IsConst(ba(b.0))))
34}
35pub fn and_is_const<A: Prop, B: Prop>(_a: IsConst<A>, _b: IsConst<B>) -> IsConst<And<A, B>> {
37 unimplemented!()
38}
39pub fn or_is_const<A: Prop, B: Prop>(_a: IsConst<A>, _b: IsConst<B>) -> IsConst<Or<A, B>> {
41 unimplemented!()
42}
43pub fn imply_is_const<A: Prop, B: Prop>(_a: IsConst<A>, _b: IsConst<B>) -> IsConst<Imply<A, B>> {
45 unimplemented!()
46}
47pub fn pord_is_const<A: Prop, B: Prop>(
49 _a: IsConst<A>,
50 _b: IsConst<B>
51) -> IsConst<POrdProof<A, B>> {
52 unimplemented!()
53}
54
55pub fn ty_is_const<A: Prop, B: Prop>(a: IsConst<A>, b: IsConst<B>) -> IsConst<Ty<A, B>> {
57 and_is_const(imply_is_const(a.clone(), b.clone()), pord_is_const(a, b))
58}
59
60pub fn const_in_arg<A: Prop, B: Prop>(a: IsConst<A>, x: Eq<A, B>) -> IsConst<B> {
62 const_eq(x).0(a)
63}