`a => a^b` (hooo::pow_uni) is too strong
bvssvni opened this issue · comments
It is possible to prove the following:
/// `(a == a^true)^true`.
pub fn proof<A: Prop>(_: True) -> Eq<A, Tauto<A>> {
(Rc::new(move |a| pow_uni(a)), Rc::new(move |tauto_a| tauto_a(True)))
}
This should not be provable, because it collapses tautologies in HOOO Exponential Propositions into ordinary propositions.
It also seems pow_imply
is too strong, since it can be used to prove an equivalence of pow_uni
:
/// `(a == a^true)^true`.
pub fn proof<A: Prop>(_: True) -> Eq<A, Tauto<A>> {
fn f<A: Prop, B: Prop>(a: A) -> Imply<B, A> {a.map_any()}
(Rc::new(move |a| pow_imply(f)(a)), Rc::new(move |tauto_a| tauto_a(True)))
}
I was able to prove a weaker version that can replace pow_imply
:
/// `(a => b)^true => (b^a)^true`.
pub fn tauto_pow_imply<A: Prop, B: Prop>(x: Tauto<Imply<A, B>>) -> Tauto<Pow<B, A>> {
let x = hooo_imply(x);
let y: Imply<Tauto<B>, Tauto<Pow<B, A>>> = Rc::new(move |x| pow_swap_exp(pow_lift(x)));
let x = imply::transitivity(x, y);
let x = hooo_rev_imply(x);
pow_transitivity(x, imply_pow)
}
Current set of HOOO axioms:
- pow_lift
a^b => (a^b)^c
- imply_pow
(a => b^a) => b^a
- pow_rev_lower
a^(b ⋀ c) => (a^b)^c
- hooo_rev_not
¬(a^b) => (¬a)^b
- program
uniform(a) ⋁ false^uniform(a)
- tauto_from_para_transitivity
(false^(a == b) ∧ false^(b == c)) => (a == c)^true
(a □ b)^c == (a^c □ b^c)
c^(a □ b) == (c^a □[¬] c^b)
It seems that imply_pow
is too strong, since it can be used to prove pow_imply
:
/// `(a => b)^c => (b^a)^c`.
pub fn pow_imply<A: Prop, B: Prop, C: Prop>(x: Pow<Imply<A, B>, C>) -> Pow<Pow<B, A>, C> {
let x = hooo_imply(x);
let y: Imply<Pow<B, C>, Pow<Pow<B, A>, C>> = Rc::new(move |x| pow_swap_exp(pow_lift(x)));
let x = imply::transitivity(x, y);
let x = hooo_rev_imply(x);
pow_transitivity(x, imply_pow)
}
There is no other proof for tauto_pow_imply
, because this is too strong:
/// `(a => b) => b^a`.
pub fn proof2<A: Prop, B: Prop>(ab: Imply<A, B>) -> Pow<B, A> {
let f: Imply<Tauto<_>, Tauto<_>> = Rc::new(move |x| tauto_pow_imply(x));
hooo_rev_imply(f)(True)(ab)
}
Current set of HOOO axioms:
- pow_lift
a^b => (a^b)^c
- pow_rev_lower
a^(b ⋀ c) => (a^b)^c
- hooo_rev_not
¬(a^b) => (¬a)^b
- program
uniform(a) ⋁ false^uniform(a)
- tauto_from_para_transitivity
(false^(a == b) ∧ false^(b == c)) => (a == c)^true
(a □ b)^c == (a^c □ b^c)
c^(a □ b) == (c^a □[¬] c^b)