Theorem: KVChain.forAll_fst_insertWithAux
Proof state before:
case e.e.refl
α : Type u
r : α → α → Prop
inst✝¹ : StrictLinearOrder r
inst✝ : DecidableRel r
β : α → Type v
f : (a : α) → β a → β a → Option (β a)
ys✝ : KVChain r β
a : α
b : β a
p : α → Prop
ys : KVChain r fun a => β a
h_ind :
  ∀ (xs : KVChain (flip r) fun a => β a) (hxsys : hingeable xs ys) (haxs : boundLeft a xs),
    List.forAll (p ∘ Sigma.fst) xs.toList →
      List.forAll (p ∘ Sigma.fst) ys.toList →
        p a →
          List.forAll (p ∘ Sigma.fst) (insertWithAux f xs ys hxsys a b haxs).val.fst.toList ∧
            List.forAll (p ∘ Sigma.fst) (insertWithAux f xs ys hxsys a b haxs).val.snd.toList
xs : KVChain (flip r) fun a => β a
hzxs : boundLeft a xs
hpxs : List.forAll (p ∘ Sigma.fst) xs.toList
hpa : p a
b₁ : β a
ha₁ys : boundLeft a ys
ha₁xs : hingeable xs (KVChain.cons a b₁ ys ha₁ys)
hpys : List.forAll (p ∘ Sigma.fst) (KVChain.cons a b₁ ys ha₁ys).toList
ha₁a haa₁ : ¬r a a
⊢ List.forAll (p ∘ Sigma.fst)
      (Option.casesOn (f a b₁ b) { val := (xs, ys), property := (_ : hingeable (xs, ys).fst (xs, ys).snd) } fun bf =>
              { val := (KVChain.cons a bf xs hzxs, ys),
                property :=
                  (_ : hingeable (KVChain.cons a bf xs hzxs) (KVChain.cons a bf xs hzxs, ys).snd) }).val.fst.toList ∧
    List.forAll (p ∘ Sigma.fst)
      (Option.casesOn (f a b₁ b) { val := (xs, ys), property := (_ : hingeable (xs, ys).fst (xs, ys).snd) } fun bf =>
              { val := (KVChain.cons a bf xs hzxs, ys),
                property :=
                  (_ : hingeable (KVChain.cons a bf xs hzxs) (KVChain.cons a bf xs hzxs, ys).snd) }).val.snd.toList
Tactic:
cases f a b₁ b
Proof state after:
case e.e.refl.none
α : Type u
r : α → α → Prop
inst✝¹ : StrictLinearOrder r
inst✝ : DecidableRel r
β : α → Type v
f : (a : α) → β a → β a → Option (β a)
ys✝ : KVChain r β
a : α
b : β a
p : α → Prop
ys : KVChain r fun a => β a
h_ind :
  ∀ (xs : KVChain (flip r) fun a => β a) (hxsys : hingeable xs ys) (haxs : boundLeft a xs),
    List.forAll (p ∘ Sigma.fst) xs.toList →
      List.forAll (p ∘ Sigma.fst) ys.toList →
        p a →
          List.forAll (p ∘ Sigma.fst) (insertWithAux f xs ys hxsys a b haxs).val.fst.toList ∧
            List.forAll (p ∘ Sigma.fst) (insertWithAux f xs ys hxsys a b haxs).val.snd.toList
xs : KVChain (flip r) fun a => β a
hzxs : boundLeft a xs
hpxs : List.forAll (p ∘ Sigma.fst) xs.toList
hpa : p a
b₁ : β a
ha₁ys : boundLeft a ys
ha₁xs : hingeable xs (KVChain.cons a b₁ ys ha₁ys)
hpys : List.forAll (p ∘ Sigma.fst) (KVChain.cons a b₁ ys ha₁ys).toList
ha₁a haa₁ : ¬r a a
⊢ List.forAll (p ∘ Sigma.fst)
      (Option.casesOn none { val := (xs, ys), property := (_ : hingeable (xs, ys).fst (xs, ys).snd) } fun bf =>
              { val := (KVChain.cons a bf xs hzxs, ys),
                property :=
                  (_ : hingeable (KVChain.cons a bf xs hzxs) (KVChain.cons a bf xs hzxs, ys).snd) }).val.fst.toList ∧
    List.forAll (p ∘ Sigma.fst)
      (Option.casesOn none { val := (xs, ys), property := (_ : hingeable (xs, ys).fst (xs, ys).snd) } fun bf =>
              { val := (KVChain.cons a bf xs hzxs, ys),
                property :=
                  (_ : hingeable (KVChain.cons a bf xs hzxs) (KVChain.cons a bf xs hzxs, ys).snd) }).val.snd.toList

case e.e.refl.some
α : Type u
r : α → α → Prop
inst✝¹ : StrictLinearOrder r
inst✝ : DecidableRel r
β : α → Type v
f : (a : α) → β a → β a → Option (β a)
ys✝ : KVChain r β
a : α
b : β a
p : α → Prop
ys : KVChain r fun a => β a
h_ind :
  ∀ (xs : KVChain (flip r) fun a => β a) (hxsys : hingeable xs ys) (haxs : boundLeft a xs),
    List.forAll (p ∘ Sigma.fst) xs.toList →
      List.forAll (p ∘ Sigma.fst) ys.toList →
        p a →
          List.forAll (p ∘ Sigma.fst) (insertWithAux f xs ys hxsys a b haxs).val.fst.toList ∧
            List.forAll (p ∘ Sigma.fst) (insertWithAux f xs ys hxsys a b haxs).val.snd.toList
xs : KVChain (flip r) fun a => β a
hzxs : boundLeft a xs
hpxs : List.forAll (p ∘ Sigma.fst) xs.toList
hpa : p a
b₁ : β a
ha₁ys : boundLeft a ys
ha₁xs : hingeable xs (KVChain.cons a b₁ ys ha₁ys)
hpys : List.forAll (p ∘ Sigma.fst) (KVChain.cons a b₁ ys ha₁ys).toList
ha₁a haa₁ : ¬r a a
val✝ : β a
⊢ List.forAll (p ∘ Sigma.fst)
      (Option.casesOn (some val✝) { val := (xs, ys), property := (_ : hingeable (xs, ys).fst (xs, ys).snd) } fun bf =>
              { val := (KVChain.cons a bf xs hzxs, ys),
                property :=
                  (_ : hingeable (KVChain.cons a bf xs hzxs) (KVChain.cons a bf xs hzxs, ys).snd) }).val.fst.toList ∧
    List.forAll (p ∘ Sigma.fst)
      (Option.casesOn (some val✝) { val := (xs, ys), property := (_ : hingeable (xs, ys).fst (xs, ys).snd) } fun bf =>
              { val := (KVChain.cons a bf xs hzxs, ys),
                property :=
                  (_ : hingeable (KVChain.cons a bf xs hzxs) (KVChain.cons a bf xs hzxs, ys).snd) }).val.snd.toList