Theorem: LO.FirstOrder.Arith.Model.hash_defined (Arithmetization/OmegaOne/Basic.lean)

State before:
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈𝚫₀ + 𝛀₁
⊢ 𝚺₀-Function₂ Hash.hash via hashDef
Tactic:
intro v
State after:
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈𝚫₀ + 𝛀₁
v : Fin (Nat.succ 2) → M
⊢ (fun v => v 0 = (fun v => v 0 # v 1) fun x => v x.succ) v ↔ (Semiformula.Evalbm M v) (HSemiformula.val hashDef)

State before:
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈𝚫₀ + 𝛀₁
v : Fin (Nat.succ 2) → M
⊢ (fun v => v 0 = (fun v => v 0 # v 1) fun x => v x.succ) v ↔ (Semiformula.Evalbm M v) (HSemiformula.val hashDef)
Tactic:
simp[hashDef, length_defined.df.iff, Exponential.defined.df.iff, ←le_iff_lt_succ]
State after:
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈𝚫₀ + 𝛀₁
v : Fin (Nat.succ 2) → M
⊢ v 0 = v 1 # v 2 ↔ ∃ x ≤ v 1, ∃ x_1 ≤ v 2, x = ‖v 1‖ ∧ x_1 = ‖v 2‖ ∧ Exponential (x * x_1) (v 0)

State before:
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈𝚫₀ + 𝛀₁
v : Fin (Nat.succ 2) → M
⊢ v 0 = v 1 # v 2 ↔ ∃ x ≤ v 1, ∃ x_1 ≤ v 2, x = ‖v 1‖ ∧ x_1 = ‖v 2‖ ∧ Exponential (x * x_1) (v 0)
Tactic:
constructor
State after:
case mp
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈𝚫₀ + 𝛀₁
v : Fin (Nat.succ 2) → M
⊢ v 0 = v 1 # v 2 → ∃ x ≤ v 1, ∃ x_1 ≤ v 2, x = ‖v 1‖ ∧ x_1 = ‖v 2‖ ∧ Exponential (x * x_1) (v 0)

case mpr
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈𝚫₀ + 𝛀₁
v : Fin (Nat.succ 2) → M
⊢ (∃ x ≤ v 1, ∃ x_1 ≤ v 2, x = ‖v 1‖ ∧ x_1 = ‖v 2‖ ∧ Exponential (x * x_1) (v 0)) → v 0 = v 1 # v 2

State before:
case mp
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈𝚫₀ + 𝛀₁
v : Fin (Nat.succ 2) → M
⊢ v 0 = v 1 # v 2 → ∃ x ≤ v 1, ∃ x_1 ≤ v 2, x = ‖v 1‖ ∧ x_1 = ‖v 2‖ ∧ Exponential (x * x_1) (v 0)
Tactic:
intro h
State after:
case mp
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈𝚫₀ + 𝛀₁
v : Fin (Nat.succ 2) → M
h : v 0 = v 1 # v 2
⊢ ∃ x ≤ v 1, ∃ x_1 ≤ v 2, x = ‖v 1‖ ∧ x_1 = ‖v 2‖ ∧ Exponential (x * x_1) (v 0)

State before:
case mp
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈𝚫₀ + 𝛀₁
v : Fin (Nat.succ 2) → M
h : v 0 = v 1 # v 2
⊢ ∃ x ≤ v 1, ∃ x_1 ≤ v 2, x = ‖v 1‖ ∧ x_1 = ‖v 2‖ ∧ Exponential (x * x_1) (v 0)
Tactic:
exact ⟨‖v 1‖, by simp, ‖v 2‖, by simp, rfl, rfl, by rw [h]; exact exponential_hash _ _⟩
State after:
no goals

State before:
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈𝚫₀ + 𝛀₁
v : Fin (Nat.succ 2) → M
h : v 0 = v 1 # v 2
⊢ ‖v 1‖ ≤ v 1
Tactic:
simp
State after:
no goals

State before:
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈𝚫₀ + 𝛀₁
v : Fin (Nat.succ 2) → M
h : v 0 = v 1 # v 2
⊢ ‖v 2‖ ≤ v 2
Tactic:
simp
State after:
no goals

State before:
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈𝚫₀ + 𝛀₁
v : Fin (Nat.succ 2) → M
h : v 0 = v 1 # v 2
⊢ Exponential (‖v 1‖ * ‖v 2‖) (v 0)
Tactic:
rw [h]
State after:
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈𝚫₀ + 𝛀₁
v : Fin (Nat.succ 2) → M
h : v 0 = v 1 # v 2
⊢ Exponential (‖v 1‖ * ‖v 2‖) (v 1 # v 2)

State before:
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈𝚫₀ + 𝛀₁
v : Fin (Nat.succ 2) → M
h : v 0 = v 1 # v 2
⊢ Exponential (‖v 1‖ * ‖v 2‖) (v 1 # v 2)
Tactic:
exact exponential_hash _ _
State after:
no goals

State before:
case mpr
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈𝚫₀ + 𝛀₁
v : Fin (Nat.succ 2) → M
⊢ (∃ x ≤ v 1, ∃ x_1 ≤ v 2, x = ‖v 1‖ ∧ x_1 = ‖v 2‖ ∧ Exponential (x * x_1) (v 0)) → v 0 = v 1 # v 2
Tactic:
rintro ⟨_, _, _, _, rfl, rfl, h⟩
State after:
case mpr.intro.intro.intro.intro.intro.intro
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈𝚫₀ + 𝛀₁
v : Fin (Nat.succ 2) → M
left✝¹ : ‖v 1‖ ≤ v 1
left✝ : ‖v 2‖ ≤ v 2
h : Exponential (‖v 1‖ * ‖v 2‖) (v 0)
⊢ v 0 = v 1 # v 2

State before:
case mpr.intro.intro.intro.intro.intro.intro
M : Type u_1
inst✝⁵ : Zero M
inst✝⁴ : One M
inst✝³ : Add M
inst✝² : Mul M
inst✝¹ : LT M
inst✝ : M ⊧ₘ* 𝐈𝚫₀ + 𝛀₁
v : Fin (Nat.succ 2) → M
left✝¹ : ‖v 1‖ ≤ v 1
left✝ : ‖v 2‖ ≤ v 2
h : Exponential (‖v 1‖ * ‖v 2‖) (v 0)
⊢ v 0 = v 1 # v 2
Tactic:
exact h.uniq (exponential_hash (v 1) (v 2))
State after:
no goals