Pith. sign in

IndisputableMonolith.Foundation.PrimitiveRecognitionCalculus.Grow.SignedOrbitNonnegFlagMulOfOrbitRightOfNeZeroChoiceFree

IndisputableMonolith/Foundation/PrimitiveRecognitionCalculus/Grow/SignedOrbitNonnegFlagMulOfOrbitRightOfNeZeroChoiceFree.lean · 57 lines · 1 declarations

show as:
view math explainer →

open module explainer GitHub source

Explainer status: pending

   1import IndisputableMonolith.Foundation.PrimitiveRecognitionCalculus.IntegerRational
   2import IndisputableMonolith.Foundation.PrimitiveRecognitionCalculus.IntegerOrder
   3import IndisputableMonolith.Foundation.PrimitiveRecognitionCalculus.Grow.RatioOrbitLeReflTotal
   4import IndisputableMonolith.Foundation.PrimitiveRecognitionCalculus.Orbit
   5import IndisputableMonolith.Foundation.PrimitiveRecognitionCalculus.Grow.SignedOrbitOrderChoiceFree
   6
   7namespace IndisputableMonolith.PRCGrow.SignedOrbitNonnegFlagMulOfOrbitRightOfNeZeroChoiceFree
   8
   9open IndisputableMonolith.Foundation.PrimitiveRecognitionCalculus
  10open IndisputableMonolith.PRCGrow.SignedOrbitOrderChoiceFree
  11
  12theorem nonnegFlag_mul_ofOrbit_right_of_ne_zero_cf
  13    (z : SignedOrbit) (d : DistinctionNat) (hd : d ≠ DistinctionNat.zero) :
  14    (SignedOrbit.mul z (SignedOrbit.ofOrbit d)).nonnegFlag = z.nonnegFlag := by
  15  have hd' : d.toNat ≠ 0 := by
  16    intro h
  17    apply hd
  18    rw [← DistinctionNat.ofNat_toNat d, h, DistinctionNat.ofNat_zero]
  19  have hdpos : 0 < d.toNat := by omega
  20  have hpos : (SignedOrbit.mul z (SignedOrbit.ofOrbit d)).pos.toNat = z.pos.toNat * d.toNat := by
  21    show (z.pos * (SignedOrbit.ofOrbit d).pos + z.neg * (SignedOrbit.ofOrbit d).neg).toNat = _
  22    have hp : (SignedOrbit.ofOrbit d).pos = d := rfl
  23    have hn : (SignedOrbit.ofOrbit d).neg = DistinctionNat.zero := rfl
  24    rw [hp, hn, DistinctionNat.toNat_add, DistinctionNat.toNat_mul, DistinctionNat.toNat_mul,
  25      DistinctionNat.toNat_zero]
  26    omega
  27  have hneg : (SignedOrbit.mul z (SignedOrbit.ofOrbit d)).neg.toNat = z.neg.toNat * d.toNat := by
  28    show (z.pos * (SignedOrbit.ofOrbit d).neg + z.neg * (SignedOrbit.ofOrbit d).pos).toNat = _
  29    have hp : (SignedOrbit.ofOrbit d).pos = d := rfl
  30    have hn : (SignedOrbit.ofOrbit d).neg = DistinctionNat.zero := rfl
  31    rw [hp, hn, DistinctionNat.toNat_add, DistinctionNat.toNat_mul, DistinctionNat.toNat_mul,
  32      DistinctionNat.toNat_zero]
  33    omega
  34  have key : DistinctionNat.leq (SignedOrbit.mul z (SignedOrbit.ofOrbit d)).neg
  35      (SignedOrbit.mul z (SignedOrbit.ofOrbit d)).pos = true ↔
  36      DistinctionNat.leq z.neg z.pos = true := by
  37    rw [leq_eq_true_iff_cf, leq_eq_true_iff_cf, hpos, hneg]
  38    constructor
  39    · intro h
  40      exact Nat.le_of_mul_le_mul_right h hdpos
  41    · intro h
  42      exact Nat.mul_le_mul_right _ h
  43  show DistinctionNat.leq (SignedOrbit.mul z (SignedOrbit.ofOrbit d)).neg
  44      (SignedOrbit.mul z (SignedOrbit.ofOrbit d)).pos =
  45      DistinctionNat.leq z.neg z.pos
  46  cases hb : DistinctionNat.leq z.neg z.pos with
  47    | true => exact key.mpr hb
  48    | false =>
  49      cases hb2 : DistinctionNat.leq (SignedOrbit.mul z (SignedOrbit.ofOrbit d)).neg
  50          (SignedOrbit.mul z (SignedOrbit.ofOrbit d)).pos with
  51        | true =>
  52          rw [key.mp hb2] at hb
  53          exact absurd hb (by decide)
  54        | false => rfl
  55
  56end IndisputableMonolith.PRCGrow.SignedOrbitNonnegFlagMulOfOrbitRightOfNeZeroChoiceFree
  57

source mirrored from github.com/jonwashburn/shape-of-logic