advancedresearch / prop

Propositional logic with types in Rust

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

`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)