Skip to content

Commit d13b5b7

Browse files
committed
Proper handling of epic and monic functions
Closes #1734
1 parent d068564 commit d13b5b7

File tree

2 files changed

+62
-12
lines changed

2 files changed

+62
-12
lines changed

src/fun/comp.rs

+36
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,42 @@ pub fn comp_eq_right<F: Prop, G: Prop, H: Prop>(x: Eq<G, H>) -> Eq<Comp<F, G>, C
8484
(Rc::new(move |fg| comp_in_right_arg(fg, x.clone())),
8585
Rc::new(move |fh| comp_in_right_arg(fh, x2.clone())))
8686
}
87+
/// `~(f . inv(f)) ⋀ ((g . f) == (h . f)) ⋀ (f : a -> x) ⋀ (g : x -> y) ⋀ (h : x -> y) => g == h`.
88+
pub fn epic<F: Prop, G: Prop, H: Prop, X: Prop, Y: Prop, A: Prop>(
89+
qu_comp_f_inv_f: Qu<Comp<F, Inv<F>>>,
90+
x: Eq<Comp<G, F>, Comp<H, F>>,
91+
ty_f: Ty<F, Pow<X, A>>,
92+
ty_g: Ty<G, Pow<Y, X>>,
93+
ty_h: Ty<H, Pow<Y, X>>,
94+
) -> Eq<G, H> {
95+
let x: Eq<Comp<Comp<G, F>, Inv<F>>, Comp<Comp<H, F>, Inv<F>>> = comp_eq_left(x);
96+
let x: Eq<Comp<G, Comp<F, Inv<F>>>, _> = eq::in_left_arg(x, eq::symmetry(comp_assoc()));
97+
let x: Eq<_, Comp<H, Comp<F, Inv<F>>>> = eq::in_right_arg(x, eq::symmetry(comp_assoc()));
98+
let y: Eq<Comp<F, Inv<F>>, Id<X>> = eq_comp_right_inv_id(qu_comp_f_inv_f, ty_f);
99+
let x: Eq<Comp<G, Id<X>>, _> = eq::in_left_arg(x, comp_eq_right(y.clone()));
100+
let x: Eq<_, Comp<H, Id<X>>> = eq::in_right_arg(x, comp_eq_right(y));
101+
let x: Eq<G, _> = eq::in_left_arg(x, comp_id_right(ty_g));
102+
let x: Eq<_, H> = eq::in_right_arg(x, comp_id_right(ty_h));
103+
x
104+
}
105+
/// `~(inv(f) . f) ⋀ ((f . g) == (f . h)) ⋀ (f : x -> y) ⋀ (g : a -> x) ⋀ (h : a -> x) => g == h`.
106+
pub fn monic<F: Prop, G: Prop, H: Prop, X: Prop, Y: Prop, A: Prop>(
107+
qu_comp_inv_f_f: Qu<Comp<Inv<F>, F>>,
108+
x: Eq<Comp<F, G>, Comp<F, H>>,
109+
ty_f: Ty<F, Pow<Y, X>>,
110+
ty_g: Ty<G, Pow<X, A>>,
111+
ty_h: Ty<H, Pow<X, A>>,
112+
) -> Eq<G, H> {
113+
let x: Eq<Comp<Inv<F>, Comp<F, G>>, Comp<Inv<F>, Comp<F, H>>> = comp_eq_right(x);
114+
let x: Eq<Comp<Comp<Inv<F>, F>, G>, _> = eq::in_left_arg(x, comp_assoc());
115+
let x: Eq<_, Comp<Comp<Inv<F>, F>, H>> = eq::in_right_arg(x, comp_assoc());
116+
let y: Eq<Comp<Inv<F>, F>, Id<X>> = eq_comp_left_inv_id(qu_comp_inv_f_f, ty_f);
117+
let x: Eq<Comp<Id<X>, G>, _> = eq::in_left_arg(x, comp_eq_left(y.clone()));
118+
let x: Eq<_, Comp<Id<X>, H>> = eq::in_right_arg(x, comp_eq_left(y));
119+
let x: Eq<G, _> = eq::in_left_arg(x, comp_id_left(ty_g));
120+
let x: Eq<_, H> = eq::in_right_arg(x, comp_id_left(ty_h));
121+
x
122+
}
87123
/// `(f(a) == b) ⋀ (g(b) == c) => g(f(a)) == c`.
88124
pub fn comp_app<F: Prop, G: Prop, A: Prop, B: Prop, C: Prop>(
89125
x: Eq<App<F, A>, B>,

src/fun/id.rs

+26-12
Original file line numberDiff line numberDiff line change
@@ -46,23 +46,27 @@ pub fn id_def<A: Prop, X: Prop, N: Nat>(
4646
) -> Eq<App<Id<X>, A>, A> {unimplemented!()}
4747
/// `inv(id{x}) == id{x}`.
4848
pub fn id_inv<X: Prop>() -> Eq<Inv<App<FId, X>>, App<FId, X>> {unimplemented!()}
49-
/// `(f : a -> b) ⋀ (f . inv(f)) => id{b}`.
49+
/// `~(f . inv(f)) ⋀ (f : a -> b) ⋀ (f . inv(f)) => id{b}`.
5050
pub fn comp_right_inv_to_id<F: Prop, A: Prop, B: Prop>(
51+
_: Qu<Comp<F, Inv<F>>>,
5152
_: Ty<F, Pow<B, A>>,
5253
_: Comp<F, Inv<F>>
5354
) -> App<FId, B> {unimplemented!()}
54-
/// `(f : a -> b) ⋀ id{b} => (f . inv(f))`.
55+
/// `~(f . inv(f)) ⋀ (f : a -> b) ⋀ id{b} => (f . inv(f))`.
5556
pub fn id_to_comp_right_inv<F: Prop, A: Prop, B: Prop>(
57+
_: Qu<Comp<F, Inv<F>>>,
5658
_: Ty<F, Pow<B, A>>,
5759
_: App<FId, B>
5860
) -> Comp<F, Inv<F>> {unimplemented!()}
59-
/// `(f : a -> b) ⋀ (inv(f) . f) => id{a}`.
61+
/// `~(inv(f) . f) ⋀ (f : a -> b) ⋀ (inv(f) . f) => id{a}`.
6062
pub fn comp_left_inv_to_id<F: Prop, A: Prop, B: Prop>(
63+
_: Qu<Comp<Inv<F>, F>>,
6164
_: Ty<F, Pow<B, A>>,
6265
_: Comp<Inv<F>, F>
6366
) -> App<FId, A> {unimplemented!()}
64-
/// `(f : a -> b) ⋀ id{a} => (inv(f). f)`.
67+
/// `~(inv(f) . f) ⋀ (f : a -> b) ⋀ id{a} => (inv(f). f)`.
6568
pub fn id_to_comp_left_inv<F: Prop, A: Prop, B: Prop>(
69+
_: Qu<Comp<Inv<F>, F>>,
6670
_: Ty<F, Pow<B, A>>,
6771
_: App<FId, A>
6872
) -> Comp<Inv<F>, F> {unimplemented!()}
@@ -93,12 +97,18 @@ pub fn self_inv_to_eq_id<F: Prop, A: Prop>(
9397
ty_f: Ty<F, Pow<A, A>>,
9498
eq_f: Eq<Inv<F>, F>
9599
) -> Eq<Comp<F, F>, App<FId, A>> {
100+
let x = inv::self_inv_to_q(eq_f.clone());
101+
let qu_f = qubit::Qubit::from_q(quality::right(x.clone()));
102+
let qu_inv_f = qubit::Qubit::from_q(quality::left(x));
103+
let qu_comp_f_inv_f = comp::comp_qu(qu_inv_f, qu_f);
104+
let qu_comp_f_inv_f_2 = qu_comp_f_inv_f.clone();
96105
let ty_f_2 = ty_f.clone();
97106
let eq_f_2 = eq_f.clone();
98107
(
99-
Rc::new(move |x| comp_right_inv_to_id(ty_f_2.clone(),
108+
Rc::new(move |x| comp_right_inv_to_id(qu_comp_f_inv_f.clone(), ty_f_2.clone(),
100109
comp_in_right_arg(x, eq::symmetry(eq_f_2.clone())))),
101-
Rc::new(move |x| comp_in_right_arg(id_to_comp_right_inv(ty_f.clone(), x), eq_f.clone())),
110+
Rc::new(move |x| comp_in_right_arg(id_to_comp_right_inv(qu_comp_f_inv_f_2.clone(),
111+
ty_f.clone(), x), eq_f.clone())),
102112
)
103113
}
104114
/// `inv(id{a}) ~~ id{a}`.
@@ -173,19 +183,23 @@ pub fn para_to_eq_qu<A: Prop>(para_a: Para<A>) -> Eq<Qu<A>, A> {
173183
pub fn pow_to_eq_qu<A: Prop, B: Prop>(x: Pow<A, B>) -> Eq<Qu<Pow<A, B>>, Pow<A, B>> {
174184
tauto_to_eq_qu(x.lift())
175185
}
176-
/// `(f : a -> b) => (inv(f) . f) == id{a}`.
186+
/// `~(inv(f) . f) ⋀ (f : a -> b) => (inv(f) . f) == id{a}`.
177187
pub fn eq_comp_left_inv_id<F: Prop, A: Prop, B: Prop>(
188+
qu_comp_inv_f_f: Qu<Comp<Inv<F>, F>>,
178189
ty_f: Ty<F, Pow<B, A>>
179190
) -> Eq<Comp<Inv<F>, F>, Id<A>> {
180191
let ty_f2 = ty_f.clone();
181-
(Rc::new(move |x| comp_left_inv_to_id(ty_f.clone(), x)),
182-
Rc::new(move |x| id_to_comp_left_inv(ty_f2.clone(), x)))
192+
let qu_comp_inv_f_f_2 = qu_comp_inv_f_f.clone();
193+
(Rc::new(move |x| comp_left_inv_to_id(qu_comp_inv_f_f.clone(), ty_f.clone(), x)),
194+
Rc::new(move |x| id_to_comp_left_inv(qu_comp_inv_f_f_2.clone(), ty_f2.clone(), x)))
183195
}
184-
/// `(f : a -> b) => (f . inv(f)) == id{b}`.
196+
/// `~(f . inv(f)) ⋀ (f : a -> b) => (f . inv(f)) == id{b}`.
185197
pub fn eq_comp_right_inv_id<F: Prop, A: Prop, B: Prop>(
198+
qu_comp_f_inv_f: Qu<Comp<F, Inv<F>>>,
186199
ty_f: Ty<F, Pow<B, A>>
187200
) -> Eq<Comp<F, Inv<F>>, Id<B>> {
188201
let ty_f2 = ty_f.clone();
189-
(Rc::new(move |x| comp_right_inv_to_id(ty_f.clone(), x)),
190-
Rc::new(move |x| id_to_comp_right_inv(ty_f2.clone(), x)))
202+
let qu_comp_f_inv_f_2 = qu_comp_f_inv_f.clone();
203+
(Rc::new(move |x| comp_right_inv_to_id(qu_comp_f_inv_f.clone(), ty_f.clone(), x)),
204+
Rc::new(move |x| id_to_comp_right_inv(qu_comp_f_inv_f_2.clone(), ty_f2.clone(), x)))
191205
}

0 commit comments

Comments
 (0)