| /-! Equational theorem generation regression test.-/ | |
| structure PrefixTable (α : Type _) extends Array (α × Nat) where | |
| /-- Validity condition to help with termination proofs -/ | |
| valid : (h : i < toArray.size) → toArray[i].2 ≤ i | |
| def PrefixTable.step [BEq α] (t : PrefixTable α) (x : α) (kf : Fin (t.size+1)) : Fin (t.size+1) := | |
| match kf with | |
| | ⟨k, hk⟩ => | |
| let cont := fun () => | |
| match k with | |
| | 0 => ⟨0, Nat.zero_lt_succ _⟩ | |
| | k + 1 => | |
| have h2 : k < t.size := Nat.lt_of_succ_lt_succ hk | |
| let k' := t.toArray[k].2 | |
| have hk' : k' < k + 1 := Nat.lt_succ_of_le (t.valid h2) | |
| step t x ⟨k', Nat.lt_trans hk' hk⟩ | |
| if hsz : k < t.size then | |
| if x == t.toArray[k].1 then | |
| ⟨k+1, Nat.succ_lt_succ hsz⟩ | |
| else cont () | |
| else cont () | |
| termination_by kf.val | |
| /-- | |
| info: PrefixTable.step.eq_def.{u_1} {α : Type u_1} [BEq α] (t : PrefixTable α) (x : α) (kf : Fin (t.size + 1)) : | |
| t.step x kf = | |
| match kf with | |
| | ⟨k, hk⟩ => | |
| have cont := fun x_1 => | |
| match k, hk with | |
| | 0, hk => ⟨0, ⋯⟩ | |
| | k.succ, hk => | |
| have h2 := ⋯; | |
| let k' := t.toArray[k].snd; | |
| have hk' := ⋯; | |
| t.step x ⟨k', ⋯⟩; | |
| if hsz : k < t.size then if (x == t.toArray[k].fst) = true then ⟨k + 1, ⋯⟩ else cont () else cont () | |
| -/ | |
| #guard_msgs in | |
| #check PrefixTable.step.eq_def |