Imports
/-
Copyright (c) 2026 Google LLC. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
-/
module
public import Cryptids.Propositions
public import Mathlib.Tactic.Ring
Gödel Numbering, Hilbert System, and Soundness of zf2.nql in Mathlib's ZFSet
This module formalizes the logical core of Stefan O'Rear's zf2.nql ZF proof enumerator:
Cantor Unpairing: the inverse cantorUnpair of cantorPair (Cryptids.Propositions), with
bijection theorems cantorUnpair_cantorPair and cantorPair_cantorUnpair.
Total Tarski Truth Predicate zfHolds: a well-founded satisfaction relation on all
natural numbers n : ℕ under valuations v : ℕ → ZFSet.{u}, with [simp] Tarski equations
for every constructor and agreement with the structural ZFFormula.Holds.
Soundness: zfProvable_zfHolds, zfProvable_sound_zfSet, and
not_zfInconsistent : ¬ ZFInconsistent, derived from Mathlib's ZFSet.{0} model
(ZFSet.ext, ZFSet.powerset, ZFSet.sUnion, ZFSet.sep/ZFSet.image for Replacement,
and an explicit singleton-closed witness for Infinity).
@[expose] public sectionnamespace ConjectureMachines.Semantics.Zf
Section 1: Basic [simp] Lemmas for Formula Encodings
@[simp]
theorem cantorPair_zero_zero : cantorPair 0 0 = 0 := rfl@[simp]
theorem cantorPair_zero_one : cantorPair 0 1 = 1 := rfl@[simp]
theorem zfEq_zero_zero : zfEq 0 0 = 0 := rfl@[simp]
theorem zfMem_zero_zero : zfMem 0 0 = 1 := rflSection 1b: Cantor Unpairing and Bounds
One step along the Cantor diagonal enumeration of ℕ × ℕ.
def cantorStep (p : ℕ × ℕ) : ℕ × ℕ :=
match p.2 with
| 0 => (0, p.1 + 1)
| y + 1 => (p.1 + 1, y)
Inverse of cantorPair, defined by iterating cantorStep from (0, 0).
def cantorUnpair : ℕ → ℕ × ℕ
| 0 => (0, 0)
| z + 1 => cantorStep (cantorUnpair z)@[simp]
theorem cantorUnpair_zero : cantorUnpair 0 = (0, 0) := rfl@[simp]
theorem cantorUnpair_succ (z : ℕ) : cantorUnpair (z + 1) = cantorStep (cantorUnpair z) := rfltheorem tri_succ (n : ℕ) :
(n + 1) * (n + 1 + 1) / 2 = n * (n + 1) / 2 + (n + 1) := n:ℕ⊢ (n + 1) * (n + 1 + 1) / 2 = n * (n + 1) / 2 + (n + 1)
n:ℕh:(n + 1) * (n + 1 + 1) = n * (n + 1) + (n + 1) * 2⊢ (n + 1) * (n + 1 + 1) / 2 = n * (n + 1) / 2 + (n + 1)
All goals completed! 🐙private theorem le_tri (n : ℕ) : n ≤ n * (n + 1) / 2 := by n:ℕ⊢ n ≤ n * (n + 1) / 2
cases n with
| zero => zero ⊢ 0 ≤ 0 * (0 + 1) / 2 omega All goals completed! 🐙
| succ m => succ m:ℕ⊢ m + 1 ≤ (m + 1) * (m + 1 + 1) / 2
have := tri_succ m succ m:ℕthis:(m + 1) * (m + 1 + 1) / 2 = m * (m + 1) / 2 + (m + 1)⊢ m + 1 ≤ (m + 1) * (m + 1 + 1) / 2
omega All goals completed! 🐙theorem add_le_cantorPair (x y : ℕ) : x + y ≤ cantorPair x y := by x:ℕy:ℕ⊢ x + y ≤ cantorPair x y
unfold cantorPair x:ℕy:ℕ⊢ x + y ≤ x + (x + y) * (x + y + 1) / 2
have := le_tri (x + y) x:ℕy:ℕthis:x + y ≤ (x + y) * (x + y + 1) / 2⊢ x + y ≤ x + (x + y) * (x + y + 1) / 2
omega All goals completed! 🐙theorem le_cantorPair_left (x y : ℕ) : x ≤ cantorPair x y := by x:ℕy:ℕ⊢ x ≤ cantorPair x y
have := add_le_cantorPair x y x:ℕy:ℕthis:x + y ≤ cantorPair x y⊢ x ≤ cantorPair x y
omega All goals completed! 🐙theorem le_cantorPair_right (x y : ℕ) : y ≤ cantorPair x y := by x:ℕy:ℕ⊢ y ≤ cantorPair x y
have := add_le_cantorPair x y x:ℕy:ℕthis:x + y ≤ cantorPair x y⊢ y ≤ cantorPair x y
omega All goals completed! 🐙theorem lt_cantorPair_left_of_pos (x y : ℕ) (hy : 0 < y) : x < cantorPair x y := by x:ℕy:ℕhy:0 < y⊢ x < cantorPair x y
have := add_le_cantorPair x y x:ℕy:ℕhy:0 < ythis:x + y ≤ cantorPair x y⊢ x < cantorPair x y
omega All goals completed! 🐙theorem cantorPair_zero_succ (x : ℕ) : cantorPair 0 (x + 1) = cantorPair x 0 + 1 := by x:ℕ⊢ cantorPair 0 (x + 1) = cantorPair x 0 + 1
unfold cantorPair x:ℕ⊢ 0 + (0 + (x + 1)) * (0 + (x + 1) + 1) / 2 = x + (x + 0) * (x + 0 + 1) / 2 + 1
simp only [Nat.zero_add, Nat.add_zero] x:ℕ⊢ (x + 1) * (x + 1 + 1) / 2 = x + x * (x + 1) / 2 + 1
have := tri_succ x x:ℕthis:(x + 1) * (x + 1 + 1) / 2 = x * (x + 1) / 2 + (x + 1)⊢ (x + 1) * (x + 1 + 1) / 2 = x + x * (x + 1) / 2 + 1
omega All goals completed! 🐙theorem cantorPair_succ_left (x y : ℕ) : cantorPair (x + 1) y = cantorPair x (y + 1) + 1 := by x:ℕy:ℕ⊢ cantorPair (x + 1) y = cantorPair x (y + 1) + 1
unfold cantorPair x:ℕy:ℕ⊢ x + 1 + (x + 1 + y) * (x + 1 + y + 1) / 2 = x + (x + (y + 1)) * (x + (y + 1) + 1) / 2 + 1
have h1 : x + 1 + y = x + (y + 1) := by x:ℕy:ℕ⊢ cantorPair (x + 1) y = cantorPair x (y + 1) + 1 omega x:ℕy:ℕh1:x + 1 + y = x + (y + 1)⊢ x + 1 + (x + 1 + y) * (x + 1 + y + 1) / 2 = x + (x + (y + 1)) * (x + (y + 1) + 1) / 2 + 1
rw [h1 x:ℕy:ℕh1:x + 1 + y = x + (y + 1)⊢ x + 1 + (x + (y + 1)) * (x + (y + 1) + 1) / 2 = x + (x + (y + 1)) * (x + (y + 1) + 1) / 2 + 1] x:ℕy:ℕh1:x + 1 + y = x + (y + 1)⊢ x + 1 + (x + (y + 1)) * (x + (y + 1) + 1) / 2 = x + (x + (y + 1)) * (x + (y + 1) + 1) / 2 + 1
omega All goals completed! 🐙theorem cantorPair_cantorStep (p : ℕ × ℕ) :
cantorPair (cantorStep p).1 (cantorStep p).2 = cantorPair p.1 p.2 + 1 := by p:ℕ × ℕ⊢ cantorPair (cantorStep p).1 (cantorStep p).2 = cantorPair p.1 p.2 + 1
rcases p with ⟨x, _ | y⟩ zero x:ℕ⊢ cantorPair (cantorStep (x, 0)).1 (cantorStep (x, 0)).2 = cantorPair (x, 0).1 (x, 0).2 + 1succ x:ℕy:ℕ⊢ cantorPair (cantorStep (x, y + 1)).1 (cantorStep (x, y + 1)).2 = cantorPair (x, y + 1).1 (x, y + 1).2 + 1
· zero x:ℕ⊢ cantorPair (cantorStep (x, 0)).1 (cantorStep (x, 0)).2 = cantorPair (x, 0).1 (x, 0).2 + 1 exact cantorPair_zero_succ x All goals completed! 🐙
· succ x:ℕy:ℕ⊢ cantorPair (cantorStep (x, y + 1)).1 (cantorStep (x, y + 1)).2 = cantorPair (x, y + 1).1 (x, y + 1).2 + 1 exact cantorPair_succ_left x y All goals completed! 🐙@[simp]
theorem cantorPair_cantorUnpair (z : ℕ) :
cantorPair (cantorUnpair z).1 (cantorUnpair z).2 = z := by z:ℕ⊢ cantorPair (cantorUnpair z).1 (cantorUnpair z).2 = z
induction z with
| zero => zero ⊢ cantorPair (cantorUnpair 0).1 (cantorUnpair 0).2 = 0 rfl All goals completed! 🐙
| succ z ih => succ z:ℕih:cantorPair (cantorUnpair z).1 (cantorUnpair z).2 = z⊢ cantorPair (cantorUnpair (z + 1)).1 (cantorUnpair (z + 1)).2 = z + 1
unfold cantorUnpair succ z:ℕih:cantorPair (cantorUnpair z).1 (cantorUnpair z).2 = z⊢ cantorPair (cantorStep (cantorUnpair z)).1 (cantorStep (cantorUnpair z)).2 = z + 1
rw [cantorPair_cantorStep, succ z:ℕih:cantorPair (cantorUnpair z).1 (cantorUnpair z).2 = z⊢ cantorPair (cantorUnpair z).1 (cantorUnpair z).2 + 1 = z + 1 ih succ z:ℕih:cantorPair (cantorUnpair z).1 (cantorUnpair z).2 = z⊢ z + 1 = z + 1] All goals completed! 🐙private theorem cantorUnpair_cantorPair_aux (s : ℕ) :
∀ x y, x + y = s → cantorUnpair (cantorPair x y) = (x, y) := by s:ℕ⊢ ∀ (x y : ℕ), x + y = s → cantorUnpair (cantorPair x y) = (x, y)
induction s with
| zero => zero ⊢ ∀ (x y : ℕ), x + y = 0 → cantorUnpair (cantorPair x y) = (x, y)
intro x y h zero x:ℕy:ℕh:x + y = 0⊢ cantorUnpair (cantorPair x y) = (x, y)
obtain ⟨rfl, rfl⟩ : x = 0 ∧ y = 0 := by x:ℕy:ℕh:x + y = 0⊢ x = 0 ∧ y = 0 omega zero h:0 + 0 = 0⊢ cantorUnpair (cantorPair 0 0) = (0, 0)
rfl All goals completed! 🐙
| succ s ihs => succ s:ℕihs:∀ (x y : ℕ), x + y = s → cantorUnpair (cantorPair x y) = (x, y)⊢ ∀ (x y : ℕ), x + y = s + 1 → cantorUnpair (cantorPair x y) = (x, y)
intro x succ s:ℕihs:∀ (x y : ℕ), x + y = s → cantorUnpair (cantorPair x y) = (x, y)x:ℕ⊢ ∀ (y : ℕ), x + y = s + 1 → cantorUnpair (cantorPair x y) = (x, y)
induction x with
| zero => succ.zero s:ℕihs:∀ (x y : ℕ), x + y = s → cantorUnpair (cantorPair x y) = (x, y)⊢ ∀ (y : ℕ), 0 + y = s + 1 → cantorUnpair (cantorPair 0 y) = (0, y)
intro y hy succ.zero s:ℕihs:∀ (x y : ℕ), x + y = s → cantorUnpair (cantorPair x y) = (x, y)y:ℕhy:0 + y = s + 1⊢ cantorUnpair (cantorPair 0 y) = (0, y)
obtain rfl : y = s + 1 := by s:ℕihs:∀ (x y : ℕ), x + y = s → cantorUnpair (cantorPair x y) = (x, y)y:ℕhy:0 + y = s + 1⊢ y = s + 1 omega succ.zero s:ℕihs:∀ (x y : ℕ), x + y = s → cantorUnpair (cantorPair x y) = (x, y)hy:0 + (s + 1) = s + 1⊢ cantorUnpair (cantorPair 0 (s + 1)) = (0, s + 1)
rw [cantorPair_zero_succ, succ.zero s:ℕihs:∀ (x y : ℕ), x + y = s → cantorUnpair (cantorPair x y) = (x, y)hy:0 + (s + 1) = s + 1⊢ cantorUnpair (cantorPair s 0 + 1) = (0, s + 1) cantorUnpair, succ.zero s:ℕihs:∀ (x y : ℕ), x + y = s → cantorUnpair (cantorPair x y) = (x, y)hy:0 + (s + 1) = s + 1⊢ cantorStep (cantorUnpair (cantorPair s 0)) = (0, s + 1) ihs s 0 (by s:ℕihs:∀ (x y : ℕ), x + y = s → cantorUnpair (cantorPair x y) = (x, y)hy:0 + (s + 1) = s + 1⊢ s + 0 = s omega All goals completed! 🐙)] succ.zero s:ℕihs:∀ (x y : ℕ), x + y = s → cantorUnpair (cantorPair x y) = (x, y)hy:0 + (s + 1) = s + 1⊢ cantorStep (s, 0) = (0, s + 1)
rfl All goals completed! 🐙
| succ x ihx => succ.succ s:ℕihs:∀ (x y : ℕ), x + y = s → cantorUnpair (cantorPair x y) = (x, y)x:ℕihx:∀ (y : ℕ), x + y = s + 1 → cantorUnpair (cantorPair x y) = (x, y)⊢ ∀ (y : ℕ), x + 1 + y = s + 1 → cantorUnpair (cantorPair (x + 1) y) = (x + 1, y)
intro y hy succ.succ s:ℕihs:∀ (x y : ℕ), x + y = s → cantorUnpair (cantorPair x y) = (x, y)x:ℕihx:∀ (y : ℕ), x + y = s + 1 → cantorUnpair (cantorPair x y) = (x, y)y:ℕhy:x + 1 + y = s + 1⊢ cantorUnpair (cantorPair (x + 1) y) = (x + 1, y)
rw [cantorPair_succ_left, succ.succ s:ℕihs:∀ (x y : ℕ), x + y = s → cantorUnpair (cantorPair x y) = (x, y)x:ℕihx:∀ (y : ℕ), x + y = s + 1 → cantorUnpair (cantorPair x y) = (x, y)y:ℕhy:x + 1 + y = s + 1⊢ cantorUnpair (cantorPair x (y + 1) + 1) = (x + 1, y) cantorUnpair, succ.succ s:ℕihs:∀ (x y : ℕ), x + y = s → cantorUnpair (cantorPair x y) = (x, y)x:ℕihx:∀ (y : ℕ), x + y = s + 1 → cantorUnpair (cantorPair x y) = (x, y)y:ℕhy:x + 1 + y = s + 1⊢ cantorStep (cantorUnpair (cantorPair x (y + 1))) = (x + 1, y) ihx (y + 1) (by s:ℕihs:∀ (x y : ℕ), x + y = s → cantorUnpair (cantorPair x y) = (x, y)x:ℕihx:∀ (y : ℕ), x + y = s + 1 → cantorUnpair (cantorPair x y) = (x, y)y:ℕhy:x + 1 + y = s + 1⊢ x + (y + 1) = s + 1 omega All goals completed! 🐙)] succ.succ s:ℕihs:∀ (x y : ℕ), x + y = s → cantorUnpair (cantorPair x y) = (x, y)x:ℕihx:∀ (y : ℕ), x + y = s + 1 → cantorUnpair (cantorPair x y) = (x, y)y:ℕhy:x + 1 + y = s + 1⊢ cantorStep (x, y + 1) = (x + 1, y)
rfl All goals completed! 🐙@[simp]
theorem cantorUnpair_cantorPair (x y : ℕ) :
cantorUnpair (cantorPair x y) = (x, y) :=
cantorUnpair_cantorPair_aux (x + y) x y rfltheorem cantorUnpair_fst_lt_of_snd_pos {n : ℕ} (h : 0 < (cantorUnpair n).2) :
(cantorUnpair n).1 < n := by n:ℕh:0 < (cantorUnpair n).2⊢ (cantorUnpair n).1 < n
have h1 := lt_cantorPair_left_of_pos (cantorUnpair n).1 (cantorUnpair n).2 h n:ℕh:0 < (cantorUnpair n).2h1:(cantorUnpair n).1 < cantorPair (cantorUnpair n).1 (cantorUnpair n).2⊢ (cantorUnpair n).1 < n
rwa [cantorPair_cantorUnpair] at h1 All goals completed! 🐙theorem cantorUnpair_fst_le (m : ℕ) : (cantorUnpair m).1 ≤ m := by m:ℕ⊢ (cantorUnpair m).1 ≤ m
have h1 := le_cantorPair_left (cantorUnpair m).1 (cantorUnpair m).2 m:ℕh1:(cantorUnpair m).1 ≤ cantorPair (cantorUnpair m).1 (cantorUnpair m).2⊢ (cantorUnpair m).1 ≤ m
rwa [cantorPair_cantorUnpair] at h1 All goals completed! 🐙theorem cantorUnpair_snd_le (m : ℕ) : (cantorUnpair m).2 ≤ m := by m:ℕ⊢ (cantorUnpair m).2 ≤ m
have h1 := le_cantorPair_right (cantorUnpair m).1 (cantorUnpair m).2 m:ℕh1:(cantorUnpair m).2 ≤ cantorPair (cantorUnpair m).1 (cantorUnpair m).2⊢ (cantorUnpair m).2 ≤ m
rwa [cantorPair_cantorUnpair] at h1 All goals completed! 🐙
Section 1c: Total Tarski Truth Predicate on ℕ
Total Tarski satisfaction predicate on Gödel numbers n : ℕ under valuation
v : ℕ → ZFSet.{u}.
def zfHolds (n : ℕ) (v : ℕ → ZFSet.{u}) : Prop :=
let m := (cantorUnpair n).1
let op := (cantorUnpair n).2
if h0 : op = 0 then
v (cantorUnpair m).1 = v (cantorUnpair m).2
else if h1 : op = 1 then
v (cantorUnpair m).1 ∈ v (cantorUnpair m).2
else if h2 : op = 2 then
have hm : m < n := cantorUnpair_fst_lt_of_snd_pos (by n:ℕv:ℕ → ZFSet.{u}m:ℕ := (cantorUnpair n).1op:ℕ := (cantorUnpair n).2h0:¬op = 0h1:¬op = 1h2:op = 2⊢ 0 < (cantorUnpair n).2 omega All goals completed! 🐙)
have hp : (cantorUnpair m).1 < n := Nat.lt_of_le_of_lt (cantorUnpair_fst_le m) hm
have hq : (cantorUnpair m).2 < n := Nat.lt_of_le_of_lt (cantorUnpair_snd_le m) hm
zfHolds (cantorUnpair m).1 v → zfHolds (cantorUnpair m).2 v
else if h3 : op = 3 then
have hm : m < n := cantorUnpair_fst_lt_of_snd_pos (by n:ℕv:ℕ → ZFSet.{u}m:ℕ := (cantorUnpair n).1op:ℕ := (cantorUnpair n).2h0:¬op = 0h1:¬op = 1h2:¬op = 2h3:op = 3⊢ 0 < (cantorUnpair n).2 omega All goals completed! 🐙)
¬ zfHolds m v
else if h4 : op = 4 then
have hm : m < n := cantorUnpair_fst_lt_of_snd_pos (by n:ℕv:ℕ → ZFSet.{u}m:ℕ := (cantorUnpair n).1op:ℕ := (cantorUnpair n).2h0:¬op = 0h1:¬op = 1h2:¬op = 2h3:¬op = 3h4:op = 4⊢ 0 < (cantorUnpair n).2 omega All goals completed! 🐙)
have hp : (cantorUnpair m).2 < n := Nat.lt_of_le_of_lt (cantorUnpair_snd_le m) hm
∀ s : ZFSet.{u}, zfHolds (cantorUnpair m).2 (Function.update v (cantorUnpair m).1 s)
else
True
termination_by n@[simp]
theorem zfHolds_zfEq (x y : ℕ) (v : ℕ → ZFSet.{u}) :
zfHolds (zfEq x y) v ↔ v x = v y := by x:ℕy:ℕv:ℕ → ZFSet.{u}⊢ zfHolds (zfEq x y) v ↔ v x = v y
rw [zfHolds x:ℕy:ℕv:ℕ → ZFSet.{u}⊢ (if h0 : (cantorUnpair (zfEq x y)).2 = 0 then
v (cantorUnpair (cantorUnpair (zfEq x y)).1).1 = v (cantorUnpair (cantorUnpair (zfEq x y)).1).2
else
if h1 : (cantorUnpair (zfEq x y)).2 = 1 then
v (cantorUnpair (cantorUnpair (zfEq x y)).1).1 ∈ v (cantorUnpair (cantorUnpair (zfEq x y)).1).2
else
if h2 : (cantorUnpair (zfEq x y)).2 = 2 then
have hm := ⋯;
have hp := ⋯;
have hq := ⋯;
zfHolds (cantorUnpair (cantorUnpair (zfEq x y)).1).1 v → zfHolds (cantorUnpair (cantorUnpair (zfEq x y)).1).2 v
else
if h3 : (cantorUnpair (zfEq x y)).2 = 3 then
have hm := ⋯;
¬zfHolds (cantorUnpair (zfEq x y)).1 v
else
if h4 : (cantorUnpair (zfEq x y)).2 = 4 then
have hm := ⋯;
have hp := ⋯;
∀ (s : ZFSet.{u}),
zfHolds (cantorUnpair (cantorUnpair (zfEq x y)).1).2
(Function.update v (cantorUnpair (cantorUnpair (zfEq x y)).1).1 s)
else True) ↔
v x = v y] x:ℕy:ℕv:ℕ → ZFSet.{u}⊢ (if h0 : (cantorUnpair (zfEq x y)).2 = 0 then
v (cantorUnpair (cantorUnpair (zfEq x y)).1).1 = v (cantorUnpair (cantorUnpair (zfEq x y)).1).2
else
if h1 : (cantorUnpair (zfEq x y)).2 = 1 then
v (cantorUnpair (cantorUnpair (zfEq x y)).1).1 ∈ v (cantorUnpair (cantorUnpair (zfEq x y)).1).2
else
if h2 : (cantorUnpair (zfEq x y)).2 = 2 then
have hm := ⋯;
have hp := ⋯;
have hq := ⋯;
zfHolds (cantorUnpair (cantorUnpair (zfEq x y)).1).1 v → zfHolds (cantorUnpair (cantorUnpair (zfEq x y)).1).2 v
else
if h3 : (cantorUnpair (zfEq x y)).2 = 3 then
have hm := ⋯;
¬zfHolds (cantorUnpair (zfEq x y)).1 v
else
if h4 : (cantorUnpair (zfEq x y)).2 = 4 then
have hm := ⋯;
have hp := ⋯;
∀ (s : ZFSet.{u}),
zfHolds (cantorUnpair (cantorUnpair (zfEq x y)).1).2
(Function.update v (cantorUnpair (cantorUnpair (zfEq x y)).1).1 s)
else True) ↔
v x = v y
simp [zfEq] All goals completed! 🐙@[simp]
theorem zfHolds_zfMem (x y : ℕ) (v : ℕ → ZFSet.{u}) :
zfHolds (zfMem x y) v ↔ v x ∈ v y := by x:ℕy:ℕv:ℕ → ZFSet.{u}⊢ zfHolds (zfMem x y) v ↔ v x ∈ v y
rw [zfHolds x:ℕy:ℕv:ℕ → ZFSet.{u}⊢ (if h0 : (cantorUnpair (zfMem x y)).2 = 0 then
v (cantorUnpair (cantorUnpair (zfMem x y)).1).1 = v (cantorUnpair (cantorUnpair (zfMem x y)).1).2
else
if h1 : (cantorUnpair (zfMem x y)).2 = 1 then
v (cantorUnpair (cantorUnpair (zfMem x y)).1).1 ∈ v (cantorUnpair (cantorUnpair (zfMem x y)).1).2
else
if h2 : (cantorUnpair (zfMem x y)).2 = 2 then
have hm := ⋯;
have hp := ⋯;
have hq := ⋯;
zfHolds (cantorUnpair (cantorUnpair (zfMem x y)).1).1 v →
zfHolds (cantorUnpair (cantorUnpair (zfMem x y)).1).2 v
else
if h3 : (cantorUnpair (zfMem x y)).2 = 3 then
have hm := ⋯;
¬zfHolds (cantorUnpair (zfMem x y)).1 v
else
if h4 : (cantorUnpair (zfMem x y)).2 = 4 then
have hm := ⋯;
have hp := ⋯;
∀ (s : ZFSet.{u}),
zfHolds (cantorUnpair (cantorUnpair (zfMem x y)).1).2
(Function.update v (cantorUnpair (cantorUnpair (zfMem x y)).1).1 s)
else True) ↔
v x ∈ v y] x:ℕy:ℕv:ℕ → ZFSet.{u}⊢ (if h0 : (cantorUnpair (zfMem x y)).2 = 0 then
v (cantorUnpair (cantorUnpair (zfMem x y)).1).1 = v (cantorUnpair (cantorUnpair (zfMem x y)).1).2
else
if h1 : (cantorUnpair (zfMem x y)).2 = 1 then
v (cantorUnpair (cantorUnpair (zfMem x y)).1).1 ∈ v (cantorUnpair (cantorUnpair (zfMem x y)).1).2
else
if h2 : (cantorUnpair (zfMem x y)).2 = 2 then
have hm := ⋯;
have hp := ⋯;
have hq := ⋯;
zfHolds (cantorUnpair (cantorUnpair (zfMem x y)).1).1 v →
zfHolds (cantorUnpair (cantorUnpair (zfMem x y)).1).2 v
else
if h3 : (cantorUnpair (zfMem x y)).2 = 3 then
have hm := ⋯;
¬zfHolds (cantorUnpair (zfMem x y)).1 v
else
if h4 : (cantorUnpair (zfMem x y)).2 = 4 then
have hm := ⋯;
have hp := ⋯;
∀ (s : ZFSet.{u}),
zfHolds (cantorUnpair (cantorUnpair (zfMem x y)).1).2
(Function.update v (cantorUnpair (cantorUnpair (zfMem x y)).1).1 s)
else True) ↔
v x ∈ v y
simp [zfMem] All goals completed! 🐙@[simp]
theorem zfHolds_zfImp (φ ψ : ℕ) (v : ℕ → ZFSet.{u}) :
zfHolds (zfImp φ ψ) v ↔ (zfHolds φ v → zfHolds ψ v) := by φ:ℕψ:ℕv:ℕ → ZFSet.{u}⊢ zfHolds (zfImp φ ψ) v ↔ zfHolds φ v → zfHolds ψ v
rw [zfHolds φ:ℕψ:ℕv:ℕ → ZFSet.{u}⊢ (if h0 : (cantorUnpair (zfImp φ ψ)).2 = 0 then
v (cantorUnpair (cantorUnpair (zfImp φ ψ)).1).1 = v (cantorUnpair (cantorUnpair (zfImp φ ψ)).1).2
else
if h1 : (cantorUnpair (zfImp φ ψ)).2 = 1 then
v (cantorUnpair (cantorUnpair (zfImp φ ψ)).1).1 ∈ v (cantorUnpair (cantorUnpair (zfImp φ ψ)).1).2
else
if h2 : (cantorUnpair (zfImp φ ψ)).2 = 2 then
have hm := ⋯;
have hp := ⋯;
have hq := ⋯;
zfHolds (cantorUnpair (cantorUnpair (zfImp φ ψ)).1).1 v →
zfHolds (cantorUnpair (cantorUnpair (zfImp φ ψ)).1).2 v
else
if h3 : (cantorUnpair (zfImp φ ψ)).2 = 3 then
have hm := ⋯;
¬zfHolds (cantorUnpair (zfImp φ ψ)).1 v
else
if h4 : (cantorUnpair (zfImp φ ψ)).2 = 4 then
have hm := ⋯;
have hp := ⋯;
∀ (s : ZFSet.{u}),
zfHolds (cantorUnpair (cantorUnpair (zfImp φ ψ)).1).2
(Function.update v (cantorUnpair (cantorUnpair (zfImp φ ψ)).1).1 s)
else True) ↔
zfHolds φ v → zfHolds ψ v] φ:ℕψ:ℕv:ℕ → ZFSet.{u}⊢ (if h0 : (cantorUnpair (zfImp φ ψ)).2 = 0 then
v (cantorUnpair (cantorUnpair (zfImp φ ψ)).1).1 = v (cantorUnpair (cantorUnpair (zfImp φ ψ)).1).2
else
if h1 : (cantorUnpair (zfImp φ ψ)).2 = 1 then
v (cantorUnpair (cantorUnpair (zfImp φ ψ)).1).1 ∈ v (cantorUnpair (cantorUnpair (zfImp φ ψ)).1).2
else
if h2 : (cantorUnpair (zfImp φ ψ)).2 = 2 then
have hm := ⋯;
have hp := ⋯;
have hq := ⋯;
zfHolds (cantorUnpair (cantorUnpair (zfImp φ ψ)).1).1 v →
zfHolds (cantorUnpair (cantorUnpair (zfImp φ ψ)).1).2 v
else
if h3 : (cantorUnpair (zfImp φ ψ)).2 = 3 then
have hm := ⋯;
¬zfHolds (cantorUnpair (zfImp φ ψ)).1 v
else
if h4 : (cantorUnpair (zfImp φ ψ)).2 = 4 then
have hm := ⋯;
have hp := ⋯;
∀ (s : ZFSet.{u}),
zfHolds (cantorUnpair (cantorUnpair (zfImp φ ψ)).1).2
(Function.update v (cantorUnpair (cantorUnpair (zfImp φ ψ)).1).1 s)
else True) ↔
zfHolds φ v → zfHolds ψ v
simp [zfImp] All goals completed! 🐙@[simp]
theorem zfHolds_zfNot (φ : ℕ) (v : ℕ → ZFSet.{u}) :
zfHolds (zfNot φ) v ↔ ¬ zfHolds φ v := by φ:ℕv:ℕ → ZFSet.{u}⊢ zfHolds (zfNot φ) v ↔ ¬zfHolds φ v
rw [zfHolds φ:ℕv:ℕ → ZFSet.{u}⊢ (if h0 : (cantorUnpair (zfNot φ)).2 = 0 then
v (cantorUnpair (cantorUnpair (zfNot φ)).1).1 = v (cantorUnpair (cantorUnpair (zfNot φ)).1).2
else
if h1 : (cantorUnpair (zfNot φ)).2 = 1 then
v (cantorUnpair (cantorUnpair (zfNot φ)).1).1 ∈ v (cantorUnpair (cantorUnpair (zfNot φ)).1).2
else
if h2 : (cantorUnpair (zfNot φ)).2 = 2 then
have hm := ⋯;
have hp := ⋯;
have hq := ⋯;
zfHolds (cantorUnpair (cantorUnpair (zfNot φ)).1).1 v → zfHolds (cantorUnpair (cantorUnpair (zfNot φ)).1).2 v
else
if h3 : (cantorUnpair (zfNot φ)).2 = 3 then
have hm := ⋯;
¬zfHolds (cantorUnpair (zfNot φ)).1 v
else
if h4 : (cantorUnpair (zfNot φ)).2 = 4 then
have hm := ⋯;
have hp := ⋯;
∀ (s : ZFSet.{u}),
zfHolds (cantorUnpair (cantorUnpair (zfNot φ)).1).2
(Function.update v (cantorUnpair (cantorUnpair (zfNot φ)).1).1 s)
else True) ↔
¬zfHolds φ v] φ:ℕv:ℕ → ZFSet.{u}⊢ (if h0 : (cantorUnpair (zfNot φ)).2 = 0 then
v (cantorUnpair (cantorUnpair (zfNot φ)).1).1 = v (cantorUnpair (cantorUnpair (zfNot φ)).1).2
else
if h1 : (cantorUnpair (zfNot φ)).2 = 1 then
v (cantorUnpair (cantorUnpair (zfNot φ)).1).1 ∈ v (cantorUnpair (cantorUnpair (zfNot φ)).1).2
else
if h2 : (cantorUnpair (zfNot φ)).2 = 2 then
have hm := ⋯;
have hp := ⋯;
have hq := ⋯;
zfHolds (cantorUnpair (cantorUnpair (zfNot φ)).1).1 v → zfHolds (cantorUnpair (cantorUnpair (zfNot φ)).1).2 v
else
if h3 : (cantorUnpair (zfNot φ)).2 = 3 then
have hm := ⋯;
¬zfHolds (cantorUnpair (zfNot φ)).1 v
else
if h4 : (cantorUnpair (zfNot φ)).2 = 4 then
have hm := ⋯;
have hp := ⋯;
∀ (s : ZFSet.{u}),
zfHolds (cantorUnpair (cantorUnpair (zfNot φ)).1).2
(Function.update v (cantorUnpair (cantorUnpair (zfNot φ)).1).1 s)
else True) ↔
¬zfHolds φ v
simp [zfNot] All goals completed! 🐙@[simp]
theorem zfHolds_zfAll (x φ : ℕ) (v : ℕ → ZFSet.{u}) :
zfHolds (zfAll x φ) v ↔ ∀ s : ZFSet.{u}, zfHolds φ (Function.update v x s) := by x:ℕφ:ℕv:ℕ → ZFSet.{u}⊢ zfHolds (zfAll x φ) v ↔ ∀ (s : ZFSet.{u}), zfHolds φ (Function.update v x s)
rw [zfHolds x:ℕφ:ℕv:ℕ → ZFSet.{u}⊢ (if h0 : (cantorUnpair (zfAll x φ)).2 = 0 then
v (cantorUnpair (cantorUnpair (zfAll x φ)).1).1 = v (cantorUnpair (cantorUnpair (zfAll x φ)).1).2
else
if h1 : (cantorUnpair (zfAll x φ)).2 = 1 then
v (cantorUnpair (cantorUnpair (zfAll x φ)).1).1 ∈ v (cantorUnpair (cantorUnpair (zfAll x φ)).1).2
else
if h2 : (cantorUnpair (zfAll x φ)).2 = 2 then
have hm := ⋯;
have hp := ⋯;
have hq := ⋯;
zfHolds (cantorUnpair (cantorUnpair (zfAll x φ)).1).1 v →
zfHolds (cantorUnpair (cantorUnpair (zfAll x φ)).1).2 v
else
if h3 : (cantorUnpair (zfAll x φ)).2 = 3 then
have hm := ⋯;
¬zfHolds (cantorUnpair (zfAll x φ)).1 v
else
if h4 : (cantorUnpair (zfAll x φ)).2 = 4 then
have hm := ⋯;
have hp := ⋯;
∀ (s : ZFSet.{u}),
zfHolds (cantorUnpair (cantorUnpair (zfAll x φ)).1).2
(Function.update v (cantorUnpair (cantorUnpair (zfAll x φ)).1).1 s)
else True) ↔
∀ (s : ZFSet.{u}), zfHolds φ (Function.update v x s)] x:ℕφ:ℕv:ℕ → ZFSet.{u}⊢ (if h0 : (cantorUnpair (zfAll x φ)).2 = 0 then
v (cantorUnpair (cantorUnpair (zfAll x φ)).1).1 = v (cantorUnpair (cantorUnpair (zfAll x φ)).1).2
else
if h1 : (cantorUnpair (zfAll x φ)).2 = 1 then
v (cantorUnpair (cantorUnpair (zfAll x φ)).1).1 ∈ v (cantorUnpair (cantorUnpair (zfAll x φ)).1).2
else
if h2 : (cantorUnpair (zfAll x φ)).2 = 2 then
have hm := ⋯;
have hp := ⋯;
have hq := ⋯;
zfHolds (cantorUnpair (cantorUnpair (zfAll x φ)).1).1 v →
zfHolds (cantorUnpair (cantorUnpair (zfAll x φ)).1).2 v
else
if h3 : (cantorUnpair (zfAll x φ)).2 = 3 then
have hm := ⋯;
¬zfHolds (cantorUnpair (zfAll x φ)).1 v
else
if h4 : (cantorUnpair (zfAll x φ)).2 = 4 then
have hm := ⋯;
have hp := ⋯;
∀ (s : ZFSet.{u}),
zfHolds (cantorUnpair (cantorUnpair (zfAll x φ)).1).2
(Function.update v (cantorUnpair (cantorUnpair (zfAll x φ)).1).1 s)
else True) ↔
∀ (s : ZFSet.{u}), zfHolds φ (Function.update v x s)
simp [zfAll] All goals completed! 🐙@[simp]
theorem zfHolds_zfEx (x φ : ℕ) (v : ℕ → ZFSet.{u}) :
zfHolds (zfEx x φ) v ↔ ∃ s : ZFSet.{u}, zfHolds φ (Function.update v x s) := by x:ℕφ:ℕv:ℕ → ZFSet.{u}⊢ zfHolds (zfEx x φ) v ↔ ∃ s, zfHolds φ (Function.update v x s)
simp [zfEx] All goals completed! 🐙@[simp]
theorem zfHolds_zfAnd (φ ψ : ℕ) (v : ℕ → ZFSet.{u}) :
zfHolds (zfAnd φ ψ) v ↔ (zfHolds φ v ∧ zfHolds ψ v) := by φ:ℕψ:ℕv:ℕ → ZFSet.{u}⊢ zfHolds (zfAnd φ ψ) v ↔ zfHolds φ v ∧ zfHolds ψ v
simp [zfAnd, Classical.not_imp] All goals completed! 🐙
Section 2: Agreement of zfHolds with ZFFormula.Holds
open ZFFormula in
@[simp]
theorem code_ex (x : ℕ) (φ : ZFFormula) : (ex x φ).code = zfEx x φ.code := rflopen ZFFormula in
@[simp]
theorem code_and (φ ψ : ZFFormula) : (and φ ψ).code = zfAnd φ.code ψ.code := rflopen ZFFormula in
@[simp]
theorem holds_ex (v : ℕ → ZFSet.{u}) (x : ℕ) (φ : ZFFormula) :
(ex x φ).Holds v ↔ ∃ s : ZFSet.{u}, φ.Holds (Function.update v x s) := by v:ℕ → ZFSet.{u}x:ℕφ:ZFFormula⊢ Holds v (ex x φ) ↔ ∃ s, Holds (Function.update v x s) φ
simp [ex, Holds] All goals completed! 🐙@[simp]
theorem holds_and (v : ℕ → ZFSet.{u}) (φ ψ : ZFFormula) :
(ZFFormula.and φ ψ).Holds v ↔ φ.Holds v ∧ ψ.Holds v := by v:ℕ → ZFSet.{u}φ:ZFFormulaψ:ZFFormula⊢ ZFFormula.Holds v (φ.and ψ) ↔ ZFFormula.Holds v φ ∧ ZFFormula.Holds v ψ
simp [ZFFormula.and, ZFFormula.Holds, Classical.not_imp] All goals completed! 🐙
zfHolds on the Gödel code of any ZFFormula agrees with ZFFormula.Holds.
@[simp]
theorem zfHolds_code (φ : ZFFormula) (v : ℕ → ZFSet.{u}) :
zfHolds φ.code v ↔ φ.Holds v := by φ:ZFFormulav:ℕ → ZFSet.{u}⊢ zfHolds φ.code v ↔ ZFFormula.Holds v φ
induction φ generalizing v with
| eq x y => eq x:ℕy:ℕv:ℕ → ZFSet.{u}⊢ zfHolds (ZFFormula.eq x y).code v ↔ ZFFormula.Holds v (ZFFormula.eq x y) simp [ZFFormula.code, ZFFormula.Holds] All goals completed! 🐙
| mem x y => mem x:ℕy:ℕv:ℕ → ZFSet.{u}⊢ zfHolds (ZFFormula.mem x y).code v ↔ ZFFormula.Holds v (ZFFormula.mem x y) simp [ZFFormula.code, ZFFormula.Holds] All goals completed! 🐙
| imp φ ψ ihφ ihψ => imp φ:ZFFormulaψ:ZFFormulaihφ:∀ (v : ℕ → ZFSet.{u}), zfHolds φ.code v ↔ ZFFormula.Holds v φihψ:∀ (v : ℕ → ZFSet.{u}), zfHolds ψ.code v ↔ ZFFormula.Holds v ψv:ℕ → ZFSet.{u}⊢ zfHolds (φ.imp ψ).code v ↔ ZFFormula.Holds v (φ.imp ψ) simp [ZFFormula.code, ZFFormula.Holds, ihφ, ihψ] All goals completed! 🐙
| not φ ihφ => not φ:ZFFormulaihφ:∀ (v : ℕ → ZFSet.{u}), zfHolds φ.code v ↔ ZFFormula.Holds v φv:ℕ → ZFSet.{u}⊢ zfHolds φ.not.code v ↔ ZFFormula.Holds v φ.not simp [ZFFormula.code, ZFFormula.Holds, ihφ] All goals completed! 🐙
| all x φ ihφ => all x:ℕφ:ZFFormulaihφ:∀ (v : ℕ → ZFSet.{u}), zfHolds φ.code v ↔ ZFFormula.Holds v φv:ℕ → ZFSet.{u}⊢ zfHolds (ZFFormula.all x φ).code v ↔ ZFFormula.Holds v (ZFFormula.all x φ) simp [ZFFormula.code, ZFFormula.Holds, ihφ] All goals completed! 🐙
The contradiction formula $v_0 \in v_0$ is refutable in Mathlib's ZFSet.{u} under the
empty-set valuation fun _ => ∅.
theorem not_holds_mem_zero_zero : ¬ (ZFFormula.mem 0 0).Holds (fun _ => (∅ : ZFSet.{u})) :=
ZFSet.notMem_empty ∅
Section 3b: Soundness of ZFProvable in ZFSet
attribute [local instance] Classical.allZFSetDefinableprivate theorem update_rep_lhs (v : ℕ → ZFSet.{u}) (x y z s : ZFSet.{u}) :
Function.update (Function.update (Function.update (Function.update v 3 x) 1 y) 2 z) 1 s =
Function.update (Function.update (Function.update v 3 x) 2 z) 1 s := by v:ℕ → ZFSet.{u}x:ZFSet.{u}y:ZFSet.{u}z:ZFSet.{u}s:ZFSet.{u}⊢ Function.update (Function.update (Function.update (Function.update v 3 x) 1 y) 2 z) 1 s =
Function.update (Function.update (Function.update v 3 x) 2 z) 1 s
rw [Function.update_comm (by v:ℕ → ZFSet.{u}x:ZFSet.{u}y:ZFSet.{u}z:ZFSet.{u}s:ZFSet.{u}⊢ 1 ≠ 2 decide All goals completed! 🐙 : (1 : ℕ) ≠ 2), Function.update_idem v:ℕ → ZFSet.{u}x:ZFSet.{u}y:ZFSet.{u}z:ZFSet.{u}s:ZFSet.{u}⊢ Function.update (Function.update (Function.update v 3 x) 2 z) 1 s =
Function.update (Function.update (Function.update v 3 x) 2 z) 1 s] All goals completed! 🐙private theorem update_rep_rhs (v : ℕ → ZFSet.{u}) (B z x s : ZFSet.{u}) :
Function.update (Function.update (Function.update (Function.update v 1 B) 2 z) 3 x) 1 s =
Function.update (Function.update (Function.update v 3 x) 2 z) 1 s := by v:ℕ → ZFSet.{u}B:ZFSet.{u}z:ZFSet.{u}x:ZFSet.{u}s:ZFSet.{u}⊢ Function.update (Function.update (Function.update (Function.update v 1 B) 2 z) 3 x) 1 s =
Function.update (Function.update (Function.update v 3 x) 2 z) 1 s
rw [Function.update_comm (by v:ℕ → ZFSet.{u}B:ZFSet.{u}z:ZFSet.{u}x:ZFSet.{u}s:ZFSet.{u}⊢ 1 ≠ 2 decide All goals completed! 🐙 : (1 : ℕ) ≠ 2),
Function.update_comm (by v:ℕ → ZFSet.{u}B:ZFSet.{u}z:ZFSet.{u}x:ZFSet.{u}s:ZFSet.{u}⊢ 1 ≠ 3 decide All goals completed! 🐙 : (1 : ℕ) ≠ 3),
Function.update_idem, v:ℕ → ZFSet.{u}B:ZFSet.{u}z:ZFSet.{u}x:ZFSet.{u}s:ZFSet.{u}⊢ Function.update (Function.update (Function.update v 2 z) 3 x) 1 s =
Function.update (Function.update (Function.update v 3 x) 2 z) 1 s
Function.update_comm (by v:ℕ → ZFSet.{u}B:ZFSet.{u}z:ZFSet.{u}x:ZFSet.{u}s:ZFSet.{u}⊢ 2 ≠ 3 decide All goals completed! 🐙 : (2 : ℕ) ≠ 3)] All goals completed! 🐙private theorem zfHolds_axRep (φ : ℕ) (v : ℕ → ZFSet.{u}) :
zfHolds (axRep φ) v := by φ:ℕv:ℕ → ZFSet.{u}⊢ zfHolds (axRep φ) v
simp only [axRep, axRepRhs, zfHolds_zfImp, zfHolds_zfAll, zfHolds_zfEx,
zfHolds_zfAnd, zfHolds_zfMem, zfHolds_zfEq, update_rep_lhs, update_rep_rhs] φ:ℕv:ℕ → ZFSet.{u}⊢ (∀ (s : ZFSet.{u}),
∃ s_1,
∀ (s_2 : ZFSet.{u}),
(∀ (s_3 : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 s) 2 s_2) 1 s_3)) →
Function.update (Function.update (Function.update v 3 s) 1 s_1) 2 s_2 2 =
Function.update (Function.update (Function.update v 3 s) 1 s_1) 2 s_2 1) →
∃ s,
∀ (s_1 : ZFSet.{u}),
(Function.update (Function.update v 1 s) 2 s_1 2 ∈ Function.update (Function.update v 1 s) 2 s_1 1 →
∃ s_2,
Function.update (Function.update (Function.update v 1 s) 2 s_1) 3 s_2 3 ∈
Function.update (Function.update (Function.update v 1 s) 2 s_1) 3 s_2 0 ∧
∀ (s : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 s_2) 2 s_1) 1 s)) ∧
((∃ s_2,
Function.update (Function.update (Function.update v 1 s) 2 s_1) 3 s_2 3 ∈
Function.update (Function.update (Function.update v 1 s) 2 s_1) 3 s_2 0 ∧
∀ (s : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 s_2) 2 s_1) 1 s)) →
Function.update (Function.update v 1 s) 2 s_1 2 ∈ Function.update (Function.update v 1 s) 2 s_1 1)
intro h φ:ℕv:ℕ → ZFSet.{u}h:∀ (s : ZFSet.{u}),
∃ s_1,
∀ (s_2 : ZFSet.{u}),
(∀ (s_3 : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 s) 2 s_2) 1 s_3)) →
Function.update (Function.update (Function.update v 3 s) 1 s_1) 2 s_2 2 =
Function.update (Function.update (Function.update v 3 s) 1 s_1) 2 s_2 1⊢ ∃ s,
∀ (s_1 : ZFSet.{u}),
(Function.update (Function.update v 1 s) 2 s_1 2 ∈ Function.update (Function.update v 1 s) 2 s_1 1 →
∃ s_2,
Function.update (Function.update (Function.update v 1 s) 2 s_1) 3 s_2 3 ∈
Function.update (Function.update (Function.update v 1 s) 2 s_1) 3 s_2 0 ∧
∀ (s : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 s_2) 2 s_1) 1 s)) ∧
((∃ s_2,
Function.update (Function.update (Function.update v 1 s) 2 s_1) 3 s_2 3 ∈
Function.update (Function.update (Function.update v 1 s) 2 s_1) 3 s_2 0 ∧
∀ (s : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 s_2) 2 s_1) 1 s)) →
Function.update (Function.update v 1 s) 2 s_1 2 ∈ Function.update (Function.update v 1 s) 2 s_1 1)
have h' : ∀ x : ZFSet.{u}, ∃ y : ZFSet.{u}, ∀ z : ZFSet.{u},
(∀ s : ZFSet.{u},
zfHolds φ (Function.update (Function.update (Function.update v 3 x) 2 z) 1 s)) →
z = y := by φ:ℕv:ℕ → ZFSet.{u}⊢ zfHolds (axRep φ) v
intro x φ:ℕv:ℕ → ZFSet.{u}h:∀ (s : ZFSet.{u}),
∃ s_1,
∀ (s_2 : ZFSet.{u}),
(∀ (s_3 : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 s) 2 s_2) 1 s_3)) →
Function.update (Function.update (Function.update v 3 s) 1 s_1) 2 s_2 2 =
Function.update (Function.update (Function.update v 3 s) 1 s_1) 2 s_2 1x:ZFSet.{u}⊢ ∃ y,
∀ (z : ZFSet.{u}),
(∀ (s : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 x) 2 z) 1 s)) → z = y
obtain ⟨y, hy⟩ := h x φ:ℕv:ℕ → ZFSet.{u}h:∀ (s : ZFSet.{u}),
∃ s_1,
∀ (s_2 : ZFSet.{u}),
(∀ (s_3 : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 s) 2 s_2) 1 s_3)) →
Function.update (Function.update (Function.update v 3 s) 1 s_1) 2 s_2 2 =
Function.update (Function.update (Function.update v 3 s) 1 s_1) 2 s_2 1x:ZFSet.{u}y:ZFSet.{u}hy:∀ (s : ZFSet.{u}),
(∀ (s_1 : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 x) 2 s) 1 s_1)) →
Function.update (Function.update (Function.update v 3 x) 1 y) 2 s 2 =
Function.update (Function.update (Function.update v 3 x) 1 y) 2 s 1⊢ ∃ y,
∀ (z : ZFSet.{u}),
(∀ (s : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 x) 2 z) 1 s)) → z = y
refine ⟨y, fun z hz => ?_⟩ φ:ℕv:ℕ → ZFSet.{u}h:∀ (s : ZFSet.{u}),
∃ s_1,
∀ (s_2 : ZFSet.{u}),
(∀ (s_3 : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 s) 2 s_2) 1 s_3)) →
Function.update (Function.update (Function.update v 3 s) 1 s_1) 2 s_2 2 =
Function.update (Function.update (Function.update v 3 s) 1 s_1) 2 s_2 1x:ZFSet.{u}y:ZFSet.{u}hy:∀ (s : ZFSet.{u}),
(∀ (s_1 : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 x) 2 s) 1 s_1)) →
Function.update (Function.update (Function.update v 3 x) 1 y) 2 s 2 =
Function.update (Function.update (Function.update v 3 x) 1 y) 2 s 1z:ZFSet.{u}hz:∀ (s : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 x) 2 z) 1 s)⊢ z = y
have := hy z hz φ:ℕv:ℕ → ZFSet.{u}h:∀ (s : ZFSet.{u}),
∃ s_1,
∀ (s_2 : ZFSet.{u}),
(∀ (s_3 : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 s) 2 s_2) 1 s_3)) →
Function.update (Function.update (Function.update v 3 s) 1 s_1) 2 s_2 2 =
Function.update (Function.update (Function.update v 3 s) 1 s_1) 2 s_2 1x:ZFSet.{u}y:ZFSet.{u}hy:∀ (s : ZFSet.{u}),
(∀ (s_1 : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 x) 2 s) 1 s_1)) →
Function.update (Function.update (Function.update v 3 x) 1 y) 2 s 2 =
Function.update (Function.update (Function.update v 3 x) 1 y) 2 s 1z:ZFSet.{u}hz:∀ (s : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 x) 2 z) 1 s)this:Function.update (Function.update (Function.update v 3 x) 1 y) 2 z 2 =
Function.update (Function.update (Function.update v 3 x) 1 y) 2 z 1⊢ z = y
simpa using this φ:ℕv:ℕ → ZFSet.{u}h:∀ (s : ZFSet.{u}),
∃ s_1,
∀ (s_2 : ZFSet.{u}),
(∀ (s_3 : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 s) 2 s_2) 1 s_3)) →
Function.update (Function.update (Function.update v 3 s) 1 s_1) 2 s_2 2 =
Function.update (Function.update (Function.update v 3 s) 1 s_1) 2 s_2 1h':∀ (x : ZFSet.{u}),
∃ y,
∀ (z : ZFSet.{u}),
(∀ (s : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 x) 2 z) 1 s)) → z = y⊢ ∃ s,
∀ (s_1 : ZFSet.{u}),
(Function.update (Function.update v 1 s) 2 s_1 2 ∈ Function.update (Function.update v 1 s) 2 s_1 1 →
∃ s_2,
Function.update (Function.update (Function.update v 1 s) 2 s_1) 3 s_2 3 ∈
Function.update (Function.update (Function.update v 1 s) 2 s_1) 3 s_2 0 ∧
∀ (s : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 s_2) 2 s_1) 1 s)) ∧
((∃ s_2,
Function.update (Function.update (Function.update v 1 s) 2 s_1) 3 s_2 3 ∈
Function.update (Function.update (Function.update v 1 s) 2 s_1) 3 s_2 0 ∧
∀ (s : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 s_2) 2 s_1) 1 s)) →
Function.update (Function.update v 1 s) 2 s_1 2 ∈ Function.update (Function.update v 1 s) 2 s_1 1)
let P (x z : ZFSet.{u}) : Prop :=
∀ s : ZFSet.{u}, zfHolds φ (Function.update (Function.update (Function.update v 3 x) 2 z) 1 s) φ:ℕv:ℕ → ZFSet.{u}h:∀ (s : ZFSet.{u}),
∃ s_1,
∀ (s_2 : ZFSet.{u}),
(∀ (s_3 : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 s) 2 s_2) 1 s_3)) →
Function.update (Function.update (Function.update v 3 s) 1 s_1) 2 s_2 2 =
Function.update (Function.update (Function.update v 3 s) 1 s_1) 2 s_2 1h':∀ (x : ZFSet.{u}),
∃ y,
∀ (z : ZFSet.{u}),
(∀ (s : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 x) 2 z) 1 s)) → z = yP:ZFSet.{u} → ZFSet.{u} → Prop := fun x z ↦ ∀ (s : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 x) 2 z) 1 s)⊢ ∃ s,
∀ (s_1 : ZFSet.{u}),
(Function.update (Function.update v 1 s) 2 s_1 2 ∈ Function.update (Function.update v 1 s) 2 s_1 1 →
∃ s_2,
Function.update (Function.update (Function.update v 1 s) 2 s_1) 3 s_2 3 ∈
Function.update (Function.update (Function.update v 1 s) 2 s_1) 3 s_2 0 ∧
∀ (s : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 s_2) 2 s_1) 1 s)) ∧
((∃ s_2,
Function.update (Function.update (Function.update v 1 s) 2 s_1) 3 s_2 3 ∈
Function.update (Function.update (Function.update v 1 s) 2 s_1) 3 s_2 0 ∧
∀ (s : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 s_2) 2 s_1) 1 s)) →
Function.update (Function.update v 1 s) 2 s_1 2 ∈ Function.update (Function.update v 1 s) 2 s_1 1)
let f (x : ZFSet.{u}) : ZFSet.{u} := Classical.choose (h' x) φ:ℕv:ℕ → ZFSet.{u}h:∀ (s : ZFSet.{u}),
∃ s_1,
∀ (s_2 : ZFSet.{u}),
(∀ (s_3 : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 s) 2 s_2) 1 s_3)) →
Function.update (Function.update (Function.update v 3 s) 1 s_1) 2 s_2 2 =
Function.update (Function.update (Function.update v 3 s) 1 s_1) 2 s_2 1h':∀ (x : ZFSet.{u}),
∃ y,
∀ (z : ZFSet.{u}),
(∀ (s : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 x) 2 z) 1 s)) → z = yP:ZFSet.{u} → ZFSet.{u} → Prop := fun x z ↦ ∀ (s : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 x) 2 z) 1 s)f:ZFSet.{u} → ZFSet.{u} := fun x ↦ Classical.choose ⋯⊢ ∃ s,
∀ (s_1 : ZFSet.{u}),
(Function.update (Function.update v 1 s) 2 s_1 2 ∈ Function.update (Function.update v 1 s) 2 s_1 1 →
∃ s_2,
Function.update (Function.update (Function.update v 1 s) 2 s_1) 3 s_2 3 ∈
Function.update (Function.update (Function.update v 1 s) 2 s_1) 3 s_2 0 ∧
∀ (s : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 s_2) 2 s_1) 1 s)) ∧
((∃ s_2,
Function.update (Function.update (Function.update v 1 s) 2 s_1) 3 s_2 3 ∈
Function.update (Function.update (Function.update v 1 s) 2 s_1) 3 s_2 0 ∧
∀ (s : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 s_2) 2 s_1) 1 s)) →
Function.update (Function.update v 1 s) 2 s_1 2 ∈ Function.update (Function.update v 1 s) 2 s_1 1)
have hf (x z : ZFSet.{u}) (hP : P x z) : z = f x := Classical.choose_spec (h' x) z hP φ:ℕv:ℕ → ZFSet.{u}h:∀ (s : ZFSet.{u}),
∃ s_1,
∀ (s_2 : ZFSet.{u}),
(∀ (s_3 : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 s) 2 s_2) 1 s_3)) →
Function.update (Function.update (Function.update v 3 s) 1 s_1) 2 s_2 2 =
Function.update (Function.update (Function.update v 3 s) 1 s_1) 2 s_2 1h':∀ (x : ZFSet.{u}),
∃ y,
∀ (z : ZFSet.{u}),
(∀ (s : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 x) 2 z) 1 s)) → z = yP:ZFSet.{u} → ZFSet.{u} → Prop := fun x z ↦ ∀ (s : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 x) 2 z) 1 s)f:ZFSet.{u} → ZFSet.{u} := fun x ↦ Classical.choose ⋯hf:∀ (x z : ZFSet.{u}), P x z → z = f x⊢ ∃ s,
∀ (s_1 : ZFSet.{u}),
(Function.update (Function.update v 1 s) 2 s_1 2 ∈ Function.update (Function.update v 1 s) 2 s_1 1 →
∃ s_2,
Function.update (Function.update (Function.update v 1 s) 2 s_1) 3 s_2 3 ∈
Function.update (Function.update (Function.update v 1 s) 2 s_1) 3 s_2 0 ∧
∀ (s : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 s_2) 2 s_1) 1 s)) ∧
((∃ s_2,
Function.update (Function.update (Function.update v 1 s) 2 s_1) 3 s_2 3 ∈
Function.update (Function.update (Function.update v 1 s) 2 s_1) 3 s_2 0 ∧
∀ (s : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 s_2) 2 s_1) 1 s)) →
Function.update (Function.update v 1 s) 2 s_1 2 ∈ Function.update (Function.update v 1 s) 2 s_1 1)
let B : ZFSet.{u} := (ZFSet.image f (v 0)).sep (fun z => ∃ x ∈ v 0, P x z) φ:ℕv:ℕ → ZFSet.{u}h:∀ (s : ZFSet.{u}),
∃ s_1,
∀ (s_2 : ZFSet.{u}),
(∀ (s_3 : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 s) 2 s_2) 1 s_3)) →
Function.update (Function.update (Function.update v 3 s) 1 s_1) 2 s_2 2 =
Function.update (Function.update (Function.update v 3 s) 1 s_1) 2 s_2 1h':∀ (x : ZFSet.{u}),
∃ y,
∀ (z : ZFSet.{u}),
(∀ (s : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 x) 2 z) 1 s)) → z = yP:ZFSet.{u} → ZFSet.{u} → Prop := fun x z ↦ ∀ (s : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 x) 2 z) 1 s)f:ZFSet.{u} → ZFSet.{u} := fun x ↦ Classical.choose ⋯hf:∀ (x z : ZFSet.{u}), P x z → z = f xB:ZFSet.{u} := ZFSet.sep (fun z ↦ ∃ x ∈ v 0, P x z) (ZFSet.image f (v 0))⊢ ∃ s,
∀ (s_1 : ZFSet.{u}),
(Function.update (Function.update v 1 s) 2 s_1 2 ∈ Function.update (Function.update v 1 s) 2 s_1 1 →
∃ s_2,
Function.update (Function.update (Function.update v 1 s) 2 s_1) 3 s_2 3 ∈
Function.update (Function.update (Function.update v 1 s) 2 s_1) 3 s_2 0 ∧
∀ (s : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 s_2) 2 s_1) 1 s)) ∧
((∃ s_2,
Function.update (Function.update (Function.update v 1 s) 2 s_1) 3 s_2 3 ∈
Function.update (Function.update (Function.update v 1 s) 2 s_1) 3 s_2 0 ∧
∀ (s : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 s_2) 2 s_1) 1 s)) →
Function.update (Function.update v 1 s) 2 s_1 2 ∈ Function.update (Function.update v 1 s) 2 s_1 1)
refine ⟨B, fun z => ?_⟩ φ:ℕv:ℕ → ZFSet.{u}h:∀ (s : ZFSet.{u}),
∃ s_1,
∀ (s_2 : ZFSet.{u}),
(∀ (s_3 : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 s) 2 s_2) 1 s_3)) →
Function.update (Function.update (Function.update v 3 s) 1 s_1) 2 s_2 2 =
Function.update (Function.update (Function.update v 3 s) 1 s_1) 2 s_2 1h':∀ (x : ZFSet.{u}),
∃ y,
∀ (z : ZFSet.{u}),
(∀ (s : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 x) 2 z) 1 s)) → z = yP:ZFSet.{u} → ZFSet.{u} → Prop := fun x z ↦ ∀ (s : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 x) 2 z) 1 s)f:ZFSet.{u} → ZFSet.{u} := fun x ↦ Classical.choose ⋯hf:∀ (x z : ZFSet.{u}), P x z → z = f xB:ZFSet.{u} := ZFSet.sep (fun z ↦ ∃ x ∈ v 0, P x z) (ZFSet.image f (v 0))z:ZFSet.{u}⊢ (Function.update (Function.update v 1 B) 2 z 2 ∈ Function.update (Function.update v 1 B) 2 z 1 →
∃ s,
Function.update (Function.update (Function.update v 1 B) 2 z) 3 s 3 ∈
Function.update (Function.update (Function.update v 1 B) 2 z) 3 s 0 ∧
∀ (s_1 : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 s) 2 z) 1 s_1)) ∧
((∃ s,
Function.update (Function.update (Function.update v 1 B) 2 z) 3 s 3 ∈
Function.update (Function.update (Function.update v 1 B) 2 z) 3 s 0 ∧
∀ (s_1 : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 s) 2 z) 1 s_1)) →
Function.update (Function.update v 1 B) 2 z 2 ∈ Function.update (Function.update v 1 B) 2 z 1)
have hB : z ∈ B ↔ ∃ x, x ∈ v 0 ∧ P x z := by φ:ℕv:ℕ → ZFSet.{u}⊢ zfHolds (axRep φ) v
simp only [B, ZFSet.mem_sep, ZFSet.mem_image] φ:ℕv:ℕ → ZFSet.{u}h:∀ (s : ZFSet.{u}),
∃ s_1,
∀ (s_2 : ZFSet.{u}),
(∀ (s_3 : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 s) 2 s_2) 1 s_3)) →
Function.update (Function.update (Function.update v 3 s) 1 s_1) 2 s_2 2 =
Function.update (Function.update (Function.update v 3 s) 1 s_1) 2 s_2 1h':∀ (x : ZFSet.{u}),
∃ y,
∀ (z : ZFSet.{u}),
(∀ (s : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 x) 2 z) 1 s)) → z = yP:ZFSet.{u} → ZFSet.{u} → Prop := fun x z ↦ ∀ (s : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 x) 2 z) 1 s)f:ZFSet.{u} → ZFSet.{u} := fun x ↦ Classical.choose ⋯hf:∀ (x z : ZFSet.{u}), P x z → z = f xB:ZFSet.{u} := ZFSet.sep (fun z ↦ ∃ x ∈ v 0, P x z) (ZFSet.image f (v 0))z:ZFSet.{u}⊢ ((∃ z_1 ∈ v 0, f z_1 = z) ∧ ∃ x ∈ v 0, P x z) ↔ ∃ x ∈ v 0, P x z
refine ⟨fun ⟨_, hx⟩ => hx, fun ⟨x, hx0, hPxz⟩ => ⟨⟨x, hx0, (hf x z hPxz).symm⟩, x, hx0, hPxz⟩⟩ φ:ℕv:ℕ → ZFSet.{u}h:∀ (s : ZFSet.{u}),
∃ s_1,
∀ (s_2 : ZFSet.{u}),
(∀ (s_3 : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 s) 2 s_2) 1 s_3)) →
Function.update (Function.update (Function.update v 3 s) 1 s_1) 2 s_2 2 =
Function.update (Function.update (Function.update v 3 s) 1 s_1) 2 s_2 1h':∀ (x : ZFSet.{u}),
∃ y,
∀ (z : ZFSet.{u}),
(∀ (s : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 x) 2 z) 1 s)) → z = yP:ZFSet.{u} → ZFSet.{u} → Prop := fun x z ↦ ∀ (s : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 x) 2 z) 1 s)f:ZFSet.{u} → ZFSet.{u} := fun x ↦ Classical.choose ⋯hf:∀ (x z : ZFSet.{u}), P x z → z = f xB:ZFSet.{u} := ZFSet.sep (fun z ↦ ∃ x ∈ v 0, P x z) (ZFSet.image f (v 0))z:ZFSet.{u}hB:z ∈ B ↔ ∃ x ∈ v 0, P x z⊢ (Function.update (Function.update v 1 B) 2 z 2 ∈ Function.update (Function.update v 1 B) 2 z 1 →
∃ s,
Function.update (Function.update (Function.update v 1 B) 2 z) 3 s 3 ∈
Function.update (Function.update (Function.update v 1 B) 2 z) 3 s 0 ∧
∀ (s_1 : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 s) 2 z) 1 s_1)) ∧
((∃ s,
Function.update (Function.update (Function.update v 1 B) 2 z) 3 s 3 ∈
Function.update (Function.update (Function.update v 1 B) 2 z) 3 s 0 ∧
∀ (s_1 : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 s) 2 z) 1 s_1)) →
Function.update (Function.update v 1 B) 2 z 2 ∈ Function.update (Function.update v 1 B) 2 z 1)
have hv1 : Function.update (Function.update v 1 B) 2 z 2 = z := by φ:ℕv:ℕ → ZFSet.{u}⊢ zfHolds (axRep φ) v simp φ:ℕv:ℕ → ZFSet.{u}h:∀ (s : ZFSet.{u}),
∃ s_1,
∀ (s_2 : ZFSet.{u}),
(∀ (s_3 : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 s) 2 s_2) 1 s_3)) →
Function.update (Function.update (Function.update v 3 s) 1 s_1) 2 s_2 2 =
Function.update (Function.update (Function.update v 3 s) 1 s_1) 2 s_2 1h':∀ (x : ZFSet.{u}),
∃ y,
∀ (z : ZFSet.{u}),
(∀ (s : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 x) 2 z) 1 s)) → z = yP:ZFSet.{u} → ZFSet.{u} → Prop := fun x z ↦ ∀ (s : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 x) 2 z) 1 s)f:ZFSet.{u} → ZFSet.{u} := fun x ↦ Classical.choose ⋯hf:∀ (x z : ZFSet.{u}), P x z → z = f xB:ZFSet.{u} := ZFSet.sep (fun z ↦ ∃ x ∈ v 0, P x z) (ZFSet.image f (v 0))z:ZFSet.{u}hB:z ∈ B ↔ ∃ x ∈ v 0, P x zhv1:Function.update (Function.update v 1 B) 2 z 2 = z⊢ (Function.update (Function.update v 1 B) 2 z 2 ∈ Function.update (Function.update v 1 B) 2 z 1 →
∃ s,
Function.update (Function.update (Function.update v 1 B) 2 z) 3 s 3 ∈
Function.update (Function.update (Function.update v 1 B) 2 z) 3 s 0 ∧
∀ (s_1 : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 s) 2 z) 1 s_1)) ∧
((∃ s,
Function.update (Function.update (Function.update v 1 B) 2 z) 3 s 3 ∈
Function.update (Function.update (Function.update v 1 B) 2 z) 3 s 0 ∧
∀ (s_1 : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 s) 2 z) 1 s_1)) →
Function.update (Function.update v 1 B) 2 z 2 ∈ Function.update (Function.update v 1 B) 2 z 1)
have hv2 : Function.update (Function.update v 1 B) 2 z 1 = B := by φ:ℕv:ℕ → ZFSet.{u}⊢ zfHolds (axRep φ) v simp φ:ℕv:ℕ → ZFSet.{u}h:∀ (s : ZFSet.{u}),
∃ s_1,
∀ (s_2 : ZFSet.{u}),
(∀ (s_3 : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 s) 2 s_2) 1 s_3)) →
Function.update (Function.update (Function.update v 3 s) 1 s_1) 2 s_2 2 =
Function.update (Function.update (Function.update v 3 s) 1 s_1) 2 s_2 1h':∀ (x : ZFSet.{u}),
∃ y,
∀ (z : ZFSet.{u}),
(∀ (s : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 x) 2 z) 1 s)) → z = yP:ZFSet.{u} → ZFSet.{u} → Prop := fun x z ↦ ∀ (s : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 x) 2 z) 1 s)f:ZFSet.{u} → ZFSet.{u} := fun x ↦ Classical.choose ⋯hf:∀ (x z : ZFSet.{u}), P x z → z = f xB:ZFSet.{u} := ZFSet.sep (fun z ↦ ∃ x ∈ v 0, P x z) (ZFSet.image f (v 0))z:ZFSet.{u}hB:z ∈ B ↔ ∃ x ∈ v 0, P x zhv1:Function.update (Function.update v 1 B) 2 z 2 = zhv2:Function.update (Function.update v 1 B) 2 z 1 = B⊢ (Function.update (Function.update v 1 B) 2 z 2 ∈ Function.update (Function.update v 1 B) 2 z 1 →
∃ s,
Function.update (Function.update (Function.update v 1 B) 2 z) 3 s 3 ∈
Function.update (Function.update (Function.update v 1 B) 2 z) 3 s 0 ∧
∀ (s_1 : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 s) 2 z) 1 s_1)) ∧
((∃ s,
Function.update (Function.update (Function.update v 1 B) 2 z) 3 s 3 ∈
Function.update (Function.update (Function.update v 1 B) 2 z) 3 s 0 ∧
∀ (s_1 : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 s) 2 z) 1 s_1)) →
Function.update (Function.update v 1 B) 2 z 2 ∈ Function.update (Function.update v 1 B) 2 z 1)
have hv3 : ∀ x : ZFSet.{u},
Function.update (Function.update (Function.update v 1 B) 2 z) 3 x 3 = x := by φ:ℕv:ℕ → ZFSet.{u}⊢ zfHolds (axRep φ) v simp φ:ℕv:ℕ → ZFSet.{u}h:∀ (s : ZFSet.{u}),
∃ s_1,
∀ (s_2 : ZFSet.{u}),
(∀ (s_3 : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 s) 2 s_2) 1 s_3)) →
Function.update (Function.update (Function.update v 3 s) 1 s_1) 2 s_2 2 =
Function.update (Function.update (Function.update v 3 s) 1 s_1) 2 s_2 1h':∀ (x : ZFSet.{u}),
∃ y,
∀ (z : ZFSet.{u}),
(∀ (s : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 x) 2 z) 1 s)) → z = yP:ZFSet.{u} → ZFSet.{u} → Prop := fun x z ↦ ∀ (s : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 x) 2 z) 1 s)f:ZFSet.{u} → ZFSet.{u} := fun x ↦ Classical.choose ⋯hf:∀ (x z : ZFSet.{u}), P x z → z = f xB:ZFSet.{u} := ZFSet.sep (fun z ↦ ∃ x ∈ v 0, P x z) (ZFSet.image f (v 0))z:ZFSet.{u}hB:z ∈ B ↔ ∃ x ∈ v 0, P x zhv1:Function.update (Function.update v 1 B) 2 z 2 = zhv2:Function.update (Function.update v 1 B) 2 z 1 = Bhv3:∀ (x : ZFSet.{u}), Function.update (Function.update (Function.update v 1 B) 2 z) 3 x 3 = x⊢ (Function.update (Function.update v 1 B) 2 z 2 ∈ Function.update (Function.update v 1 B) 2 z 1 →
∃ s,
Function.update (Function.update (Function.update v 1 B) 2 z) 3 s 3 ∈
Function.update (Function.update (Function.update v 1 B) 2 z) 3 s 0 ∧
∀ (s_1 : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 s) 2 z) 1 s_1)) ∧
((∃ s,
Function.update (Function.update (Function.update v 1 B) 2 z) 3 s 3 ∈
Function.update (Function.update (Function.update v 1 B) 2 z) 3 s 0 ∧
∀ (s_1 : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 s) 2 z) 1 s_1)) →
Function.update (Function.update v 1 B) 2 z 2 ∈ Function.update (Function.update v 1 B) 2 z 1)
have hv0 : ∀ x : ZFSet.{u},
Function.update (Function.update (Function.update v 1 B) 2 z) 3 x 0 = v 0 := by φ:ℕv:ℕ → ZFSet.{u}⊢ zfHolds (axRep φ) v simp φ:ℕv:ℕ → ZFSet.{u}h:∀ (s : ZFSet.{u}),
∃ s_1,
∀ (s_2 : ZFSet.{u}),
(∀ (s_3 : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 s) 2 s_2) 1 s_3)) →
Function.update (Function.update (Function.update v 3 s) 1 s_1) 2 s_2 2 =
Function.update (Function.update (Function.update v 3 s) 1 s_1) 2 s_2 1h':∀ (x : ZFSet.{u}),
∃ y,
∀ (z : ZFSet.{u}),
(∀ (s : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 x) 2 z) 1 s)) → z = yP:ZFSet.{u} → ZFSet.{u} → Prop := fun x z ↦ ∀ (s : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 x) 2 z) 1 s)f:ZFSet.{u} → ZFSet.{u} := fun x ↦ Classical.choose ⋯hf:∀ (x z : ZFSet.{u}), P x z → z = f xB:ZFSet.{u} := ZFSet.sep (fun z ↦ ∃ x ∈ v 0, P x z) (ZFSet.image f (v 0))z:ZFSet.{u}hB:z ∈ B ↔ ∃ x ∈ v 0, P x zhv1:Function.update (Function.update v 1 B) 2 z 2 = zhv2:Function.update (Function.update v 1 B) 2 z 1 = Bhv3:∀ (x : ZFSet.{u}), Function.update (Function.update (Function.update v 1 B) 2 z) 3 x 3 = xhv0:∀ (x : ZFSet.{u}), Function.update (Function.update (Function.update v 1 B) 2 z) 3 x 0 = v 0⊢ (Function.update (Function.update v 1 B) 2 z 2 ∈ Function.update (Function.update v 1 B) 2 z 1 →
∃ s,
Function.update (Function.update (Function.update v 1 B) 2 z) 3 s 3 ∈
Function.update (Function.update (Function.update v 1 B) 2 z) 3 s 0 ∧
∀ (s_1 : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 s) 2 z) 1 s_1)) ∧
((∃ s,
Function.update (Function.update (Function.update v 1 B) 2 z) 3 s 3 ∈
Function.update (Function.update (Function.update v 1 B) 2 z) 3 s 0 ∧
∀ (s_1 : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 s) 2 z) 1 s_1)) →
Function.update (Function.update v 1 B) 2 z 2 ∈ Function.update (Function.update v 1 B) 2 z 1)
simp only [hv1, hv2, hv3, hv0] φ:ℕv:ℕ → ZFSet.{u}h:∀ (s : ZFSet.{u}),
∃ s_1,
∀ (s_2 : ZFSet.{u}),
(∀ (s_3 : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 s) 2 s_2) 1 s_3)) →
Function.update (Function.update (Function.update v 3 s) 1 s_1) 2 s_2 2 =
Function.update (Function.update (Function.update v 3 s) 1 s_1) 2 s_2 1h':∀ (x : ZFSet.{u}),
∃ y,
∀ (z : ZFSet.{u}),
(∀ (s : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 x) 2 z) 1 s)) → z = yP:ZFSet.{u} → ZFSet.{u} → Prop := fun x z ↦ ∀ (s : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 x) 2 z) 1 s)f:ZFSet.{u} → ZFSet.{u} := fun x ↦ Classical.choose ⋯hf:∀ (x z : ZFSet.{u}), P x z → z = f xB:ZFSet.{u} := ZFSet.sep (fun z ↦ ∃ x ∈ v 0, P x z) (ZFSet.image f (v 0))z:ZFSet.{u}hB:z ∈ B ↔ ∃ x ∈ v 0, P x zhv1:Function.update (Function.update v 1 B) 2 z 2 = zhv2:Function.update (Function.update v 1 B) 2 z 1 = Bhv3:∀ (x : ZFSet.{u}), Function.update (Function.update (Function.update v 1 B) 2 z) 3 x 3 = xhv0:∀ (x : ZFSet.{u}), Function.update (Function.update (Function.update v 1 B) 2 z) 3 x 0 = v 0⊢ (z ∈ B →
∃ s ∈ v 0, ∀ (s_1 : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 s) 2 z) 1 s_1)) ∧
((∃ s ∈ v 0, ∀ (s_1 : ZFSet.{u}), zfHolds φ (Function.update (Function.update (Function.update v 3 s) 2 z) 1 s_1)) →
z ∈ B)
exact ⟨hB.mp, hB.mpr⟩ All goals completed! 🐙
Iterated singleton operation $n \mapsto {\dots{a}\dots}$ used to witness axInf.
def iterSingleton (a : ZFSet.{u}) : ℕ → ZFSet.{u}
| 0 => a
| n + 1 => {iterSingleton a n}private theorem zfHolds_axInf (v : ℕ → ZFSet.{0}) :
zfHolds axInf v := by v:ℕ → ZFSet.{0}⊢ zfHolds axInf v
simp only [axInf, axInfSingleton, zfHolds_zfEx, zfHolds_zfAnd, zfHolds_zfMem,
zfHolds_zfAll, zfHolds_zfImp, zfHolds_zfEq] v:ℕ → ZFSet.{0}⊢ ∃ s,
Function.update v 1 s 0 ∈ Function.update v 1 s 1 ∧
∀ (s_1 : ZFSet.{0}),
Function.update (Function.update v 1 s) 0 s_1 0 ∈ Function.update (Function.update v 1 s) 0 s_1 1 →
∃ s_2,
Function.update (Function.update (Function.update v 1 s) 0 s_1) 2 s_2 2 ∈
Function.update (Function.update (Function.update v 1 s) 0 s_1) 2 s_2 1 ∧
∀ (s_3 : ZFSet.{0}),
(Function.update (Function.update (Function.update (Function.update v 1 s) 0 s_1) 2 s_2) 1 s_3 1 ∈
Function.update (Function.update (Function.update (Function.update v 1 s) 0 s_1) 2 s_2) 1 s_3 2 →
Function.update (Function.update (Function.update (Function.update v 1 s) 0 s_1) 2 s_2) 1 s_3 1 =
Function.update (Function.update (Function.update (Function.update v 1 s) 0 s_1) 2 s_2) 1 s_3 0) ∧
(Function.update (Function.update (Function.update (Function.update v 1 s) 0 s_1) 2 s_2) 1 s_3 1 =
Function.update (Function.update (Function.update (Function.update v 1 s) 0 s_1) 2 s_2) 1 s_3 0 →
Function.update (Function.update (Function.update (Function.update v 1 s) 0 s_1) 2 s_2) 1 s_3 1 ∈
Function.update (Function.update (Function.update (Function.update v 1 s) 0 s_1) 2 s_2) 1 s_3 2)
let W : ZFSet.{0} := ZFSet.range (iterSingleton (v 0)) v:ℕ → ZFSet.{0}W:ZFSet.{0} := ZFSet.range (iterSingleton (v 0))⊢ ∃ s,
Function.update v 1 s 0 ∈ Function.update v 1 s 1 ∧
∀ (s_1 : ZFSet.{0}),
Function.update (Function.update v 1 s) 0 s_1 0 ∈ Function.update (Function.update v 1 s) 0 s_1 1 →
∃ s_2,
Function.update (Function.update (Function.update v 1 s) 0 s_1) 2 s_2 2 ∈
Function.update (Function.update (Function.update v 1 s) 0 s_1) 2 s_2 1 ∧
∀ (s_3 : ZFSet.{0}),
(Function.update (Function.update (Function.update (Function.update v 1 s) 0 s_1) 2 s_2) 1 s_3 1 ∈
Function.update (Function.update (Function.update (Function.update v 1 s) 0 s_1) 2 s_2) 1 s_3 2 →
Function.update (Function.update (Function.update (Function.update v 1 s) 0 s_1) 2 s_2) 1 s_3 1 =
Function.update (Function.update (Function.update (Function.update v 1 s) 0 s_1) 2 s_2) 1 s_3 0) ∧
(Function.update (Function.update (Function.update (Function.update v 1 s) 0 s_1) 2 s_2) 1 s_3 1 =
Function.update (Function.update (Function.update (Function.update v 1 s) 0 s_1) 2 s_2) 1 s_3 0 →
Function.update (Function.update (Function.update (Function.update v 1 s) 0 s_1) 2 s_2) 1 s_3 1 ∈
Function.update (Function.update (Function.update (Function.update v 1 s) 0 s_1) 2 s_2) 1 s_3 2)
refine ⟨W, ?_, ?_⟩ refine_1 v:ℕ → ZFSet.{0}W:ZFSet.{0} := ZFSet.range (iterSingleton (v 0))⊢ Function.update v 1 W 0 ∈ Function.update v 1 W 1refine_2 v:ℕ → ZFSet.{0}W:ZFSet.{0} := ZFSet.range (iterSingleton (v 0))⊢ ∀ (s : ZFSet.{0}),
Function.update (Function.update v 1 W) 0 s 0 ∈ Function.update (Function.update v 1 W) 0 s 1 →
∃ s_1,
Function.update (Function.update (Function.update v 1 W) 0 s) 2 s_1 2 ∈
Function.update (Function.update (Function.update v 1 W) 0 s) 2 s_1 1 ∧
∀ (s_2 : ZFSet.{0}),
(Function.update (Function.update (Function.update (Function.update v 1 W) 0 s) 2 s_1) 1 s_2 1 ∈
Function.update (Function.update (Function.update (Function.update v 1 W) 0 s) 2 s_1) 1 s_2 2 →
Function.update (Function.update (Function.update (Function.update v 1 W) 0 s) 2 s_1) 1 s_2 1 =
Function.update (Function.update (Function.update (Function.update v 1 W) 0 s) 2 s_1) 1 s_2 0) ∧
(Function.update (Function.update (Function.update (Function.update v 1 W) 0 s) 2 s_1) 1 s_2 1 =
Function.update (Function.update (Function.update (Function.update v 1 W) 0 s) 2 s_1) 1 s_2 0 →
Function.update (Function.update (Function.update (Function.update v 1 W) 0 s) 2 s_1) 1 s_2 1 ∈
Function.update (Function.update (Function.update (Function.update v 1 W) 0 s) 2 s_1) 1 s_2 2)
· refine_1 v:ℕ → ZFSet.{0}W:ZFSet.{0} := ZFSet.range (iterSingleton (v 0))⊢ Function.update v 1 W 0 ∈ Function.update v 1 W 1 have h0 : Function.update v 1 W 0 = v 0 := by v:ℕ → ZFSet.{0}⊢ zfHolds axInf v simp refine_1 v:ℕ → ZFSet.{0}W:ZFSet.{0} := ZFSet.range (iterSingleton (v 0))h0:Function.update v 1 W 0 = v 0⊢ Function.update v 1 W 0 ∈ Function.update v 1 W 1
have h1 : Function.update v 1 W 1 = W := by v:ℕ → ZFSet.{0}⊢ zfHolds axInf v simp refine_1 v:ℕ → ZFSet.{0}W:ZFSet.{0} := ZFSet.range (iterSingleton (v 0))h0:Function.update v 1 W 0 = v 0h1:Function.update v 1 W 1 = W⊢ Function.update v 1 W 0 ∈ Function.update v 1 W 1
rw [h0, refine_1 v:ℕ → ZFSet.{0}W:ZFSet.{0} := ZFSet.range (iterSingleton (v 0))h0:Function.update v 1 W 0 = v 0h1:Function.update v 1 W 1 = W⊢ v 0 ∈ Function.update v 1 W 1 h1, refine_1 v:ℕ → ZFSet.{0}W:ZFSet.{0} := ZFSet.range (iterSingleton (v 0))h0:Function.update v 1 W 0 = v 0h1:Function.update v 1 W 1 = W⊢ v 0 ∈ W ZFSet.mem_range refine_1 v:ℕ → ZFSet.{0}W:ZFSet.{0} := ZFSet.range (iterSingleton (v 0))h0:Function.update v 1 W 0 = v 0h1:Function.update v 1 W 1 = W⊢ ∃ i, iterSingleton (v 0) i = v 0] refine_1 v:ℕ → ZFSet.{0}W:ZFSet.{0} := ZFSet.range (iterSingleton (v 0))h0:Function.update v 1 W 0 = v 0h1:Function.update v 1 W 1 = W⊢ ∃ i, iterSingleton (v 0) i = v 0
exact ⟨0, rfl⟩ All goals completed! 🐙
· refine_2 v:ℕ → ZFSet.{0}W:ZFSet.{0} := ZFSet.range (iterSingleton (v 0))⊢ ∀ (s : ZFSet.{0}),
Function.update (Function.update v 1 W) 0 s 0 ∈ Function.update (Function.update v 1 W) 0 s 1 →
∃ s_1,
Function.update (Function.update (Function.update v 1 W) 0 s) 2 s_1 2 ∈
Function.update (Function.update (Function.update v 1 W) 0 s) 2 s_1 1 ∧
∀ (s_2 : ZFSet.{0}),
(Function.update (Function.update (Function.update (Function.update v 1 W) 0 s) 2 s_1) 1 s_2 1 ∈
Function.update (Function.update (Function.update (Function.update v 1 W) 0 s) 2 s_1) 1 s_2 2 →
Function.update (Function.update (Function.update (Function.update v 1 W) 0 s) 2 s_1) 1 s_2 1 =
Function.update (Function.update (Function.update (Function.update v 1 W) 0 s) 2 s_1) 1 s_2 0) ∧
(Function.update (Function.update (Function.update (Function.update v 1 W) 0 s) 2 s_1) 1 s_2 1 =
Function.update (Function.update (Function.update (Function.update v 1 W) 0 s) 2 s_1) 1 s_2 0 →
Function.update (Function.update (Function.update (Function.update v 1 W) 0 s) 2 s_1) 1 s_2 1 ∈
Function.update (Function.update (Function.update (Function.update v 1 W) 0 s) 2 s_1) 1 s_2 2) intro x hx refine_2 v:ℕ → ZFSet.{0}W:ZFSet.{0} := ZFSet.range (iterSingleton (v 0))x:ZFSet.{0}hx:Function.update (Function.update v 1 W) 0 x 0 ∈ Function.update (Function.update v 1 W) 0 x 1⊢ ∃ s,
Function.update (Function.update (Function.update v 1 W) 0 x) 2 s 2 ∈
Function.update (Function.update (Function.update v 1 W) 0 x) 2 s 1 ∧
∀ (s_1 : ZFSet.{0}),
(Function.update (Function.update (Function.update (Function.update v 1 W) 0 x) 2 s) 1 s_1 1 ∈
Function.update (Function.update (Function.update (Function.update v 1 W) 0 x) 2 s) 1 s_1 2 →
Function.update (Function.update (Function.update (Function.update v 1 W) 0 x) 2 s) 1 s_1 1 =
Function.update (Function.update (Function.update (Function.update v 1 W) 0 x) 2 s) 1 s_1 0) ∧
(Function.update (Function.update (Function.update (Function.update v 1 W) 0 x) 2 s) 1 s_1 1 =
Function.update (Function.update (Function.update (Function.update v 1 W) 0 x) 2 s) 1 s_1 0 →
Function.update (Function.update (Function.update (Function.update v 1 W) 0 x) 2 s) 1 s_1 1 ∈
Function.update (Function.update (Function.update (Function.update v 1 W) 0 x) 2 s) 1 s_1 2)
have hxW : x ∈ W := by v:ℕ → ZFSet.{0}⊢ zfHolds axInf v simpa using hx refine_2 v:ℕ → ZFSet.{0}W:ZFSet.{0} := ZFSet.range (iterSingleton (v 0))x:ZFSet.{0}hx:Function.update (Function.update v 1 W) 0 x 0 ∈ Function.update (Function.update v 1 W) 0 x 1hxW:x ∈ W⊢ ∃ s,
Function.update (Function.update (Function.update v 1 W) 0 x) 2 s 2 ∈
Function.update (Function.update (Function.update v 1 W) 0 x) 2 s 1 ∧
∀ (s_1 : ZFSet.{0}),
(Function.update (Function.update (Function.update (Function.update v 1 W) 0 x) 2 s) 1 s_1 1 ∈
Function.update (Function.update (Function.update (Function.update v 1 W) 0 x) 2 s) 1 s_1 2 →
Function.update (Function.update (Function.update (Function.update v 1 W) 0 x) 2 s) 1 s_1 1 =
Function.update (Function.update (Function.update (Function.update v 1 W) 0 x) 2 s) 1 s_1 0) ∧
(Function.update (Function.update (Function.update (Function.update v 1 W) 0 x) 2 s) 1 s_1 1 =
Function.update (Function.update (Function.update (Function.update v 1 W) 0 x) 2 s) 1 s_1 0 →
Function.update (Function.update (Function.update (Function.update v 1 W) 0 x) 2 s) 1 s_1 1 ∈
Function.update (Function.update (Function.update (Function.update v 1 W) 0 x) 2 s) 1 s_1 2)
obtain ⟨n, rfl⟩ := ZFSet.mem_range.mp hxW refine_2 v:ℕ → ZFSet.{0}W:ZFSet.{0} := ZFSet.range (iterSingleton (v 0))n:ℕhx:Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n) 0 ∈
Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n) 1hxW:iterSingleton (v 0) n ∈ W⊢ ∃ s,
Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 s 2 ∈
Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 s 1 ∧
∀ (s_1 : ZFSet.{0}),
(Function.update (Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 s) 1 s_1
1 ∈
Function.update (Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 s) 1
s_1 2 →
Function.update (Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 s) 1
s_1 1 =
Function.update (Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 s) 1
s_1 0) ∧
(Function.update (Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 s) 1 s_1
1 =
Function.update (Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 s) 1
s_1 0 →
Function.update (Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 s) 1
s_1 1 ∈
Function.update (Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 s) 1
s_1 2)
refine ⟨{iterSingleton (v 0) n}, ?_, ?_⟩ refine_2.refine_1 v:ℕ → ZFSet.{0}W:ZFSet.{0} := ZFSet.range (iterSingleton (v 0))n:ℕhx:Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n) 0 ∈
Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n) 1hxW:iterSingleton (v 0) n ∈ W⊢ Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n} 2 ∈
Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n} 1refine_2.refine_2 v:ℕ → ZFSet.{0}W:ZFSet.{0} := ZFSet.range (iterSingleton (v 0))n:ℕhx:Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n) 0 ∈
Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n) 1hxW:iterSingleton (v 0) n ∈ W⊢ ∀ (s : ZFSet.{0}),
(Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2
{iterSingleton (v 0) n})
1 s 1 ∈
Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2
{iterSingleton (v 0) n})
1 s 2 →
Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2
{iterSingleton (v 0) n})
1 s 1 =
Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2
{iterSingleton (v 0) n})
1 s 0) ∧
(Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2
{iterSingleton (v 0) n})
1 s 1 =
Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2
{iterSingleton (v 0) n})
1 s 0 →
Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2
{iterSingleton (v 0) n})
1 s 1 ∈
Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2
{iterSingleton (v 0) n})
1 s 2)
· refine_2.refine_1 v:ℕ → ZFSet.{0}W:ZFSet.{0} := ZFSet.range (iterSingleton (v 0))n:ℕhx:Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n) 0 ∈
Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n) 1hxW:iterSingleton (v 0) n ∈ W⊢ Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n} 2 ∈
Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n} 1 have h2 : Function.update
(Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2
{iterSingleton (v 0) n} 2 = {iterSingleton (v 0) n} := by v:ℕ → ZFSet.{0}⊢ zfHolds axInf v simp refine_2.refine_1 v:ℕ → ZFSet.{0}W:ZFSet.{0} := ZFSet.range (iterSingleton (v 0))n:ℕhx:Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n) 0 ∈
Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n) 1hxW:iterSingleton (v 0) n ∈ Wh2:Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n} 2 =
{iterSingleton (v 0) n}⊢ Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n} 2 ∈
Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n} 1
have h1 : Function.update
(Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2
{iterSingleton (v 0) n} 1 = W := by v:ℕ → ZFSet.{0}⊢ zfHolds axInf v simp refine_2.refine_1 v:ℕ → ZFSet.{0}W:ZFSet.{0} := ZFSet.range (iterSingleton (v 0))n:ℕhx:Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n) 0 ∈
Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n) 1hxW:iterSingleton (v 0) n ∈ Wh2:Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n} 2 =
{iterSingleton (v 0) n}h1:Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n} 1 = W⊢ Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n} 2 ∈
Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n} 1
rw [h2, refine_2.refine_1 v:ℕ → ZFSet.{0}W:ZFSet.{0} := ZFSet.range (iterSingleton (v 0))n:ℕhx:Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n) 0 ∈
Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n) 1hxW:iterSingleton (v 0) n ∈ Wh2:Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n} 2 =
{iterSingleton (v 0) n}h1:Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n} 1 = W⊢ {iterSingleton (v 0) n} ∈
Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n} 1 h1, refine_2.refine_1 v:ℕ → ZFSet.{0}W:ZFSet.{0} := ZFSet.range (iterSingleton (v 0))n:ℕhx:Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n) 0 ∈
Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n) 1hxW:iterSingleton (v 0) n ∈ Wh2:Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n} 2 =
{iterSingleton (v 0) n}h1:Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n} 1 = W⊢ {iterSingleton (v 0) n} ∈ W ZFSet.mem_range refine_2.refine_1 v:ℕ → ZFSet.{0}W:ZFSet.{0} := ZFSet.range (iterSingleton (v 0))n:ℕhx:Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n) 0 ∈
Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n) 1hxW:iterSingleton (v 0) n ∈ Wh2:Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n} 2 =
{iterSingleton (v 0) n}h1:Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n} 1 = W⊢ ∃ i, iterSingleton (v 0) i = {iterSingleton (v 0) n}] refine_2.refine_1 v:ℕ → ZFSet.{0}W:ZFSet.{0} := ZFSet.range (iterSingleton (v 0))n:ℕhx:Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n) 0 ∈
Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n) 1hxW:iterSingleton (v 0) n ∈ Wh2:Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n} 2 =
{iterSingleton (v 0) n}h1:Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n} 1 = W⊢ ∃ i, iterSingleton (v 0) i = {iterSingleton (v 0) n}
exact ⟨n + 1, rfl⟩ All goals completed! 🐙
· refine_2.refine_2 v:ℕ → ZFSet.{0}W:ZFSet.{0} := ZFSet.range (iterSingleton (v 0))n:ℕhx:Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n) 0 ∈
Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n) 1hxW:iterSingleton (v 0) n ∈ W⊢ ∀ (s : ZFSet.{0}),
(Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2
{iterSingleton (v 0) n})
1 s 1 ∈
Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2
{iterSingleton (v 0) n})
1 s 2 →
Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2
{iterSingleton (v 0) n})
1 s 1 =
Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2
{iterSingleton (v 0) n})
1 s 0) ∧
(Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2
{iterSingleton (v 0) n})
1 s 1 =
Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2
{iterSingleton (v 0) n})
1 s 0 →
Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2
{iterSingleton (v 0) n})
1 s 1 ∈
Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2
{iterSingleton (v 0) n})
1 s 2) intro z refine_2.refine_2 v:ℕ → ZFSet.{0}W:ZFSet.{0} := ZFSet.range (iterSingleton (v 0))n:ℕhx:Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n) 0 ∈
Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n) 1hxW:iterSingleton (v 0) n ∈ Wz:ZFSet.{0}⊢ (Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n})
1 z 1 ∈
Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n})
1 z 2 →
Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n})
1 z 1 =
Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n})
1 z 0) ∧
(Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n})
1 z 1 =
Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n})
1 z 0 →
Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n})
1 z 1 ∈
Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n})
1 z 2)
have hz1 : Function.update (Function.update (Function.update (Function.update v 1 W) 0
(iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n}) 1 z 1 = z := by v:ℕ → ZFSet.{0}⊢ zfHolds axInf v simp refine_2.refine_2 v:ℕ → ZFSet.{0}W:ZFSet.{0} := ZFSet.range (iterSingleton (v 0))n:ℕhx:Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n) 0 ∈
Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n) 1hxW:iterSingleton (v 0) n ∈ Wz:ZFSet.{0}hz1:Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n}) 1 z
1 =
z⊢ (Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n})
1 z 1 ∈
Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n})
1 z 2 →
Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n})
1 z 1 =
Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n})
1 z 0) ∧
(Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n})
1 z 1 =
Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n})
1 z 0 →
Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n})
1 z 1 ∈
Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n})
1 z 2)
have hz2 : Function.update (Function.update (Function.update (Function.update v 1 W) 0
(iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n}) 1 z 2 =
{iterSingleton (v 0) n} := by v:ℕ → ZFSet.{0}⊢ zfHolds axInf v simp refine_2.refine_2 v:ℕ → ZFSet.{0}W:ZFSet.{0} := ZFSet.range (iterSingleton (v 0))n:ℕhx:Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n) 0 ∈
Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n) 1hxW:iterSingleton (v 0) n ∈ Wz:ZFSet.{0}hz1:Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n}) 1 z
1 =
zhz2:Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n}) 1 z
2 =
{iterSingleton (v 0) n}⊢ (Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n})
1 z 1 ∈
Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n})
1 z 2 →
Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n})
1 z 1 =
Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n})
1 z 0) ∧
(Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n})
1 z 1 =
Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n})
1 z 0 →
Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n})
1 z 1 ∈
Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n})
1 z 2)
have hz0 : Function.update (Function.update (Function.update (Function.update v 1 W) 0
(iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n}) 1 z 0 =
iterSingleton (v 0) n := by v:ℕ → ZFSet.{0}⊢ zfHolds axInf v simp refine_2.refine_2 v:ℕ → ZFSet.{0}W:ZFSet.{0} := ZFSet.range (iterSingleton (v 0))n:ℕhx:Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n) 0 ∈
Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n) 1hxW:iterSingleton (v 0) n ∈ Wz:ZFSet.{0}hz1:Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n}) 1 z
1 =
zhz2:Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n}) 1 z
2 =
{iterSingleton (v 0) n}hz0:Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n}) 1 z
0 =
iterSingleton (v 0) n⊢ (Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n})
1 z 1 ∈
Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n})
1 z 2 →
Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n})
1 z 1 =
Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n})
1 z 0) ∧
(Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n})
1 z 1 =
Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n})
1 z 0 →
Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n})
1 z 1 ∈
Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n})
1 z 2)
rw [hz1, refine_2.refine_2 v:ℕ → ZFSet.{0}W:ZFSet.{0} := ZFSet.range (iterSingleton (v 0))n:ℕhx:Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n) 0 ∈
Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n) 1hxW:iterSingleton (v 0) n ∈ Wz:ZFSet.{0}hz1:Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n}) 1 z
1 =
zhz2:Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n}) 1 z
2 =
{iterSingleton (v 0) n}hz0:Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n}) 1 z
0 =
iterSingleton (v 0) n⊢ (z ∈
Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n})
1 z 2 →
z =
Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n})
1 z 0) ∧
(z =
Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n})
1 z 0 →
z ∈
Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n})
1 z 2) hz2, refine_2.refine_2 v:ℕ → ZFSet.{0}W:ZFSet.{0} := ZFSet.range (iterSingleton (v 0))n:ℕhx:Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n) 0 ∈
Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n) 1hxW:iterSingleton (v 0) n ∈ Wz:ZFSet.{0}hz1:Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n}) 1 z
1 =
zhz2:Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n}) 1 z
2 =
{iterSingleton (v 0) n}hz0:Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n}) 1 z
0 =
iterSingleton (v 0) n⊢ (z ∈ {iterSingleton (v 0) n} →
z =
Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n})
1 z 0) ∧
(z =
Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n})
1 z 0 →
z ∈ {iterSingleton (v 0) n}) hz0, refine_2.refine_2 v:ℕ → ZFSet.{0}W:ZFSet.{0} := ZFSet.range (iterSingleton (v 0))n:ℕhx:Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n) 0 ∈
Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n) 1hxW:iterSingleton (v 0) n ∈ Wz:ZFSet.{0}hz1:Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n}) 1 z
1 =
zhz2:Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n}) 1 z
2 =
{iterSingleton (v 0) n}hz0:Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n}) 1 z
0 =
iterSingleton (v 0) n⊢ (z ∈ {iterSingleton (v 0) n} → z = iterSingleton (v 0) n) ∧ (z = iterSingleton (v 0) n → z ∈ {iterSingleton (v 0) n}) ZFSet.mem_singleton refine_2.refine_2 v:ℕ → ZFSet.{0}W:ZFSet.{0} := ZFSet.range (iterSingleton (v 0))n:ℕhx:Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n) 0 ∈
Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n) 1hxW:iterSingleton (v 0) n ∈ Wz:ZFSet.{0}hz1:Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n}) 1 z
1 =
zhz2:Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n}) 1 z
2 =
{iterSingleton (v 0) n}hz0:Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n}) 1 z
0 =
iterSingleton (v 0) n⊢ (z = iterSingleton (v 0) n → z = iterSingleton (v 0) n) ∧ (z = iterSingleton (v 0) n → z = iterSingleton (v 0) n)] refine_2.refine_2 v:ℕ → ZFSet.{0}W:ZFSet.{0} := ZFSet.range (iterSingleton (v 0))n:ℕhx:Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n) 0 ∈
Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n) 1hxW:iterSingleton (v 0) n ∈ Wz:ZFSet.{0}hz1:Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n}) 1 z
1 =
zhz2:Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n}) 1 z
2 =
{iterSingleton (v 0) n}hz0:Function.update
(Function.update (Function.update (Function.update v 1 W) 0 (iterSingleton (v 0) n)) 2 {iterSingleton (v 0) n}) 1 z
0 =
iterSingleton (v 0) n⊢ (z = iterSingleton (v 0) n → z = iterSingleton (v 0) n) ∧ (z = iterSingleton (v 0) n → z = iterSingleton (v 0) n)
exact ⟨id, id⟩ All goals completed! 🐙
Soundness of ZFProvable with respect to the total Tarski valuation zfHolds on
ZFSet.{0}.
theorem zfProvable_zfHolds {n : ℕ} (h : ZFProvable n) (v : ℕ → ZFSet.{0}) :
zfHolds n v := by n:ℕh:ZFProvable nv:ℕ → ZFSet.{0}⊢ zfHolds n v
induction h generalizing v with
| moot => moot n:ℕv:ℕ → ZFSet.{0}⊢ zfHolds (zfEq 0 0) v exact (zfHolds_zfEq 0 0 v).mpr rfl All goals completed! 🐙
| mp _ _ ih1 ih2 => mp n:ℕφ✝:ℕψ✝:ℕa✝¹:ZFProvable φ✝a✝:ZFProvable (zfImp φ✝ ψ✝)ih1:∀ (v : ℕ → ZFSet.{0}), zfHolds φ✝ vih2:∀ (v : ℕ → ZFSet.{0}), zfHolds (zfImp φ✝ ψ✝) vv:ℕ → ZFSet.{0}⊢ zfHolds ψ✝ v
exact (zfHolds_zfImp _ _ v).mp (ih2 v) (ih1 v) All goals completed! 🐙
| gen x _ ih => gen n:ℕx:ℕφ✝:ℕa✝:ZFProvable φ✝ih:∀ (v : ℕ → ZFSet.{0}), zfHolds φ✝ vv:ℕ → ZFSet.{0}⊢ zfHolds (zfAll x φ✝) v
rw [zfHolds_zfAll gen n:ℕx:ℕφ✝:ℕa✝:ZFProvable φ✝ih:∀ (v : ℕ → ZFSet.{0}), zfHolds φ✝ vv:ℕ → ZFSet.{0}⊢ ∀ (s : ZFSet.{0}), zfHolds φ✝ (Function.update v x s)] gen n:ℕx:ℕφ✝:ℕa✝:ZFProvable φ✝ih:∀ (v : ℕ → ZFSet.{0}), zfHolds φ✝ vv:ℕ → ZFSet.{0}⊢ ∀ (s : ZFSet.{0}), zfHolds φ✝ (Function.update v x s)
intro s gen n:ℕx:ℕφ✝:ℕa✝:ZFProvable φ✝ih:∀ (v : ℕ → ZFSet.{0}), zfHolds φ✝ vv:ℕ → ZFSet.{0}s:ZFSet.{0}⊢ zfHolds φ✝ (Function.update v x s)
exact ih (Function.update v x s) All goals completed! 🐙
| b1 φ ψ χ => b1 n:ℕφ:ℕψ:ℕχ:ℕv:ℕ → ZFSet.{0}⊢ zfHolds (axB1 φ ψ χ) v
simp only [axB1, zfHolds_zfImp] b1 n:ℕφ:ℕψ:ℕχ:ℕv:ℕ → ZFSet.{0}⊢ (zfHolds φ v → zfHolds ψ v) → (zfHolds ψ v → zfHolds χ v) → zfHolds φ v → zfHolds χ v
intro h1 h2 h3 b1 n:ℕφ:ℕψ:ℕχ:ℕv:ℕ → ZFSet.{0}h1:zfHolds φ v → zfHolds ψ vh2:zfHolds ψ v → zfHolds χ vh3:zfHolds φ v⊢ zfHolds χ v
exact h2 (h1 h3) All goals completed! 🐙
| b2 φ => b2 n:ℕφ:ℕv:ℕ → ZFSet.{0}⊢ zfHolds (axB2 φ) v
simp only [axB2, zfHolds_zfImp, zfHolds_zfNot] b2 n:ℕφ:ℕv:ℕ → ZFSet.{0}⊢ (¬zfHolds φ v → zfHolds φ v) → zfHolds φ v
intro h b2 n:ℕφ:ℕv:ℕ → ZFSet.{0}h:¬zfHolds φ v → zfHolds φ v⊢ zfHolds φ v
by_cases hφ : zfHolds φ v pos n:ℕφ:ℕv:ℕ → ZFSet.{0}h:¬zfHolds φ v → zfHolds φ vhφ:zfHolds φ v⊢ zfHolds φ vneg n:ℕφ:ℕv:ℕ → ZFSet.{0}h:¬zfHolds φ v → zfHolds φ vhφ:¬zfHolds φ v⊢ zfHolds φ v
· pos n:ℕφ:ℕv:ℕ → ZFSet.{0}h:¬zfHolds φ v → zfHolds φ vhφ:zfHolds φ v⊢ zfHolds φ v exact hφ All goals completed! 🐙
· neg n:ℕφ:ℕv:ℕ → ZFSet.{0}h:¬zfHolds φ v → zfHolds φ vhφ:¬zfHolds φ v⊢ zfHolds φ v exact h hφ All goals completed! 🐙
| b3 φ ψ => b3 n:ℕφ:ℕψ:ℕv:ℕ → ZFSet.{0}⊢ zfHolds (axB3 φ ψ) v
simp only [axB3, zfHolds_zfImp, zfHolds_zfNot] b3 n:ℕφ:ℕψ:ℕv:ℕ → ZFSet.{0}⊢ zfHolds φ v → ¬zfHolds φ v → zfHolds ψ v
intro h1 h2 b3 n:ℕφ:ℕψ:ℕv:ℕ → ZFSet.{0}h1:zfHolds φ vh2:¬zfHolds φ v⊢ zfHolds ψ v
exact absurd h1 h2 All goals completed! 🐙
| b4 x φ ψ => b4 n:ℕx:ℕφ:ℕψ:ℕv:ℕ → ZFSet.{0}⊢ zfHolds (axB4 x φ ψ) v
simp only [axB4, zfHolds_zfImp, zfHolds_zfAll] b4 n:ℕx:ℕφ:ℕψ:ℕv:ℕ → ZFSet.{0}⊢ (∀ (s : ZFSet.{0}), zfHolds φ (Function.update v x s) → zfHolds ψ (Function.update v x s)) →
(∀ (s : ZFSet.{0}), zfHolds φ (Function.update v x s)) → ∀ (s : ZFSet.{0}), zfHolds ψ (Function.update v x s)
intro h1 h2 s b4 n:ℕx:ℕφ:ℕψ:ℕv:ℕ → ZFSet.{0}h1:∀ (s : ZFSet.{0}), zfHolds φ (Function.update v x s) → zfHolds ψ (Function.update v x s)h2:∀ (s : ZFSet.{0}), zfHolds φ (Function.update v x s)s:ZFSet.{0}⊢ zfHolds ψ (Function.update v x s)
exact h1 s (h2 s) All goals completed! 🐙
| b6a x y z hxz hzy => b6a n:ℕx:ℕy:ℕz:ℕhxz:x ≠ zhzy:z ≠ yv:ℕ → ZFSet.{0}⊢ zfHolds (axB6a x y z) v
simp [axB6a, hxz, hzy.symm] All goals completed! 🐙
| b6b x y φ => b6b n:ℕx:ℕy:ℕφ:ℕv:ℕ → ZFSet.{0}⊢ zfHolds (axB6b x y φ) v
simp only [axB6b, zfHolds_zfImp, zfHolds_zfAll] b6b n:ℕx:ℕy:ℕφ:ℕv:ℕ → ZFSet.{0}⊢ (∀ (s s_1 : ZFSet.{0}), zfHolds φ (Function.update (Function.update v x s) y s_1)) →
∀ (s s_1 : ZFSet.{0}), zfHolds φ (Function.update (Function.update v y s) x s_1)
intro h t s b6b n:ℕx:ℕy:ℕφ:ℕv:ℕ → ZFSet.{0}h:∀ (s s_1 : ZFSet.{0}), zfHolds φ (Function.update (Function.update v x s) y s_1)t:ZFSet.{0}s:ZFSet.{0}⊢ zfHolds φ (Function.update (Function.update v y t) x s)
by_cases hxy : x = y pos n:ℕx:ℕy:ℕφ:ℕv:ℕ → ZFSet.{0}h:∀ (s s_1 : ZFSet.{0}), zfHolds φ (Function.update (Function.update v x s) y s_1)t:ZFSet.{0}s:ZFSet.{0}hxy:x = y⊢ zfHolds φ (Function.update (Function.update v y t) x s)neg n:ℕx:ℕy:ℕφ:ℕv:ℕ → ZFSet.{0}h:∀ (s s_1 : ZFSet.{0}), zfHolds φ (Function.update (Function.update v x s) y s_1)t:ZFSet.{0}s:ZFSet.{0}hxy:¬x = y⊢ zfHolds φ (Function.update (Function.update v y t) x s)
· pos n:ℕx:ℕy:ℕφ:ℕv:ℕ → ZFSet.{0}h:∀ (s s_1 : ZFSet.{0}), zfHolds φ (Function.update (Function.update v x s) y s_1)t:ZFSet.{0}s:ZFSet.{0}hxy:x = y⊢ zfHolds φ (Function.update (Function.update v y t) x s) subst hxy pos n:ℕx:ℕφ:ℕv:ℕ → ZFSet.{0}t:ZFSet.{0}s:ZFSet.{0}h:∀ (s s_1 : ZFSet.{0}), zfHolds φ (Function.update (Function.update v x s) x s_1)⊢ zfHolds φ (Function.update (Function.update v x t) x s)
have := h s s pos n:ℕx:ℕφ:ℕv:ℕ → ZFSet.{0}t:ZFSet.{0}s:ZFSet.{0}h:∀ (s s_1 : ZFSet.{0}), zfHolds φ (Function.update (Function.update v x s) x s_1)this:zfHolds φ (Function.update (Function.update v x s) x s)⊢ zfHolds φ (Function.update (Function.update v x t) x s)
rw [Function.update_idem pos n:ℕx:ℕφ:ℕv:ℕ → ZFSet.{0}t:ZFSet.{0}s:ZFSet.{0}h:∀ (s s_1 : ZFSet.{0}), zfHolds φ (Function.update (Function.update v x s) x s_1)this:zfHolds φ (Function.update v x s)⊢ zfHolds φ (Function.update v x s)] at this ⊢ pos n:ℕx:ℕφ:ℕv:ℕ → ZFSet.{0}t:ZFSet.{0}s:ZFSet.{0}h:∀ (s s_1 : ZFSet.{0}), zfHolds φ (Function.update (Function.update v x s) x s_1)this:zfHolds φ (Function.update v x s)⊢ zfHolds φ (Function.update v x s)
exact this All goals completed! 🐙
· neg n:ℕx:ℕy:ℕφ:ℕv:ℕ → ZFSet.{0}h:∀ (s s_1 : ZFSet.{0}), zfHolds φ (Function.update (Function.update v x s) y s_1)t:ZFSet.{0}s:ZFSet.{0}hxy:¬x = y⊢ zfHolds φ (Function.update (Function.update v y t) x s) rw [Function.update_comm (Ne.symm hxy) neg n:ℕx:ℕy:ℕφ:ℕv:ℕ → ZFSet.{0}h:∀ (s s_1 : ZFSet.{0}), zfHolds φ (Function.update (Function.update v x s) y s_1)t:ZFSet.{0}s:ZFSet.{0}hxy:¬x = y⊢ zfHolds φ (Function.update (Function.update v x s) y t)] neg n:ℕx:ℕy:ℕφ:ℕv:ℕ → ZFSet.{0}h:∀ (s s_1 : ZFSet.{0}), zfHolds φ (Function.update (Function.update v x s) y s_1)t:ZFSet.{0}s:ZFSet.{0}hxy:¬x = y⊢ zfHolds φ (Function.update (Function.update v x s) y t)
exact h s t All goals completed! 🐙
| b6c x φ => b6c n:ℕx:ℕφ:ℕv:ℕ → ZFSet.{0}⊢ zfHolds (axB6c x φ) v
simp only [axB6c, zfHolds_zfImp, zfHolds_zfEx, zfHolds_zfAll] b6c n:ℕx:ℕφ:ℕv:ℕ → ZFSet.{0}⊢ (∃ s, ∀ (s_1 : ZFSet.{0}), zfHolds φ (Function.update (Function.update v x s) x s_1)) → zfHolds φ v
rintro ⟨s, hs⟩ b6c n:ℕx:ℕφ:ℕv:ℕ → ZFSet.{0}s:ZFSet.{0}hs:∀ (s_1 : ZFSet.{0}), zfHolds φ (Function.update (Function.update v x s) x s_1)⊢ zfHolds φ v
have := hs (v x) b6c n:ℕx:ℕφ:ℕv:ℕ → ZFSet.{0}s:ZFSet.{0}hs:∀ (s_1 : ZFSet.{0}), zfHolds φ (Function.update (Function.update v x s) x s_1)this:zfHolds φ (Function.update (Function.update v x s) x (v x))⊢ zfHolds φ v
rwa [Function.update_idem, Function.update_eq_self] at this All goals completed! 🐙
| b7 x y => b7 n:ℕx:ℕy:ℕv:ℕ → ZFSet.{0}⊢ zfHolds (axB7 x y) v
simp only [axB7, zfHolds_zfEx, zfHolds_zfEq] b7 n:ℕx:ℕy:ℕv:ℕ → ZFSet.{0}⊢ ∃ s, Function.update v x s x = Function.update v x s y
refine ⟨v y, ?_⟩ b7 n:ℕx:ℕy:ℕv:ℕ → ZFSet.{0}⊢ Function.update v x (v y) x = Function.update v x (v y) y
by_cases hxy : x = y pos n:ℕx:ℕy:ℕv:ℕ → ZFSet.{0}hxy:x = y⊢ Function.update v x (v y) x = Function.update v x (v y) yneg n:ℕx:ℕy:ℕv:ℕ → ZFSet.{0}hxy:¬x = y⊢ Function.update v x (v y) x = Function.update v x (v y) y <;> pos n:ℕx:ℕy:ℕv:ℕ → ZFSet.{0}hxy:x = y⊢ Function.update v x (v y) x = Function.update v x (v y) yneg n:ℕx:ℕy:ℕv:ℕ → ZFSet.{0}hxy:¬x = y⊢ Function.update v x (v y) x = Function.update v x (v y) y simp [hxy, Ne.symm] All goals completed! 🐙
| b8a x y z => b8a n:ℕx:ℕy:ℕz:ℕv:ℕ → ZFSet.{0}⊢ zfHolds (axB8a x y z) v
simp only [axB8a, zfHolds_zfImp, zfHolds_zfEq] b8a n:ℕx:ℕy:ℕz:ℕv:ℕ → ZFSet.{0}⊢ v x = v y → v x = v z → v y = v z
intro h1 h2 b8a n:ℕx:ℕy:ℕz:ℕv:ℕ → ZFSet.{0}h1:v x = v yh2:v x = v z⊢ v y = v z
exact h1.symm.trans h2 All goals completed! 🐙
| b8b x y z => b8b n:ℕx:ℕy:ℕz:ℕv:ℕ → ZFSet.{0}⊢ zfHolds (axB8b x y z) v
simp only [axB8b, zfHolds_zfImp, zfHolds_zfEq, zfHolds_zfMem] b8b n:ℕx:ℕy:ℕz:ℕv:ℕ → ZFSet.{0}⊢ v x = v y → v x ∈ v z → v y ∈ v z
intro h1 h2 b8b n:ℕx:ℕy:ℕz:ℕv:ℕ → ZFSet.{0}h1:v x = v yh2:v x ∈ v z⊢ v y ∈ v z
rwa [← h1] All goals completed! 🐙
| b8c x y z => b8c n:ℕx:ℕy:ℕz:ℕv:ℕ → ZFSet.{0}⊢ zfHolds (axB8c x y z) v
simp only [axB8c, zfHolds_zfImp, zfHolds_zfEq, zfHolds_zfMem] b8c n:ℕx:ℕy:ℕz:ℕv:ℕ → ZFSet.{0}⊢ v x = v y → v z ∈ v x → v z ∈ v y
intro h1 h2 b8c n:ℕx:ℕy:ℕz:ℕv:ℕ → ZFSet.{0}h1:v x = v yh2:v z ∈ v x⊢ v z ∈ v y
rwa [← h1] All goals completed! 🐙
| ext => ext n:ℕv:ℕ → ZFSet.{0}⊢ zfHolds axExt v
simp only [axExt, zfHolds_zfImp, zfHolds_zfAll, zfHolds_zfAnd, zfHolds_zfMem, zfHolds_zfEq] ext n:ℕv:ℕ → ZFSet.{0}⊢ (∀ (s : ZFSet.{0}),
(Function.update v 2 s 2 ∈ Function.update v 2 s 0 → Function.update v 2 s 2 ∈ Function.update v 2 s 1) ∧
(Function.update v 2 s 2 ∈ Function.update v 2 s 1 → Function.update v 2 s 2 ∈ Function.update v 2 s 0)) →
v 0 = v 1
intro h ext n:ℕv:ℕ → ZFSet.{0}h:∀ (s : ZFSet.{0}),
(Function.update v 2 s 2 ∈ Function.update v 2 s 0 → Function.update v 2 s 2 ∈ Function.update v 2 s 1) ∧
(Function.update v 2 s 2 ∈ Function.update v 2 s 1 → Function.update v 2 s 2 ∈ Function.update v 2 s 0)⊢ v 0 = v 1
apply ZFSet.ext ext n:ℕv:ℕ → ZFSet.{0}h:∀ (s : ZFSet.{0}),
(Function.update v 2 s 2 ∈ Function.update v 2 s 0 → Function.update v 2 s 2 ∈ Function.update v 2 s 1) ∧
(Function.update v 2 s 2 ∈ Function.update v 2 s 1 → Function.update v 2 s 2 ∈ Function.update v 2 s 0)⊢ ∀ (z : ZFSet.{0}), z ∈ v 0 ↔ z ∈ v 1
intro z ext n:ℕv:ℕ → ZFSet.{0}h:∀ (s : ZFSet.{0}),
(Function.update v 2 s 2 ∈ Function.update v 2 s 0 → Function.update v 2 s 2 ∈ Function.update v 2 s 1) ∧
(Function.update v 2 s 2 ∈ Function.update v 2 s 1 → Function.update v 2 s 2 ∈ Function.update v 2 s 0)z:ZFSet.{0}⊢ z ∈ v 0 ↔ z ∈ v 1
have hz := h z ext n:ℕv:ℕ → ZFSet.{0}h:∀ (s : ZFSet.{0}),
(Function.update v 2 s 2 ∈ Function.update v 2 s 0 → Function.update v 2 s 2 ∈ Function.update v 2 s 1) ∧
(Function.update v 2 s 2 ∈ Function.update v 2 s 1 → Function.update v 2 s 2 ∈ Function.update v 2 s 0)z:ZFSet.{0}hz:(Function.update v 2 z 2 ∈ Function.update v 2 z 0 → Function.update v 2 z 2 ∈ Function.update v 2 z 1) ∧
(Function.update v 2 z 2 ∈ Function.update v 2 z 1 → Function.update v 2 z 2 ∈ Function.update v 2 z 0)⊢ z ∈ v 0 ↔ z ∈ v 1
simpa using ⟨hz.1, hz.2⟩ All goals completed! 🐙
| rep φ => rep n:ℕφ:ℕv:ℕ → ZFSet.{0}⊢ zfHolds (axRep φ) v
exact zfHolds_axRep φ v All goals completed! 🐙
| pow => pow n:ℕv:ℕ → ZFSet.{0}⊢ zfHolds axPow v
simp only [axPow, zfHolds_zfEx, zfHolds_zfAll, zfHolds_zfImp, zfHolds_zfMem] pow n:ℕv:ℕ → ZFSet.{0}⊢ ∃ s,
∀ (s_1 : ZFSet.{0}),
(∀ (s_2 : ZFSet.{0}),
Function.update (Function.update (Function.update v 1 s) 2 s_1) 3 s_2 3 ∈
Function.update (Function.update (Function.update v 1 s) 2 s_1) 3 s_2 2 →
Function.update (Function.update (Function.update v 1 s) 2 s_1) 3 s_2 3 ∈
Function.update (Function.update (Function.update v 1 s) 2 s_1) 3 s_2 0) →
Function.update (Function.update v 1 s) 2 s_1 2 ∈ Function.update (Function.update v 1 s) 2 s_1 1
refine ⟨ZFSet.powerset (v 0), fun z hz => ?_⟩ pow n:ℕv:ℕ → ZFSet.{0}z:ZFSet.{0}hz:∀ (s : ZFSet.{0}),
Function.update (Function.update (Function.update v 1 (v 0).powerset) 2 z) 3 s 3 ∈
Function.update (Function.update (Function.update v 1 (v 0).powerset) 2 z) 3 s 2 →
Function.update (Function.update (Function.update v 1 (v 0).powerset) 2 z) 3 s 3 ∈
Function.update (Function.update (Function.update v 1 (v 0).powerset) 2 z) 3 s 0⊢ Function.update (Function.update v 1 (v 0).powerset) 2 z 2 ∈ Function.update (Function.update v 1 (v 0).powerset) 2 z 1
have hz' : z ∈ ZFSet.powerset (v 0) := by n:ℕh:ZFProvable nv:ℕ → ZFSet.{0}⊢ zfHolds n v
rw [ZFSet.mem_powerset n:ℕv:ℕ → ZFSet.{0}z:ZFSet.{0}hz:∀ (s : ZFSet.{0}),
Function.update (Function.update (Function.update v 1 (v 0).powerset) 2 z) 3 s 3 ∈
Function.update (Function.update (Function.update v 1 (v 0).powerset) 2 z) 3 s 2 →
Function.update (Function.update (Function.update v 1 (v 0).powerset) 2 z) 3 s 3 ∈
Function.update (Function.update (Function.update v 1 (v 0).powerset) 2 z) 3 s 0⊢ z ⊆ v 0] n:ℕv:ℕ → ZFSet.{0}z:ZFSet.{0}hz:∀ (s : ZFSet.{0}),
Function.update (Function.update (Function.update v 1 (v 0).powerset) 2 z) 3 s 3 ∈
Function.update (Function.update (Function.update v 1 (v 0).powerset) 2 z) 3 s 2 →
Function.update (Function.update (Function.update v 1 (v 0).powerset) 2 z) 3 s 3 ∈
Function.update (Function.update (Function.update v 1 (v 0).powerset) 2 z) 3 s 0⊢ z ⊆ v 0
intro w hw n:ℕv:ℕ → ZFSet.{0}z:ZFSet.{0}hz:∀ (s : ZFSet.{0}),
Function.update (Function.update (Function.update v 1 (v 0).powerset) 2 z) 3 s 3 ∈
Function.update (Function.update (Function.update v 1 (v 0).powerset) 2 z) 3 s 2 →
Function.update (Function.update (Function.update v 1 (v 0).powerset) 2 z) 3 s 3 ∈
Function.update (Function.update (Function.update v 1 (v 0).powerset) 2 z) 3 s 0w:ZFSet.{0}hw:w ∈ z⊢ w ∈ v 0
have hw' := hz w n:ℕv:ℕ → ZFSet.{0}z:ZFSet.{0}hz:∀ (s : ZFSet.{0}),
Function.update (Function.update (Function.update v 1 (v 0).powerset) 2 z) 3 s 3 ∈
Function.update (Function.update (Function.update v 1 (v 0).powerset) 2 z) 3 s 2 →
Function.update (Function.update (Function.update v 1 (v 0).powerset) 2 z) 3 s 3 ∈
Function.update (Function.update (Function.update v 1 (v 0).powerset) 2 z) 3 s 0w:ZFSet.{0}hw:w ∈ zhw':Function.update (Function.update (Function.update v 1 (v 0).powerset) 2 z) 3 w 3 ∈
Function.update (Function.update (Function.update v 1 (v 0).powerset) 2 z) 3 w 2 →
Function.update (Function.update (Function.update v 1 (v 0).powerset) 2 z) 3 w 3 ∈
Function.update (Function.update (Function.update v 1 (v 0).powerset) 2 z) 3 w 0⊢ w ∈ v 0
simpa using hw' hw pow n:ℕv:ℕ → ZFSet.{0}z:ZFSet.{0}hz:∀ (s : ZFSet.{0}),
Function.update (Function.update (Function.update v 1 (v 0).powerset) 2 z) 3 s 3 ∈
Function.update (Function.update (Function.update v 1 (v 0).powerset) 2 z) 3 s 2 →
Function.update (Function.update (Function.update v 1 (v 0).powerset) 2 z) 3 s 3 ∈
Function.update (Function.update (Function.update v 1 (v 0).powerset) 2 z) 3 s 0hz':z ∈ (v 0).powerset⊢ Function.update (Function.update v 1 (v 0).powerset) 2 z 2 ∈ Function.update (Function.update v 1 (v 0).powerset) 2 z 1
simpa using hz' All goals completed! 🐙
| uni => uni n:ℕv:ℕ → ZFSet.{0}⊢ zfHolds axUni v
simp only [axUni, zfHolds_zfEx, zfHolds_zfAll, zfHolds_zfImp, zfHolds_zfAnd, zfHolds_zfMem] uni n:ℕv:ℕ → ZFSet.{0}⊢ ∃ s,
∀ (s_1 : ZFSet.{0}),
(∃ s_2,
Function.update (Function.update (Function.update v 1 s) 2 s_1) 3 s_2 2 ∈
Function.update (Function.update (Function.update v 1 s) 2 s_1) 3 s_2 3 ∧
Function.update (Function.update (Function.update v 1 s) 2 s_1) 3 s_2 3 ∈
Function.update (Function.update (Function.update v 1 s) 2 s_1) 3 s_2 0) →
Function.update (Function.update v 1 s) 2 s_1 2 ∈ Function.update (Function.update v 1 s) 2 s_1 1
refine ⟨ZFSet.sUnion (v 0), fun z hz => ?_⟩ uni n:ℕv:ℕ → ZFSet.{0}z:ZFSet.{0}hz:∃ s,
Function.update (Function.update (Function.update v 1 (v 0).sUnion) 2 z) 3 s 2 ∈
Function.update (Function.update (Function.update v 1 (v 0).sUnion) 2 z) 3 s 3 ∧
Function.update (Function.update (Function.update v 1 (v 0).sUnion) 2 z) 3 s 3 ∈
Function.update (Function.update (Function.update v 1 (v 0).sUnion) 2 z) 3 s 0⊢ Function.update (Function.update v 1 (v 0).sUnion) 2 z 2 ∈ Function.update (Function.update v 1 (v 0).sUnion) 2 z 1
rcases hz with ⟨w, hw1, hw2⟩ uni n:ℕv:ℕ → ZFSet.{0}z:ZFSet.{0}w:ZFSet.{0}hw1:Function.update (Function.update (Function.update v 1 (v 0).sUnion) 2 z) 3 w 2 ∈
Function.update (Function.update (Function.update v 1 (v 0).sUnion) 2 z) 3 w 3hw2:Function.update (Function.update (Function.update v 1 (v 0).sUnion) 2 z) 3 w 3 ∈
Function.update (Function.update (Function.update v 1 (v 0).sUnion) 2 z) 3 w 0⊢ Function.update (Function.update v 1 (v 0).sUnion) 2 z 2 ∈ Function.update (Function.update v 1 (v 0).sUnion) 2 z 1
have hz' : z ∈ ZFSet.sUnion (v 0) := by n:ℕh:ZFProvable nv:ℕ → ZFSet.{0}⊢ zfHolds n v
rw [ZFSet.mem_sUnion n:ℕv:ℕ → ZFSet.{0}z:ZFSet.{0}w:ZFSet.{0}hw1:Function.update (Function.update (Function.update v 1 (v 0).sUnion) 2 z) 3 w 2 ∈
Function.update (Function.update (Function.update v 1 (v 0).sUnion) 2 z) 3 w 3hw2:Function.update (Function.update (Function.update v 1 (v 0).sUnion) 2 z) 3 w 3 ∈
Function.update (Function.update (Function.update v 1 (v 0).sUnion) 2 z) 3 w 0⊢ ∃ z_1 ∈ v 0, z ∈ z_1] n:ℕv:ℕ → ZFSet.{0}z:ZFSet.{0}w:ZFSet.{0}hw1:Function.update (Function.update (Function.update v 1 (v 0).sUnion) 2 z) 3 w 2 ∈
Function.update (Function.update (Function.update v 1 (v 0).sUnion) 2 z) 3 w 3hw2:Function.update (Function.update (Function.update v 1 (v 0).sUnion) 2 z) 3 w 3 ∈
Function.update (Function.update (Function.update v 1 (v 0).sUnion) 2 z) 3 w 0⊢ ∃ z_1 ∈ v 0, z ∈ z_1
exact ⟨w, by n:ℕv:ℕ → ZFSet.{0}z:ZFSet.{0}w:ZFSet.{0}hw1:Function.update (Function.update (Function.update v 1 (v 0).sUnion) 2 z) 3 w 2 ∈
Function.update (Function.update (Function.update v 1 (v 0).sUnion) 2 z) 3 w 3hw2:Function.update (Function.update (Function.update v 1 (v 0).sUnion) 2 z) 3 w 3 ∈
Function.update (Function.update (Function.update v 1 (v 0).sUnion) 2 z) 3 w 0⊢ w ∈ v 0 simpa using hw2 All goals completed! 🐙, by n:ℕv:ℕ → ZFSet.{0}z:ZFSet.{0}w:ZFSet.{0}hw1:Function.update (Function.update (Function.update v 1 (v 0).sUnion) 2 z) 3 w 2 ∈
Function.update (Function.update (Function.update v 1 (v 0).sUnion) 2 z) 3 w 3hw2:Function.update (Function.update (Function.update v 1 (v 0).sUnion) 2 z) 3 w 3 ∈
Function.update (Function.update (Function.update v 1 (v 0).sUnion) 2 z) 3 w 0⊢ z ∈ w simpa using hw1 All goals completed! 🐙⟩ uni n:ℕv:ℕ → ZFSet.{0}z:ZFSet.{0}w:ZFSet.{0}hw1:Function.update (Function.update (Function.update v 1 (v 0).sUnion) 2 z) 3 w 2 ∈
Function.update (Function.update (Function.update v 1 (v 0).sUnion) 2 z) 3 w 3hw2:Function.update (Function.update (Function.update v 1 (v 0).sUnion) 2 z) 3 w 3 ∈
Function.update (Function.update (Function.update v 1 (v 0).sUnion) 2 z) 3 w 0hz':z ∈ (v 0).sUnion⊢ Function.update (Function.update v 1 (v 0).sUnion) 2 z 2 ∈ Function.update (Function.update v 1 (v 0).sUnion) 2 z 1
simpa using hz' All goals completed! 🐙
| inf => inf n:ℕv:ℕ → ZFSet.{0}⊢ zfHolds axInf v
exact zfHolds_axInf v All goals completed! 🐙
Soundness of the ZFProvable Hilbert system with respect to Mathlib's ZFSet.{0}:
any provable well-formed formula holds under every variable assignment v : ℕ → ZFSet.{0}.
theorem zfProvable_sound_zfSet (φ : ZFFormula) (h : ZFProvable φ.code)
(v : ℕ → ZFSet.{0}) : φ.Holds v :=
(zfHolds_code φ v).mp (zfProvable_zfHolds h v)
Relative consistency of ZFProvable from Mathlib's ZFSet.{0} model of ZFC:
ZFInconsistent is false assuming zfProvable_sound_zfSet.
theorem not_zfInconsistent : ¬ ZFInconsistent := by ⊢ ¬ZFInconsistent
intro h h:ZFInconsistent⊢ False
have h0 : (ZFFormula.mem 0 0).Holds (fun _ => (∅ : ZFSet.{0})) :=
zfProvable_sound_zfSet (.mem 0 0) h (fun _ => ∅) h:ZFInconsistenth0:ZFFormula.Holds (fun x ↦ ∅) (ZFFormula.mem 0 0)⊢ False
exact not_holds_mem_zero_zero h0 All goals completed! 🐙end ConjectureMachines.Semantics.Zf