The Litex-to-Lean compiler
Litex records why a mathematical statement passed. For supported routes, the compiler replays that checked evidence as Lean proof terms, preserving the original objects, premises and citations.
How the parts fit together
Select a part to inspect its responsibility. The design follows the current compiler source; the examples below retain their recorded, checked versions.
Litex source → verification and execution
Completed typed results + original Runtime
Display / JSON is another projection of these results; it is not the compiler input.Result dispatch
Traverse the completed run in source order. Dispatch mirrors the execution-result enums: definitions, proof statements and facts retain their own branches. The compiler receives the original Runtime and completed results, rather than rebuilding a proof from source text or JSON.
RunLitexCodeResult → ExecStmtResult → ExecFactStmtResult → VerifyFactResultGenerated.lean + matching Litex.lean → Lean kernel check
A handwritten interpretation / adapter connects supported generated results to ordinary Mathlib statements.
Source entrypoint
let result = runtime.run_litex_code(&source)?;
let compiler = LitexToLeanCompiler::new(runtime);
let lean = compiler.compile_run(&result, &namespace)?;compile_to_lean/compile_stmt_resultWhat compilation must preserve
The selected proof
The proof route and its premise checks determine the generated proof. The final proposition alone is insufficient.
The source objects
Keep object representation, membership and partial-operation guards. Being a real number does not replace an object's generic host representation.
Visible knowledge
Only actual, available producers justify citations. Proof-local helpers stay local; supported published results may be reused.
Independent checking
Generating Lean text and passing its kernel check are separate gates. Interpreting Litex.Semantics as ordinary Mathlib mathematics is a further bridge.
From statement results to Lean proofs.
The verifier records how a statement was justified. For supported routes, the compiler turns those local checks into Lean proof terms; Lean then checks the generated file with Litex.lean.
Compilation uses the original typed results and their Runtime context. The JSON below is a recorded view of that evidence, not the compiler's input.
- 1
Litex source
- 2
Typed statement result
- 3
Generated Lean
- 4
Lean kernel check
Both endpoints are the same number. Their formation checks, identity evidence and stored FactId become a Lean theorem.
Litex source
# The number one equals itself.
1 = 1
lean/examples/one_equals_itself/statement.litForm the objects
The result certifies both number literals. Generated code represents them with Litex.number and states their equality with Litex.Same.
Recorded result · excerpt
VerifyEqualitySuccess.well_defined_proof
{
"left": {
"type": "by_def",
"family": "Literal",
"kind": "Number",
"obj": "1"
},
"right": {
"type": "by_def",
"family": "Literal",
"kind": "Number",
"obj": "1"
}
}statement_results[0].verify.well_defined
Generated Lean · excerpt
Lines 10theorem h_1 : Litex.Same (Litex.number (M := M) (1 : ℂ)) (Litex.number (M := M) (1 : ℂ)) :=Corresponding compiler branch: src/compile_to_lean/compile_fact_stmt_result/compile_equality_result/compile_equality_result.rs
Read the complete generated Lean file
import Litex
set_option linter.unusedVariables false
namespace LitexCompiled.file_lean_x2f_examples_x2f_one_x5f_equals_x5f_itself_x2f_statement_x2e_lit
universe u
variable {M : Litex.Semantics.{u}}
theorem h_1 : Litex.Same (Litex.number (M := M) (1 : ℂ)) (Litex.number (M := M) (1 : ℂ)) :=
(Litex.sameRefl (Litex.number (M := M) (1 : ℂ)))
end LitexCompiled.file_lean_x2f_examples_x2f_one_x5f_equals_x5f_itself_x2f_statement_x2e_lit
Inspect the complete recorded result
{
"kind": "run",
"success": true,
"target": "file",
"path": "lean/examples/one_equals_itself/statement.lit",
"detail": "detailed",
"language": "en",
"statement_results": [
{
"success": true,
"kind": "fact",
"statement": "1 = 1",
"verify": {
"type": "equality",
"success": true,
"fact": "1 = 1",
"well_defined": {
"left": {
"type": "by_def",
"family": "Literal",
"kind": "Number",
"obj": "1"
},
"right": {
"type": "by_def",
"family": "Literal",
"kind": "Number",
"obj": "1"
}
},
"searched_proof": {
"type": "by_they_are_the_same",
"kind": "same_ir"
}
},
"store_and_infer": {
"stores": [
{
"fact_id": "f1",
"fact": "1 = 1"
}
],
"infers": []
}
}
],
"session_error": null
}Strict Litex verification, actual compilation, an exact match with the canonical Lean pair, and a Lean kernel check all passed. The detailed view and Lean output came from the same typed result and Runtime.
The generated theorems use only Lean's standard propext, Classical.choice and Quot.sound axioms; no sorry or additional project axioms were found.
Compile and check locally
Compile from the golitex checkout. Put Generated.lean and the matching Litex.lean in the root of a Lean project with this lakefile.toml and lean-toolchain; then run the Lake commands below.
lakefile.toml
name = "litex_replay"
version = "0.1.0"
[[require]]
name = "mathlib"
git = "https://github.com/leanprover-community/mathlib4"
rev = "fabf563a7c95a166b8d7b6efca11c8b4dc9d911f"
[[lean_lib]]
name = "Litex"lean-toolchain
leanprover/lean4:v4.31.0litex -strict -lang en -f lean/examples/one_equals_itself/statement.lit
litex -strict -lean -f lean/examples/one_equals_itself/statement.lit > Generated.lean
# In the configured Lean project
lake update
lake build Litex
lake env lean -DwarningAsError=true Generated.leanLitex 1.0.6-beta · Lean (version 4.31.0, arm64-apple-darwin24.6.0, commit 68218e876d2a38b1985b8590fff244a83c321783, Release)
Litex source revision: de63211f30bb832030f55fc87ae822925ea42f55
Mathlib revision: fabf563a7c95a166b8d7b6efca11c8b4dc9d911f
Litex.lean SHA-256: 5bedd5a4dfb69550b0542ea2bc21951886cd20f6122f6196aff78bbca5495dc2
Theorem axiom audit
'LitexCompiled.file_lean_x2f_examples_x2f_one_x5f_equals_x5f_itself_x2f_statement_x2e_lit.h_1' depends on axioms: [propext,
Classical.choice,
Quot.sound]
What does Litex.lean supply?
Generated files begin with import Litex. Litex.lean defines objects, equality and certified constructors, and proves the bridge lemmas they use. For example, sameRefl proves reflexivity from the definition of Same.
Source excerpt · inside namespace Litexdef sameRefl {M : Semantics.{u}} {α : Type v} [Representation M α]
(a : Obj (M := M) α) : Same a a :=
rflGenerated theorems explicitly quantify over M : Litex.Semantics. Function examples also require Litex.FunctionSemantics M. Lean checks the proof under these interfaces; using the result as an ordinary Mathlib theorem requires a corresponding interpretation and bridge.
Support depends on the recorded rule, object and scope. An unsupported route rejects the complete compilation even when Litex can verify the source.
Read the matching Litex.lean file
Use this recorded library with these generated files. A different library version may expose a different interface.
import Mathlib.Data.Complex.Basic
import Mathlib.Algebra.Order.Archimedean.Real.Basic
import Mathlib.Tactic.FieldSimp
import Mathlib.SetTheory.ZFC.Ordinal
/-! Litex object semantics, certified constructors, and native numeric bridges.
`Obj` always includes its well-definedness proof. Host representations remain
generic, and source equality and membership use their fixed denotations.
`NumericModel.model` is an explicit candidate for the numeric slice; it is not
a default model or a completed model of all Litex objects and rules.
-/
universe u v w x
namespace Litex
open Lean Elab Tactic Lean.Parser.Tactic in
/-- Check only the already selected rational-normalization adapter. An explicit
discharger supplies the source's certified denominator evidence. The fixed
denominator step may close the goal itself; otherwise its remaining polynomial
equality is checked by `ring`. No target shape or theorem search selects between
alternative proof routes. -/
elab (name := normalizeRational) "litex_normalize_rational" d:discharger : tactic => do
evalTactic (← `(tactic| field_simp $d))
if !(← getGoals).isEmpty then
evalTactic (← `(tactic| ring))
inductive StandardSetValue where
| natural
| integer
| rational
| real
| complex
deriving DecidableEq, Repr
/-- An explicit contract for a future mathematical model, not an instantiated
model or a collection of global axioms. The object API is conditional on it. -/
structure Semantics where
Value : Type u
mem : Value → Value → Prop
isSet : Value → Prop
number : ℂ → Value
standard : StandardSetValue → Value
addValue : Value → Value → Value
subValue : Value → Value → Value
mulValue : Value → Value → Value
negValue : Value → Value
divValue : Value → Value → Value
powValue : Value → Value → Value
number_injective : Function.Injective number
complex_members : ∀ x, mem x (standard .complex) ↔ ∃ z, x = number z
natural_members : ∀ x, mem x (standard .natural) ↔ ∃ n : ℕ, x = number (n : ℂ)
integer_members : ∀ x, mem x (standard .integer) ↔ ∃ z : ℤ, x = number (z : ℂ)
rational_members : ∀ x, mem x (standard .rational) ↔ ∃ q : ℚ, x = number (q : ℂ)
real_members : ∀ x, mem x (standard .real) ↔ ∃ r : ℝ, x = number (r : ℂ)
real_subset_complex : ∀ x, mem x (standard .real) → mem x (standard .complex)
member_isSet : ∀ {x A}, mem x A → isSet x
standard_isSet : ∀ A, isSet (standard A)
add_numbers : ∀ a b, addValue (number a) (number b) = number (a + b)
sub_numbers : ∀ a b, subValue (number a) (number b) = number (a - b)
mul_numbers : ∀ a b, mulValue (number a) (number b) = number (a * b)
neg_numbers : ∀ a, negValue (number a) = number (-a)
div_numbers : ∀ a b, b ≠ 0 → divValue (number a) (number b) = number (a / b)
pow_numbers_nat : ∀ a (n : ℕ), powValue (number a) (number (n : ℂ)) = number (a ^ n)
pow_numbers_int : ∀ a (z : ℤ), a ≠ 0 →
powValue (number a) (number (z : ℂ)) = number (a ^ z)
add_closed : ∀ {a b},
mem a (standard .complex) → mem b (standard .complex) →
mem (addValue a b) (standard .complex)
div_closed : ∀ {a b},
mem a (standard .complex) → mem b (standard .complex) →
b ≠ number 0 → mem (divValue a b) (standard .complex)
end Litex
namespace Litex
/-- Fixed meaning and admissibility for one host representation. There is no
fallback instance certifying arbitrary Lean types. -/
class Representation (M : Semantics.{u}) (α : Type v) where
wd : α → Prop
denote : α → M.Value
wd_isSet : ∀ {a}, wd a → M.isSet (denote a)
def WD {M : Semantics.{u}} {α : Type v} [Representation M α] (a : α) : Prop :=
Representation.wd (M := M) a
structure Obj {M : Semantics.{u}} (α : Type v) [Representation M α] where
val : α
wd : WD (M := M) val
def denote {M : Semantics.{u}} {α : Type v} [Representation M α]
(a : Obj (M := M) α) : M.Value :=
Representation.denote a.val
def Same {M : Semantics.{u}} {α : Type v} {β : Type w}
[Representation M α] [Representation M β]
(a : Obj (M := M) α) (b : Obj (M := M) β) : Prop :=
denote a = denote b
def In {M : Semantics.{u}} {α : Type v} {β : Type w}
[Representation M α] [Representation M β]
(a : Obj (M := M) α) (A : Obj (M := M) β) : Prop :=
M.mem (denote a) (denote A)
def IsSet {M : Semantics.{u}} {α : Type v} [Representation M α]
(a : Obj (M := M) α) : Prop :=
M.isSet (denote a)
/-- Source nonemptiness is existence in the semantic universe. It does not
choose a host representation or turn a fresh declaration into a number. -/
def IsNonempty {M : Semantics.{u}} {α : Type v} [Representation M α]
(A : Obj (M := M) α) : Prop :=
∃ a : M.Value, M.mem a (denote A)
/-- Owned real comparisons use faithful real denotation witnesses. Membership
remains an ordinary fact, and a generic object's carrier does not change. In
particular these predicates do not install an order on arbitrary complex values. -/
def Le {M : Semantics.{u}} {α : Type v} {β : Type w}
[Representation M α] [Representation M β]
(a : Obj (M := M) α) (b : Obj (M := M) β) : Prop :=
∃ r s : ℝ, denote a = M.number (r : ℂ) ∧
denote b = M.number (s : ℂ) ∧ r ≤ s
def Lt {M : Semantics.{u}} {α : Type v} {β : Type w}
[Representation M α] [Representation M β]
(a : Obj (M := M) α) (b : Obj (M := M) β) : Prop :=
∃ r s : ℝ, denote a = M.number (r : ℂ) ∧
denote b = M.number (s : ℂ) ∧ r < s
def isSet {M : Semantics.{u}} {α : Type v} [Representation M α]
(a : Obj (M := M) α) : IsSet a :=
Representation.wd_isSet a.wd
def sameRefl {M : Semantics.{u}} {α : Type v} [Representation M α]
(a : Obj (M := M) α) : Same a a :=
rfl
/-- Predicate transport uses denotation equality across host representations. -/
theorem inOfSame {M : Semantics.{u}} {α : Type v} {β : Type w}
{γ : Type x} {δ : Type*}
[Representation M α] [Representation M β]
[Representation M γ] [Representation M δ]
(a : Obj (M := M) α) (b : Obj (M := M) β)
(A : Obj (M := M) γ) (B : Obj (M := M) δ)
(hab : Same a b) (hAB : Same A B) (haA : In a A) : In b B :=
Eq.mp (congrArg₂ M.mem hab hAB) haA
theorem isSetOfSame {M : Semantics.{u}} {α : Type v} {β : Type w}
[Representation M α] [Representation M β]
(a : Obj (M := M) α) (b : Obj (M := M) β)
(hab : Same a b) (ha : IsSet a) : IsSet b :=
Eq.mp (congrArg M.isSet hab) ha
theorem notSameOfSame {M : Semantics.{u}} {α : Type v} {β : Type w}
{γ : Type x} {δ : Type*}
[Representation M α] [Representation M β]
[Representation M γ] [Representation M δ]
(a : Obj (M := M) α) (b : Obj (M := M) β)
(c : Obj (M := M) γ) (d : Obj (M := M) δ)
(hab : Same a b) (hcd : Same c d) (hac : ¬ Same a c) : ¬ Same b d :=
fun hbd => hac (hab.trans (hbd.trans hcd.symm))
instance complexRepresentation (M : Semantics.{u}) : Representation M ℂ where
wd _ := True
denote := M.number
wd_isSet {a} _ := M.member_isSet ((M.complex_members (M.number a)).mpr ⟨a, rfl⟩)
instance standardRepresentation (M : Semantics.{u}) :
Representation M StandardSetValue where
wd _ := True
denote := M.standard
wd_isSet {a} _ := M.standard_isSet a
def number {M : Semantics.{u}} (z : ℂ) : Obj (M := M) ℂ :=
⟨z, True.intro⟩
def standardSet {M : Semantics.{u}} (A : StandardSetValue) :
Obj (M := M) StandardSetValue :=
⟨A, True.intro⟩
def N {M : Semantics.{u}} : Obj (M := M) StandardSetValue := standardSet .natural
def Z {M : Semantics.{u}} : Obj (M := M) StandardSetValue := standardSet .integer
def Q {M : Semantics.{u}} : Obj (M := M) StandardSetValue := standardSet .rational
def R {M : Semantics.{u}} : Obj (M := M) StandardSetValue := standardSet .real
def C {M : Semantics.{u}} : Obj (M := M) StandardSetValue := standardSet .complex
def numberInC {M : Semantics.{u}} (z : ℂ) : In (number (M := M) z) C :=
(M.complex_members (M.number z)).mpr ⟨z, rfl⟩
def realToComplex {M : Semantics.{u}} {α : Type v} [Representation M α]
(a : Obj (M := M) α) (haR : In a R) : In a C :=
M.real_subset_complex (denote a) haR
def naturalToComplex {M : Semantics.{u}} {α : Type v} [Representation M α]
(a : Obj (M := M) α) (haN : In a N) : In a C := by
obtain ⟨n, hn⟩ := (M.natural_members (denote a)).mp haN
exact (M.complex_members (denote a)).mpr ⟨(n : ℂ), hn⟩
def integerToComplex {M : Semantics.{u}} {α : Type v} [Representation M α]
(a : Obj (M := M) α) (haZ : In a Z) : In a C := by
obtain ⟨z, hz⟩ := (M.integer_members (denote a)).mp haZ
exact (M.complex_members (denote a)).mpr ⟨(z : ℂ), hz⟩
def naturalToInteger {M : Semantics.{u}} {α : Type v} [Representation M α]
(a : Obj (M := M) α) (haN : In a N) : In a Z := by
obtain ⟨n, hn⟩ := (M.natural_members (denote a)).mp haN
exact (M.integer_members (denote a)).mpr ⟨(n : ℤ), by simpa only [Int.cast_natCast] using hn⟩
def naturalToReal {M : Semantics.{u}} {α : Type v} [Representation M α]
(a : Obj (M := M) α) (haN : In a N) : In a R := by
obtain ⟨n, hn⟩ := (M.natural_members (denote a)).mp haN
exact (M.real_members (denote a)).mpr ⟨(n : ℝ), by simpa only [Complex.ofReal_natCast] using hn⟩
def integerToReal {M : Semantics.{u}} {α : Type v} [Representation M α]
(a : Obj (M := M) α) (haZ : In a Z) : In a R := by
obtain ⟨z, hz⟩ := (M.integer_members (denote a)).mp haZ
exact (M.real_members (denote a)).mpr ⟨(z : ℝ), by simpa only [Complex.ofReal_intCast] using hz⟩
def naturalToRational {M : Semantics.{u}} {α : Type v} [Representation M α]
(a : Obj (M := M) α) (haN : In a N) : In a Q := by
obtain ⟨n, hn⟩ := (M.natural_members (denote a)).mp haN
exact (M.rational_members (denote a)).mpr ⟨(n : ℚ), by
simpa only [Rat.cast_natCast] using hn⟩
def integerToRational {M : Semantics.{u}} {α : Type v} [Representation M α]
(a : Obj (M := M) α) (haZ : In a Z) : In a Q := by
obtain ⟨z, hz⟩ := (M.integer_members (denote a)).mp haZ
exact (M.rational_members (denote a)).mpr ⟨(z : ℚ), by
simpa only [Rat.cast_intCast] using hz⟩
def rationalToReal {M : Semantics.{u}} {α : Type v} [Representation M α]
(a : Obj (M := M) α) (haQ : In a Q) : In a R := by
obtain ⟨q, hq⟩ := (M.rational_members (denote a)).mp haQ
exact (M.real_members (denote a)).mpr ⟨(q : ℝ), by
simpa only [Complex.ofReal_ratCast] using hq⟩
def rationalToComplex {M : Semantics.{u}} {α : Type v} [Representation M α]
(a : Obj (M := M) α) (haQ : In a Q) : In a C :=
realToComplex a (rationalToReal a haQ)
theorem standardNonempty {M : Semantics.{u}} (A : StandardSetValue) :
IsNonempty (standardSet (M := M) A) := by
cases A with
| natural => exact ⟨M.number (0 : ℂ), (M.natural_members _).mpr ⟨0, by simp⟩⟩
| integer => exact ⟨M.number (0 : ℂ), (M.integer_members _).mpr ⟨0, by simp⟩⟩
| rational => exact ⟨M.number (0 : ℂ), (M.rational_members _).mpr ⟨0, by simp⟩⟩
| real => exact ⟨M.number (0 : ℂ), (M.real_members _).mpr ⟨0, by simp⟩⟩
| complex => exact ⟨M.number (0 : ℂ), (M.complex_members _).mpr ⟨0, rfl⟩⟩
end Litex
namespace Litex.Semantics
theorem sub_closed {M : Semantics.{u}} {a b : M.Value}
(ha : M.mem a (M.standard .complex)) (hb : M.mem b (M.standard .complex)) :
M.mem (M.subValue a b) (M.standard .complex) := by
obtain ⟨x, rfl⟩ := (M.complex_members a).mp ha
obtain ⟨y, rfl⟩ := (M.complex_members b).mp hb
exact (M.complex_members _).mpr ⟨x - y, M.sub_numbers x y⟩
theorem mul_closed {M : Semantics.{u}} {a b : M.Value}
(ha : M.mem a (M.standard .complex)) (hb : M.mem b (M.standard .complex)) :
M.mem (M.mulValue a b) (M.standard .complex) := by
obtain ⟨x, rfl⟩ := (M.complex_members a).mp ha
obtain ⟨y, rfl⟩ := (M.complex_members b).mp hb
exact (M.complex_members _).mpr ⟨x * y, M.mul_numbers x y⟩
theorem neg_closed {M : Semantics.{u}} {a : M.Value}
(ha : M.mem a (M.standard .complex)) :
M.mem (M.negValue a) (M.standard .complex) := by
obtain ⟨x, rfl⟩ := (M.complex_members a).mp ha
exact (M.complex_members _).mpr ⟨-x, M.neg_numbers x⟩
end Litex.Semantics
namespace Litex
structure AddObj {M : Semantics.{u}} (α : Type v) (β : Type w)
[Representation M α] [Representation M β] where
left : Obj (M := M) α
right : Obj (M := M) β
structure DivObj {M : Semantics.{u}} (α : Type v) (β : Type w)
[Representation M α] [Representation M β] where
left : Obj (M := M) α
right : Obj (M := M) β
structure SubObj {M : Semantics.{u}} (α : Type v) (β : Type w)
[Representation M α] [Representation M β] where
left : Obj (M := M) α
right : Obj (M := M) β
structure MulObj {M : Semantics.{u}} (α : Type v) (β : Type w)
[Representation M α] [Representation M β] where
left : Obj (M := M) α
right : Obj (M := M) β
structure NegObj {M : Semantics.{u}} (α : Type v) [Representation M α] where
arg : Obj (M := M) α
structure PowObj {M : Semantics.{u}} (α : Type v) (β : Type w)
[Representation M α] [Representation M β] where
base : Obj (M := M) α
exponent : Obj (M := M) β
instance subRepresentation {M : Semantics.{u}} {α : Type v} {β : Type w}
[Representation M α] [Representation M β] :
Representation M (SubObj (M := M) α β) where
wd a := In a.left C ∧ In a.right C
denote a := M.subValue (denote a.left) (denote a.right)
wd_isSet h := M.member_isSet (Semantics.sub_closed h.1 h.2)
instance mulRepresentation {M : Semantics.{u}} {α : Type v} {β : Type w}
[Representation M α] [Representation M β] :
Representation M (MulObj (M := M) α β) where
wd a := In a.left C ∧ In a.right C
denote a := M.mulValue (denote a.left) (denote a.right)
wd_isSet h := M.member_isSet (Semantics.mul_closed h.1 h.2)
instance negRepresentation {M : Semantics.{u}} {α : Type v} [Representation M α] :
Representation M (NegObj (M := M) α) where
wd a := In a.arg C
denote a := M.negValue (denote a.arg)
wd_isSet h := M.member_isSet (Semantics.neg_closed h)
/-- The three supported integer-power domains are separate proof alternatives.
The source exponent remains an object, and its exact numeric value is certified.
None of these witnesses selects the object's denotation. -/
def PowDomain {M : Semantics.{u}} {α : Type v} {β : Type w}
[Representation M α] [Representation M β] (a : PowObj (M := M) α β) : Prop :=
(In a.base R ∧ ∃ n : ℕ, In a.exponent N ∧ Same a.exponent (number (n : ℂ))) ∨
(In a.base C ∧ ∃ n : ℕ, In a.exponent N ∧ Same a.exponent (number (n : ℂ))) ∨
(In a.base C ∧ ∃ z : ℤ, In a.exponent Z ∧
¬ Same a.base (number 0) ∧ Same a.exponent (number (z : ℂ)))
private theorem pow_nat_closed {M : Semantics.{u}} {α : Type v} {β : Type w}
[Representation M α] [Representation M β]
(a : Obj (M := M) α) (e : Obj (M := M) β) (n : ℕ)
(haC : In a C) (heValue : Same e (number (n : ℂ))) :
M.mem (M.powValue (denote a) (denote e)) (M.standard .complex) := by
obtain ⟨x, hx⟩ := (M.complex_members (denote a)).mp haC
change denote e = M.number (n : ℂ) at heValue
exact (M.complex_members _).mpr ⟨x ^ n, by rw [hx, heValue, M.pow_numbers_nat]⟩
private theorem pow_int_closed {M : Semantics.{u}} {α : Type v} {β : Type w}
[Representation M α] [Representation M β]
(a : Obj (M := M) α) (e : Obj (M := M) β) (z : ℤ)
(haC : In a C) (ha0 : ¬ Same a (number 0))
(heValue : Same e (number (z : ℂ))) :
M.mem (M.powValue (denote a) (denote e)) (M.standard .complex) := by
obtain ⟨x, hx⟩ := (M.complex_members (denote a)).mp haC
have hx0 : x ≠ 0 := fun h => ha0 (hx.trans (congrArg M.number h))
change denote e = M.number (z : ℂ) at heValue
exact (M.complex_members _).mpr ⟨x ^ z, by rw [hx, heValue, M.pow_numbers_int x z hx0]⟩
instance powRepresentation {M : Semantics.{u}} {α : Type v} {β : Type w}
[Representation M α] [Representation M β] :
Representation M (PowObj (M := M) α β) where
wd := PowDomain
denote a := M.powValue (denote a.base) (denote a.exponent)
wd_isSet h := M.member_isSet (by
rcases h with ⟨haR, n, _heN, he⟩ | ⟨haC, n, _heN, he⟩ | ⟨haC, z, _heZ, ha0, he⟩
· exact pow_nat_closed _ _ n (realToComplex _ haR) he
· exact pow_nat_closed _ _ n haC he
· exact pow_int_closed _ _ z haC ha0 he)
instance addRepresentation {M : Semantics.{u}} {α : Type v} {β : Type w}
[Representation M α] [Representation M β] :
Representation M (AddObj (M := M) α β) where
wd a := In a.left C ∧ In a.right C
denote a := M.addValue (denote a.left) (denote a.right)
wd_isSet h := M.member_isSet (M.add_closed h.1 h.2)
instance divRepresentation {M : Semantics.{u}} {α : Type v} {β : Type w}
[Representation M α] [Representation M β] :
Representation M (DivObj (M := M) α β) where
wd a := In a.left C ∧ In a.right C ∧ ¬ Same a.right (number 0)
denote a := M.divValue (denote a.left) (denote a.right)
wd_isSet h := M.member_isSet
(M.div_closed h.1 h.2.1 h.2.2)
def add {M : Semantics.{u}} {α : Type v} {β : Type w}
[Representation M α] [Representation M β]
(a : Obj (M := M) α) (b : Obj (M := M) β)
(haC : In a C) (hbC : In b C) : Obj (M := M) (AddObj (M := M) α β) :=
⟨⟨a, b⟩, ⟨haC, hbC⟩⟩
def div {M : Semantics.{u}} {α : Type v} {β : Type w}
[Representation M α] [Representation M β]
(a : Obj (M := M) α) (b : Obj (M := M) β)
(haC : In a C) (hbC : In b C) (hb0 : ¬ Same b (number 0)) :
Obj (M := M) (DivObj (M := M) α β) :=
⟨⟨a, b⟩, ⟨haC, hbC, hb0⟩⟩
def sub {M : Semantics.{u}} {α : Type v} {β : Type w}
[Representation M α] [Representation M β]
(a : Obj (M := M) α) (b : Obj (M := M) β)
(haC : In a C) (hbC : In b C) : Obj (M := M) (SubObj (M := M) α β) :=
⟨⟨a, b⟩, ⟨haC, hbC⟩⟩
def mul {M : Semantics.{u}} {α : Type v} {β : Type w}
[Representation M α] [Representation M β]
(a : Obj (M := M) α) (b : Obj (M := M) β)
(haC : In a C) (hbC : In b C) : Obj (M := M) (MulObj (M := M) α β) :=
⟨⟨a, b⟩, ⟨haC, hbC⟩⟩
def neg {M : Semantics.{u}} {α : Type v} [Representation M α]
(a : Obj (M := M) α) (haC : In a C) : Obj (M := M) (NegObj (M := M) α) :=
⟨⟨a⟩, haC⟩
def powNatReal {M : Semantics.{u}} {α : Type v} {β : Type w}
[Representation M α] [Representation M β]
(a : Obj (M := M) α) (e : Obj (M := M) β) (n : ℕ)
(haR : In a R) (heN : In e N) (heValue : Same e (number (n : ℂ))) :
Obj (M := M) (PowObj (M := M) α β) :=
⟨⟨a, e⟩, Or.inl ⟨haR, n, heN, heValue⟩⟩
def powNat {M : Semantics.{u}} {α : Type v} {β : Type w}
[Representation M α] [Representation M β]
(a : Obj (M := M) α) (e : Obj (M := M) β) (n : ℕ)
(haC : In a C) (heN : In e N) (heValue : Same e (number (n : ℂ))) :
Obj (M := M) (PowObj (M := M) α β) :=
⟨⟨a, e⟩, Or.inr (Or.inl ⟨haC, n, heN, heValue⟩)⟩
def powInt {M : Semantics.{u}} {α : Type v} {β : Type w}
[Representation M α] [Representation M β]
(a : Obj (M := M) α) (e : Obj (M := M) β) (z : ℤ)
(haC : In a C) (heZ : In e Z) (ha0 : ¬ Same a (number 0))
(heValue : Same e (number (z : ℂ))) : Obj (M := M) (PowObj (M := M) α β) :=
⟨⟨a, e⟩, Or.inr (Or.inr ⟨haC, z, heZ, ha0, heValue⟩)⟩
def addInC {M : Semantics.{u}} {α : Type v} {β : Type w}
[Representation M α] [Representation M β]
(a : Obj (M := M) α) (b : Obj (M := M) β)
(haC : In a C) (hbC : In b C) : In (add a b haC hbC) C :=
M.add_closed haC hbC
def divInC {M : Semantics.{u}} {α : Type v} {β : Type w}
[Representation M α] [Representation M β]
(a : Obj (M := M) α) (b : Obj (M := M) β)
(haC : In a C) (hbC : In b C) (hb0 : ¬ Same b (number 0)) :
In (div a b haC hbC hb0) C :=
M.div_closed haC hbC hb0
def subInC {M : Semantics.{u}} {α : Type v} {β : Type w}
[Representation M α] [Representation M β]
(a : Obj (M := M) α) (b : Obj (M := M) β)
(haC : In a C) (hbC : In b C) : In (sub a b haC hbC) C :=
Semantics.sub_closed haC hbC
def mulInC {M : Semantics.{u}} {α : Type v} {β : Type w}
[Representation M α] [Representation M β]
(a : Obj (M := M) α) (b : Obj (M := M) β)
(haC : In a C) (hbC : In b C) : In (mul a b haC hbC) C :=
Semantics.mul_closed haC hbC
def negInC {M : Semantics.{u}} {α : Type v} [Representation M α]
(a : Obj (M := M) α) (haC : In a C) : In (neg a haC) C :=
Semantics.neg_closed haC
def powNatRealInC {M : Semantics.{u}} {α : Type v} {β : Type w}
[Representation M α] [Representation M β]
(a : Obj (M := M) α) (e : Obj (M := M) β) (n : ℕ)
(haR : In a R) (heN : In e N) (heValue : Same e (number (n : ℂ))) :
In (powNatReal a e n haR heN heValue) C :=
pow_nat_closed a e n (realToComplex a haR) heValue
def powNatInC {M : Semantics.{u}} {α : Type v} {β : Type w}
[Representation M α] [Representation M β]
(a : Obj (M := M) α) (e : Obj (M := M) β) (n : ℕ)
(haC : In a C) (heN : In e N) (heValue : Same e (number (n : ℂ))) :
In (powNat a e n haC heN heValue) C :=
pow_nat_closed a e n haC heValue
def powIntInC {M : Semantics.{u}} {α : Type v} {β : Type w}
[Representation M α] [Representation M β]
(a : Obj (M := M) α) (e : Obj (M := M) β) (z : ℤ)
(haC : In a C) (heZ : In e Z) (ha0 : ¬ Same a (number 0))
(heValue : Same e (number (z : ℂ))) : In (powInt a e z haC heZ ha0 heValue) C :=
pow_int_closed a e z haC ha0 heValue
/-- Replay the structural C-membership rule using its actual two children.
The parent's certified domain still determines whether zero bases are legal;
the structural integer representative is checked against that domain's exact
exponent value before the corresponding numeric law is applied. -/
theorem powStructuralInC {M : Semantics.{u}} {α : Type v} {β : Type w}
[Representation M α] [Representation M β]
(p : Obj (M := M) (PowObj (M := M) α β))
(haC : In p.val.base C) (heZ : In p.val.exponent Z) : In p C := by
obtain ⟨z, hz⟩ := (M.integer_members (denote p.val.exponent)).mp heZ
have hdom : PowDomain p.val := p.wd
change M.mem (M.powValue (denote p.val.base) (denote p.val.exponent))
(M.standard .complex)
rcases hdom with ⟨_haR, n, _heN, heValue⟩ |
⟨_wdC, n, _heN, heValue⟩ | ⟨_wdC, k, _heZ, ha0, heValue⟩
· change denote p.val.exponent = M.number (n : ℂ) at heValue
have agreement : (z : ℂ) = (n : ℂ) :=
M.number_injective (hz.symm.trans heValue)
exact pow_nat_closed p.val.base p.val.exponent n haC
(hz.trans (congrArg M.number agreement))
· change denote p.val.exponent = M.number (n : ℂ) at heValue
have agreement : (z : ℂ) = (n : ℂ) :=
M.number_injective (hz.symm.trans heValue)
exact pow_nat_closed p.val.base p.val.exponent n haC
(hz.trans (congrArg M.number agreement))
· change denote p.val.exponent = M.number (k : ℂ) at heValue
have agreement : (z : ℂ) = (k : ℂ) :=
M.number_injective (hz.symm.trans heValue)
exact pow_int_closed p.val.base p.val.exponent k haC ha0
(hz.trans (congrArg M.number agreement))
theorem addInR {M : Semantics.{u}} {α : Type v} {β : Type w}
[Representation M α] [Representation M β]
(a : Obj (M := M) α) (b : Obj (M := M) β) (haR : In a R) (hbR : In b R) :
In (add a b (realToComplex a haR) (realToComplex b hbR)) R := by
obtain ⟨x, hx⟩ := (M.real_members (denote a)).mp haR
obtain ⟨y, hy⟩ := (M.real_members (denote b)).mp hbR
exact (M.real_members _).mpr ⟨x + y, by
change M.addValue (denote a) (denote b) = _
rw [hx, hy, M.add_numbers, Complex.ofReal_add]⟩
theorem subInR {M : Semantics.{u}} {α : Type v} {β : Type w}
[Representation M α] [Representation M β]
(a : Obj (M := M) α) (b : Obj (M := M) β) (haR : In a R) (hbR : In b R) :
In (sub a b (realToComplex a haR) (realToComplex b hbR)) R := by
obtain ⟨x, hx⟩ := (M.real_members (denote a)).mp haR
obtain ⟨y, hy⟩ := (M.real_members (denote b)).mp hbR
exact (M.real_members _).mpr ⟨x - y, by
change M.subValue (denote a) (denote b) = _
rw [hx, hy, M.sub_numbers, Complex.ofReal_sub]⟩
theorem mulInR {M : Semantics.{u}} {α : Type v} {β : Type w}
[Representation M α] [Representation M β]
(a : Obj (M := M) α) (b : Obj (M := M) β) (haR : In a R) (hbR : In b R) :
In (mul a b (realToComplex a haR) (realToComplex b hbR)) R := by
obtain ⟨x, hx⟩ := (M.real_members (denote a)).mp haR
obtain ⟨y, hy⟩ := (M.real_members (denote b)).mp hbR
exact (M.real_members _).mpr ⟨x * y, by
change M.mulValue (denote a) (denote b) = _
rw [hx, hy, M.mul_numbers, Complex.ofReal_mul]⟩
theorem negInR {M : Semantics.{u}} {α : Type v} [Representation M α]
(a : Obj (M := M) α) (haR : In a R) : In (neg a (realToComplex a haR)) R := by
obtain ⟨x, hx⟩ := (M.real_members (denote a)).mp haR
exact (M.real_members _).mpr ⟨-x, by
change M.negValue (denote a) = _
rw [hx, M.neg_numbers, Complex.ofReal_neg]⟩
theorem divInR {M : Semantics.{u}} {α : Type v} {β : Type w}
[Representation M α] [Representation M β]
(a : Obj (M := M) α) (b : Obj (M := M) β)
(haR : In a R) (hbR : In b R) (hb0 : ¬ Same b (number 0)) :
In (div a b (realToComplex a haR) (realToComplex b hbR) hb0) R := by
obtain ⟨x, hx⟩ := (M.real_members (denote a)).mp haR
obtain ⟨y, hy⟩ := (M.real_members (denote b)).mp hbR
have hy0 : (y : ℂ) ≠ 0 := fun h => hb0 (hy.trans (congrArg M.number h))
exact (M.real_members _).mpr ⟨x / y, by
change M.divValue (denote a) (denote b) = _
rw [hx, hy, M.div_numbers _ _ hy0, Complex.ofReal_div]⟩
theorem addInN {M : Semantics.{u}} {α : Type v} {β : Type w}
[Representation M α] [Representation M β]
(a : Obj (M := M) α) (b : Obj (M := M) β) (haN : In a N) (hbN : In b N) :
In (add a b (naturalToComplex a haN) (naturalToComplex b hbN)) N := by
obtain ⟨x, hx⟩ := (M.natural_members (denote a)).mp haN
obtain ⟨y, hy⟩ := (M.natural_members (denote b)).mp hbN
exact (M.natural_members _).mpr ⟨x + y, by
change M.addValue (denote a) (denote b) = _
rw [hx, hy, M.add_numbers, Nat.cast_add]⟩
theorem addInQ {M : Semantics.{u}} {α : Type v} {β : Type w}
[Representation M α] [Representation M β]
(a : Obj (M := M) α) (b : Obj (M := M) β) (haQ : In a Q) (hbQ : In b Q) :
In (add a b (rationalToComplex a haQ) (rationalToComplex b hbQ)) Q := by
obtain ⟨x, hx⟩ := (M.rational_members (denote a)).mp haQ
obtain ⟨y, hy⟩ := (M.rational_members (denote b)).mp hbQ
exact (M.rational_members _).mpr ⟨x + y, by
change M.addValue (denote a) (denote b) = _
rw [hx, hy, M.add_numbers, Rat.cast_add]⟩
theorem subInQ {M : Semantics.{u}} {α : Type v} {β : Type w}
[Representation M α] [Representation M β]
(a : Obj (M := M) α) (b : Obj (M := M) β) (haQ : In a Q) (hbQ : In b Q) :
In (sub a b (rationalToComplex a haQ) (rationalToComplex b hbQ)) Q := by
obtain ⟨x, hx⟩ := (M.rational_members (denote a)).mp haQ
obtain ⟨y, hy⟩ := (M.rational_members (denote b)).mp hbQ
exact (M.rational_members _).mpr ⟨x - y, by
change M.subValue (denote a) (denote b) = _
rw [hx, hy, M.sub_numbers, Rat.cast_sub]⟩
theorem mulInQ {M : Semantics.{u}} {α : Type v} {β : Type w}
[Representation M α] [Representation M β]
(a : Obj (M := M) α) (b : Obj (M := M) β) (haQ : In a Q) (hbQ : In b Q) :
In (mul a b (rationalToComplex a haQ) (rationalToComplex b hbQ)) Q := by
obtain ⟨x, hx⟩ := (M.rational_members (denote a)).mp haQ
obtain ⟨y, hy⟩ := (M.rational_members (denote b)).mp hbQ
exact (M.rational_members _).mpr ⟨x * y, by
change M.mulValue (denote a) (denote b) = _
rw [hx, hy, M.mul_numbers, Rat.cast_mul]⟩
theorem negInQ {M : Semantics.{u}} {α : Type v} [Representation M α]
(a : Obj (M := M) α) (haQ : In a Q) :
In (neg a (rationalToComplex a haQ)) Q := by
obtain ⟨q, hq⟩ := (M.rational_members (denote a)).mp haQ
exact (M.rational_members _).mpr ⟨-q, by
change M.negValue (denote a) = _
rw [hq, M.neg_numbers, Rat.cast_neg]⟩
theorem divInQ {M : Semantics.{u}} {α : Type v} {β : Type w}
[Representation M α] [Representation M β]
(a : Obj (M := M) α) (b : Obj (M := M) β)
(haQ : In a Q) (hbQ : In b Q) (hb0 : ¬ Same b (number 0)) :
In (div a b (rationalToComplex a haQ) (rationalToComplex b hbQ) hb0) Q := by
obtain ⟨x, hx⟩ := (M.rational_members (denote a)).mp haQ
obtain ⟨y, hy⟩ := (M.rational_members (denote b)).mp hbQ
have hy0 : (y : ℂ) ≠ 0 := fun h => hb0 (hy.trans (congrArg M.number h))
exact (M.rational_members _).mpr ⟨x / y, by
change M.divValue (denote a) (denote b) = _
rw [hx, hy, M.div_numbers _ _ hy0, Rat.cast_div]⟩
theorem negInZ {M : Semantics.{u}} {α : Type v} [Representation M α]
(a : Obj (M := M) α) (haZ : In a Z) : In (neg a (integerToComplex a haZ)) Z := by
obtain ⟨z, hz⟩ := (M.integer_members (denote a)).mp haZ
exact (M.integer_members _).mpr ⟨-z, by
change M.negValue (denote a) = _
rw [hz, M.neg_numbers, Int.cast_neg]⟩
theorem powNatRealInR {M : Semantics.{u}} {α : Type v} {β : Type w}
[Representation M α] [Representation M β]
(a : Obj (M := M) α) (e : Obj (M := M) β) (n : ℕ)
(haR : In a R) (heN : In e N) (heValue : Same e (number (n : ℂ))) :
In (powNatReal a e n haR heN heValue) R := by
obtain ⟨x, hx⟩ := (M.real_members (denote a)).mp haR
change denote e = M.number (n : ℂ) at heValue
exact (M.real_members _).mpr ⟨x ^ n, by
change M.powValue (denote a) (denote e) = _
rw [hx, heValue, M.pow_numbers_nat, Complex.ofReal_pow]⟩
/-- Real closure consumes the owned power object's actual WD alternatives,
including their exact exponent witness and the integer branch's nonzero guard. -/
theorem powStructuralInR {M : Semantics.{u}} {α : Type v} {β : Type w}
[Representation M α] [Representation M β]
(p : Obj (M := M) (PowObj (M := M) α β)) (haR : In p.val.base R) : In p R := by
obtain ⟨r, hr⟩ := (M.real_members (denote p.val.base)).mp haR
rcases p.wd with ⟨_haR, n, _heN, he⟩ | ⟨_haC, n, _heN, he⟩ |
⟨_haC, z, _heZ, ha0, he⟩
· exact (M.real_members _).mpr ⟨r ^ n, by
change denote p.val.exponent = M.number (n : ℂ) at he
change M.powValue (denote p.val.base) (denote p.val.exponent) = _
rw [hr, he, M.pow_numbers_nat, Complex.ofReal_pow]⟩
· exact (M.real_members _).mpr ⟨r ^ n, by
change denote p.val.exponent = M.number (n : ℂ) at he
change M.powValue (denote p.val.base) (denote p.val.exponent) = _
rw [hr, he, M.pow_numbers_nat, Complex.ofReal_pow]⟩
· have hr0 : (r : ℂ) ≠ 0 := fun h => ha0 (hr.trans (congrArg M.number h))
exact (M.real_members _).mpr ⟨r ^ z, by
change denote p.val.exponent = M.number (z : ℂ) at he
change M.powValue (denote p.val.base) (denote p.val.exponent) = _
rw [hr, he, M.pow_numbers_int _ _ hr0, Complex.ofReal_zpow]⟩
theorem powStructuralInQ {M : Semantics.{u}} {α : Type v} {β : Type w}
[Representation M α] [Representation M β]
(p : Obj (M := M) (PowObj (M := M) α β)) (haQ : In p.val.base Q) : In p Q := by
obtain ⟨q, hq⟩ := (M.rational_members (denote p.val.base)).mp haQ
rcases p.wd with ⟨_haR, n, _heN, he⟩ | ⟨_haC, n, _heN, he⟩ |
⟨_haC, z, _heZ, ha0, he⟩
· exact (M.rational_members _).mpr ⟨q ^ n, by
change denote p.val.exponent = M.number (n : ℂ) at he
change M.powValue (denote p.val.base) (denote p.val.exponent) = _
rw [hq, he, M.pow_numbers_nat, Rat.cast_pow]⟩
· exact (M.rational_members _).mpr ⟨q ^ n, by
change denote p.val.exponent = M.number (n : ℂ) at he
change M.powValue (denote p.val.base) (denote p.val.exponent) = _
rw [hq, he, M.pow_numbers_nat, Rat.cast_pow]⟩
· have hq0 : (q : ℂ) ≠ 0 := fun h => ha0 (hq.trans (congrArg M.number h))
exact (M.rational_members _).mpr ⟨q ^ z, by
change denote p.val.exponent = M.number (z : ℂ) at he
change M.powValue (denote p.val.base) (denote p.val.exponent) = _
rw [hq, he, M.pow_numbers_int _ _ hq0, Rat.cast_zpow]⟩
end Litex
namespace Litex
/-- A proved arithmetic law; this is not yet a replay of a Rust verifier result. -/
theorem addZero {M : Semantics.{u}} {α : Type v} [Representation M α]
(a : Obj (M := M) α) (haC : In a C) :
Same (add a (number 0) haC (numberInC 0)) a := by
obtain ⟨z, hz⟩ := (M.complex_members (denote a)).mp haC
change M.addValue (denote a) (M.number 0) = denote a
rw [hz, M.add_numbers, add_zero]
end Litex
namespace Litex.NativeBridge
variable {M : Semantics.{u}}
theorem denoteNumber (z : ℂ) : denote (number (M := M) z) = M.number z := rfl
theorem sameOfDenoteNumber {α : Type v} {β : Type w}
[Representation M α] [Representation M β]
(a : Obj (M := M) α) (b : Obj (M := M) β) (x y : ℂ)
(ha : denote a = M.number x) (hb : denote b = M.number y)
(hxy : x = y) : Same a b :=
ha.trans ((congrArg M.number hxy).trans hb.symm)
/-- Equality eliminates to native complex values only after both objects have
faithful numeric denotation witnesses. The objects' host carriers stay generic. -/
theorem nativeEqOfDenoteNumber {α : Type v} {β : Type w}
[Representation M α] [Representation M β]
(a : Obj (M := M) α) (b : Obj (M := M) β) (x y : ℂ)
(ha : denote a = M.number x) (hb : denote b = M.number y)
(hSame : Same a b) : x = y :=
M.number_injective (ha.symm.trans (hSame.trans hb))
theorem nativeNonzeroOfDenote {α : Type v} [Representation M α]
(a : Obj (M := M) α) (x : ℂ) (ha : denote a = M.number x)
(ha0 : ¬ Same a (number 0)) : x ≠ 0 :=
fun hx => ha0 (ha.trans (congrArg M.number hx))
theorem notSameOfNativeNonzero {α : Type v} [Representation M α]
(a : Obj (M := M) α) (x : ℂ) (ha : denote a = M.number x)
(hx0 : x ≠ 0) : ¬ Same a (number 0) := by
intro h
exact hx0 (M.number_injective (ha.symm.trans h))
theorem notSameOfDenoteNumber {α : Type v} {β : Type w}
[Representation M α] [Representation M β]
(a : Obj (M := M) α) (b : Obj (M := M) β) (x y : ℂ)
(ha : denote a = M.number x) (hb : denote b = M.number y)
(hxy : x ≠ y) : ¬ Same a b :=
fun h => hxy (M.number_injective (ha.symm.trans (h.trans hb)))
theorem inOfDenoteNumber {α : Type v} {β : Type w}
[Representation M α] [Representation M β]
(a : Obj (M := M) α) (x : ℂ) (A : Obj (M := M) β)
(ha : denote a = M.number x) (hxA : In (number x) A) : In a A := by
change M.mem (denote a) (denote A)
rw [ha]
exact hxA
def numberInR (r : ℝ) : In (number (M := M) (r : ℂ)) R :=
(M.real_members (M.number (r : ℂ))).mpr ⟨r, rfl⟩
def numberInN (n : ℕ) : In (number (M := M) (n : ℂ)) N :=
(M.natural_members (M.number (n : ℂ))).mpr ⟨n, rfl⟩
def numberInZ (z : ℤ) : In (number (M := M) (z : ℂ)) Z :=
(M.integer_members (M.number (z : ℂ))).mpr ⟨z, rfl⟩
def numberInQ (q : ℚ) : In (number (M := M) (q : ℂ)) Q :=
(M.rational_members (M.number (q : ℂ))).mpr ⟨q, rfl⟩
def numberInROfEq (z : ℂ) (r : ℝ) (hz : z = (r : ℂ)) : In (number (M := M) z) R :=
(M.real_members (M.number z)).mpr ⟨r, congrArg M.number hz⟩
def numberInNOfEq (z : ℂ) (n : ℕ) (hz : z = (n : ℂ)) : In (number (M := M) z) N :=
(M.natural_members (M.number z)).mpr ⟨n, congrArg M.number hz⟩
def numberInZOfEq (z : ℂ) (k : ℤ) (hz : z = (k : ℂ)) : In (number (M := M) z) Z :=
(M.integer_members (M.number z)).mpr ⟨k, congrArg M.number hz⟩
def numberInQOfEq (z : ℂ) (q : ℚ) (hz : z = (q : ℂ)) : In (number (M := M) z) Q :=
(M.rational_members (M.number z)).mpr ⟨q, congrArg M.number hz⟩
theorem numberRationalInQ (n d : ℤ) :
In (number (M := M) ((n : ℂ) / (d : ℂ))) Q := by
apply numberInQOfEq _ ((n : ℚ) / (d : ℚ))
simp only [Rat.cast_div, Rat.cast_intCast]
theorem numberRationalInR (n d : ℤ) :
In (number (M := M) ((n : ℂ) / (d : ℂ))) R := by
apply numberInROfEq _ ((n : ℝ) / (d : ℝ))
simp only [Complex.ofReal_div, Complex.ofReal_intCast]
theorem denoteAdd {α : Type v} {β : Type w}
[Representation M α] [Representation M β]
(a : Obj (M := M) α) (b : Obj (M := M) β)
(haC : In a C) (hbC : In b C) (x y : ℂ)
(ha : denote a = M.number x) (hb : denote b = M.number y) :
denote (add a b haC hbC) = M.number (x + y) := by
change M.addValue (denote a) (denote b) = _
rw [ha, hb, M.add_numbers]
theorem denoteSub {α : Type v} {β : Type w}
[Representation M α] [Representation M β]
(a : Obj (M := M) α) (b : Obj (M := M) β)
(haC : In a C) (hbC : In b C) (x y : ℂ)
(ha : denote a = M.number x) (hb : denote b = M.number y) :
denote (sub a b haC hbC) = M.number (x - y) := by
change M.subValue (denote a) (denote b) = _
rw [ha, hb, M.sub_numbers]
theorem denoteMul {α : Type v} {β : Type w}
[Representation M α] [Representation M β]
(a : Obj (M := M) α) (b : Obj (M := M) β)
(haC : In a C) (hbC : In b C) (x y : ℂ)
(ha : denote a = M.number x) (hb : denote b = M.number y) :
denote (mul a b haC hbC) = M.number (x * y) := by
change M.mulValue (denote a) (denote b) = _
rw [ha, hb, M.mul_numbers]
theorem denoteNeg {α : Type v} [Representation M α]
(a : Obj (M := M) α) (haC : In a C) (x : ℂ)
(ha : denote a = M.number x) : denote (neg a haC) = M.number (-x) := by
change M.negValue (denote a) = _
rw [ha, M.neg_numbers]
theorem denoteDiv {α : Type v} {β : Type w}
[Representation M α] [Representation M β]
(a : Obj (M := M) α) (b : Obj (M := M) β)
(haC : In a C) (hbC : In b C) (hb0 : ¬ Same b (number 0)) (x y : ℂ)
(ha : denote a = M.number x) (hb : denote b = M.number y) :
denote (div a b haC hbC hb0) = M.number (x / y) := by
change M.divValue (denote a) (denote b) = _
rw [ha, hb, M.div_numbers x y (nativeNonzeroOfDenote b y hb hb0)]
theorem denotePowNatReal {α : Type v} {β : Type w}
[Representation M α] [Representation M β]
(a : Obj (M := M) α) (e : Obj (M := M) β) (n : ℕ)
(haR : In a R) (heN : In e N) (heValue : Same e (number (n : ℂ)))
(x : ℂ) (ha : denote a = M.number x) :
denote (powNatReal a e n haR heN heValue) = M.number (x ^ n) := by
change denote e = M.number (n : ℂ) at heValue
change M.powValue (denote a) (denote e) = _
rw [ha, heValue, M.pow_numbers_nat]
theorem denotePowNat {α : Type v} {β : Type w}
[Representation M α] [Representation M β]
(a : Obj (M := M) α) (e : Obj (M := M) β) (n : ℕ)
(haC : In a C) (heN : In e N) (heValue : Same e (number (n : ℂ)))
(x : ℂ) (ha : denote a = M.number x) :
denote (powNat a e n haC heN heValue) = M.number (x ^ n) := by
change denote e = M.number (n : ℂ) at heValue
change M.powValue (denote a) (denote e) = _
rw [ha, heValue, M.pow_numbers_nat]
theorem denotePowInt {α : Type v} {β : Type w}
[Representation M α] [Representation M β]
(a : Obj (M := M) α) (e : Obj (M := M) β) (z : ℤ)
(haC : In a C) (heZ : In e Z) (ha0 : ¬ Same a (number 0))
(heValue : Same e (number (z : ℂ))) (x : ℂ) (ha : denote a = M.number x) :
denote (powInt a e z haC heZ ha0 heValue) = M.number (x ^ z) := by
change denote e = M.number (z : ℂ) at heValue
change M.powValue (denote a) (denote e) = _
rw [ha, heValue, M.pow_numbers_int x z (nativeNonzeroOfDenote a x ha ha0)]
theorem complexEq {z w : ℂ}
(h : Same (number (M := M) z) (number w)) : z = w :=
M.number_injective h
def numberNonzero (z : ℂ) (hz : z ≠ 0) :
¬ Same (number (M := M) z) (number 0) :=
fun h => hz (complexEq h)
theorem addSame_iff (x y z : ℂ) :
Same (add (number (M := M) x) (number y) (numberInC x) (numberInC y))
(number z) ↔ x + y = z := by
change M.addValue (M.number x) (M.number y) = M.number z ↔ x + y = z
rw [M.add_numbers]
exact M.number_injective.eq_iff
theorem divSame_iff (x y z : ℂ) (hy : y ≠ 0) :
Same (div (number (M := M) x) (number y)
(numberInC x) (numberInC y) (numberNonzero y hy))
(number z) ↔ x / y = z := by
change M.divValue (M.number x) (M.number y) = M.number z ↔ x / y = z
rw [M.div_numbers x y hy]
exact M.number_injective.eq_iff
noncomputable def asComplex {α : Type v} [Representation M α]
(a : Obj (M := M) α) (haC : In a C) : ℂ :=
Classical.choose ((M.complex_members (denote a)).mp haC)
theorem asComplex_spec {α : Type v} [Representation M α]
(a : Obj (M := M) α) (haC : In a C) :
denote a = M.number (asComplex a haC) :=
Classical.choose_spec ((M.complex_members (denote a)).mp haC)
theorem asComplex_proofIndependent {α : Type v} [Representation M α]
(a : Obj (M := M) α) (h₁ h₂ : In a C) :
asComplex a h₁ = asComplex a h₂ :=
M.number_injective ((asComplex_spec a h₁).symm.trans (asComplex_spec a h₂))
theorem same_iff_asComplex {α : Type v} {β : Type w}
[Representation M α] [Representation M β]
(a : Obj (M := M) α) (b : Obj (M := M) β) (haC : In a C) (hbC : In b C) :
Same a b ↔ asComplex a haC = asComplex b hbC := by
change denote a = denote b ↔ _
rw [asComplex_spec a haC, asComplex_spec b hbC]
exact M.number_injective.eq_iff
noncomputable def asReal {α : Type v} [Representation M α]
(a : Obj (M := M) α) (haR : In a R) : ℝ :=
Classical.choose ((M.real_members (denote a)).mp haR)
theorem asReal_spec {α : Type v} [Representation M α]
(a : Obj (M := M) α) (haR : In a R) :
denote a = M.number (asReal a haR : ℂ) :=
Classical.choose_spec ((M.real_members (denote a)).mp haR)
theorem asReal_proofIndependent {α : Type v} [Representation M α]
(a : Obj (M := M) α) (h₁ h₂ : In a R) :
asReal a h₁ = asReal a h₂ :=
Complex.ofReal_injective
(M.number_injective ((asReal_spec a h₁).symm.trans (asReal_spec a h₂)))
theorem asComplex_eq_asReal {α : Type v} [Representation M α]
(a : Obj (M := M) α) (haC : In a C) (haR : In a R) :
asComplex a haC = (asReal a haR : ℂ) :=
M.number_injective ((asComplex_spec a haC).symm.trans (asReal_spec a haR))
/-- A complex representative of a source-real object is its native real part.
The real-membership evidence is essential; this is not a global complex cast. -/
theorem denoteRealOfDenoteNumber {α : Type v} [Representation M α]
(a : Obj (M := M) α) (z : ℂ) (haR : In a R)
(ha : denote a = M.number z) : denote a = M.number (z.re : ℂ) := by
obtain ⟨r, hr⟩ := (M.real_members (denote a)).mp haR
have hz : z = (r : ℂ) := M.number_injective (ha.symm.trans hr)
simpa only [hz, Complex.ofReal_re] using hr
theorem leOfDenoteReal {α : Type v} {β : Type w}
[Representation M α] [Representation M β]
(a : Obj (M := M) α) (b : Obj (M := M) β) (r s : ℝ)
(ha : denote a = M.number (r : ℂ)) (hb : denote b = M.number (s : ℂ))
(h : r ≤ s) : Le a b :=
⟨r, s, ha, hb, h⟩
theorem ltOfDenoteReal {α : Type v} {β : Type w}
[Representation M α] [Representation M β]
(a : Obj (M := M) α) (b : Obj (M := M) β) (r s : ℝ)
(ha : denote a = M.number (r : ℂ)) (hb : denote b = M.number (s : ℂ))
(h : r < s) : Lt a b :=
⟨r, s, ha, hb, h⟩
theorem le_iff_ofDenoteReal {α : Type v} {β : Type w}
[Representation M α] [Representation M β]
(a : Obj (M := M) α) (b : Obj (M := M) β) (r s : ℝ)
(ha : denote a = M.number (r : ℂ)) (hb : denote b = M.number (s : ℂ)) :
Le a b ↔ r ≤ s := by
constructor
· rintro ⟨r', s', ha', hb', h⟩
have hr : r' = r := Complex.ofReal_injective (M.number_injective (ha'.symm.trans ha))
have hs : s' = s := Complex.ofReal_injective (M.number_injective (hb'.symm.trans hb))
simpa only [hr, hs] using h
· exact leOfDenoteReal a b r s ha hb
theorem lt_iff_ofDenoteReal {α : Type v} {β : Type w}
[Representation M α] [Representation M β]
(a : Obj (M := M) α) (b : Obj (M := M) β) (r s : ℝ)
(ha : denote a = M.number (r : ℂ)) (hb : denote b = M.number (s : ℂ)) :
Lt a b ↔ r < s := by
constructor
· rintro ⟨r', s', ha', hb', h⟩
have hr : r' = r := Complex.ofReal_injective (M.number_injective (ha'.symm.trans ha))
have hs : s' = s := Complex.ofReal_injective (M.number_injective (hb'.symm.trans hb))
simpa only [hr, hs] using h
· exact ltOfDenoteReal a b r s ha hb
theorem le_iff_asReal {α : Type v} {β : Type w}
[Representation M α] [Representation M β]
(a : Obj (M := M) α) (b : Obj (M := M) β) (haR : In a R) (hbR : In b R) :
Le a b ↔ asReal a haR ≤ asReal b hbR :=
le_iff_ofDenoteReal a b _ _ (asReal_spec a haR) (asReal_spec b hbR)
theorem lt_iff_asReal {α : Type v} {β : Type w}
[Representation M α] [Representation M β]
(a : Obj (M := M) α) (b : Obj (M := M) β) (haR : In a R) (hbR : In b R) :
Lt a b ↔ asReal a haR < asReal b hbR :=
lt_iff_ofDenoteReal a b _ _ (asReal_spec a haR) (asReal_spec b hbR)
end Litex.NativeBridge
namespace Litex
theorem addCancelRightRight {M : Semantics.{u}}
{α : Type v} {β : Type w} {γ : Type x}
[Representation M α] [Representation M β] [Representation M γ]
(a : Obj (M := M) α) (b : Obj (M := M) β) (k : Obj (M := M) γ)
(ha : In a C) (hb : In b C) (hk : In k C)
(h : Same (add a k ha hk) (add b k hb hk)) : Same a b := by
change M.addValue (denote a) (denote k) = M.addValue (denote b) (denote k) at h
rw [NativeBridge.asComplex_spec a ha, NativeBridge.asComplex_spec b hb,
NativeBridge.asComplex_spec k hk, M.add_numbers, M.add_numbers] at h
exact (NativeBridge.same_iff_asComplex a b ha hb).mpr
(add_right_cancel (M.number_injective h))
theorem addCancelRightLeft {M : Semantics.{u}}
{α : Type v} {β : Type w} {γ : Type x}
[Representation M α] [Representation M β] [Representation M γ]
(a : Obj (M := M) α) (b : Obj (M := M) β) (k : Obj (M := M) γ)
(ha : In a C) (hb : In b C) (hk : In k C)
(h : Same (add a k ha hk) (add k b hk hb)) : Same a b := by
change M.addValue (denote a) (denote k) = M.addValue (denote k) (denote b) at h
rw [NativeBridge.asComplex_spec a ha, NativeBridge.asComplex_spec b hb,
NativeBridge.asComplex_spec k hk, M.add_numbers, M.add_numbers] at h
have he := M.number_injective h
rw [add_comm (NativeBridge.asComplex k hk) (NativeBridge.asComplex b hb)] at he
exact (NativeBridge.same_iff_asComplex a b ha hb).mpr (add_right_cancel he)
theorem addCancelLeftRight {M : Semantics.{u}}
{α : Type v} {β : Type w} {γ : Type x}
[Representation M α] [Representation M β] [Representation M γ]
(a : Obj (M := M) α) (b : Obj (M := M) β) (k : Obj (M := M) γ)
(ha : In a C) (hb : In b C) (hk : In k C)
(h : Same (add k a hk ha) (add b k hb hk)) : Same a b := by
change M.addValue (denote k) (denote a) = M.addValue (denote b) (denote k) at h
rw [NativeBridge.asComplex_spec a ha, NativeBridge.asComplex_spec b hb,
NativeBridge.asComplex_spec k hk, M.add_numbers, M.add_numbers] at h
have he := M.number_injective h
rw [add_comm (NativeBridge.asComplex k hk) (NativeBridge.asComplex a ha)] at he
exact (NativeBridge.same_iff_asComplex a b ha hb).mpr (add_right_cancel he)
theorem addCancelLeftLeft {M : Semantics.{u}}
{α : Type v} {β : Type w} {γ : Type x}
[Representation M α] [Representation M β] [Representation M γ]
(a : Obj (M := M) α) (b : Obj (M := M) β) (k : Obj (M := M) γ)
(ha : In a C) (hb : In b C) (hk : In k C)
(h : Same (add k a hk ha) (add k b hk hb)) : Same a b := by
change M.addValue (denote k) (denote a) = M.addValue (denote k) (denote b) at h
rw [NativeBridge.asComplex_spec a ha, NativeBridge.asComplex_spec b hb,
NativeBridge.asComplex_spec k hk, M.add_numbers, M.add_numbers] at h
exact (NativeBridge.same_iff_asComplex a b ha hb).mpr
(add_left_cancel (M.number_injective h))
theorem leOfSame {M : Semantics.{u}} {α : Type v} {β : Type w}
{γ : Type x} {δ : Type*}
[Representation M α] [Representation M β]
[Representation M γ] [Representation M δ]
(a : Obj (M := M) α) (b : Obj (M := M) β)
(c : Obj (M := M) γ) (d : Obj (M := M) δ)
(hab : Same a b) (hcd : Same c d) (hac : Le a c) : Le b d := by
obtain ⟨r, s, hr, hs, h⟩ := hac
exact ⟨r, s, hab.symm.trans hr, hcd.symm.trans hs, h⟩
theorem ltOfSame {M : Semantics.{u}} {α : Type v} {β : Type w}
{γ : Type x} {δ : Type*}
[Representation M α] [Representation M β]
[Representation M γ] [Representation M δ]
(a : Obj (M := M) α) (b : Obj (M := M) β)
(c : Obj (M := M) γ) (d : Obj (M := M) δ)
(hab : Same a b) (hcd : Same c d) (hac : Lt a c) : Lt b d := by
obtain ⟨r, s, hr, hs, h⟩ := hac
exact ⟨r, s, hab.symm.trans hr, hcd.symm.trans hs, h⟩
theorem leRefl {M : Semantics.{u}} {α : Type v} [Representation M α]
(a : Obj (M := M) α) (haR : In a R) : Le a a := by
obtain ⟨r, hr⟩ := (M.real_members (denote a)).mp haR
exact ⟨r, r, hr, hr, le_refl r⟩
theorem naturalNonnegative {M : Semantics.{u}} {α : Type v} [Representation M α]
(a : Obj (M := M) α) (haN : In a N) : Le (number 0) a := by
obtain ⟨n, hn⟩ := (M.natural_members (denote a)).mp haN
refine ⟨0, (n : ℝ), ?_, ?_, Nat.cast_nonneg n⟩
· simp only [denote, number, Representation.denote, Complex.ofReal_zero]
· simpa only [Complex.ofReal_natCast] using hn
theorem ltToLe {M : Semantics.{u}} {α : Type v} {β : Type w}
[Representation M α] [Representation M β]
(a : Obj (M := M) α) (b : Obj (M := M) β) (hab : Lt a b) : Le a b := by
obtain ⟨r, s, hr, hs, h⟩ := hab
exact ⟨r, s, hr, hs, le_of_lt h⟩
theorem ltNotSame {M : Semantics.{u}} {α : Type v} {β : Type w}
[Representation M α] [Representation M β]
(a : Obj (M := M) α) (b : Obj (M := M) β) (hab : Lt a b) : ¬ Same a b := by
obtain ⟨r, s, hr, hs, h⟩ := hab
intro equal
exact (ne_of_lt h)
(Complex.ofReal_injective (M.number_injective (hr.symm.trans (equal.trans hs))))
theorem leTrans {M : Semantics.{u}} {α : Type v} {β : Type w} {γ : Type x}
[Representation M α] [Representation M β] [Representation M γ]
(a : Obj (M := M) α) (b : Obj (M := M) β) (c : Obj (M := M) γ)
(hab : Le a b) (hbc : Le b c) : Le a c := by
obtain ⟨r, s, hr, hs, hrs⟩ := hab
obtain ⟨s', t, hs', ht, hst⟩ := hbc
have middle : s = s' := Complex.ofReal_injective (M.number_injective (hs.symm.trans hs'))
exact ⟨r, t, hr, ht, le_trans hrs (middle ▸ hst)⟩
theorem leAdd {M : Semantics.{u}} {α : Type v} {β : Type w}
{γ : Type x} {δ : Type*}
[Representation M α] [Representation M β]
[Representation M γ] [Representation M δ]
(a : Obj (M := M) α) (b : Obj (M := M) β)
(c : Obj (M := M) γ) (d : Obj (M := M) δ)
(haC : In a C) (hbC : In b C) (hcC : In c C) (hdC : In d C)
(hab : Le a b) (hcd : Le c d) :
Le (add a c haC hcC) (add b d hbC hdC) := by
obtain ⟨r, s, hr, hs, hrs⟩ := hab
obtain ⟨t, v, ht, hv, htv⟩ := hcd
refine ⟨r + t, s + v, ?_, ?_, add_le_add hrs htv⟩
· change M.addValue (denote a) (denote c) = _
rw [hr, ht, M.add_numbers, Complex.ofReal_add]
· change M.addValue (denote b) (denote d) = _
rw [hs, hv, M.add_numbers, Complex.ofReal_add]
theorem leAddRight {M : Semantics.{u}} {α : Type v} {β : Type w} {γ : Type x}
[Representation M α] [Representation M β] [Representation M γ]
(a : Obj (M := M) α) (b : Obj (M := M) β) (c : Obj (M := M) γ)
(haC : In a C) (hbC : In b C) (hcC : In c C) (hcR : In c R)
(hab : Le a b) : Le (add a c haC hcC) (add b c hbC hcC) :=
leAdd a b c c haC hbC hcC hcC hab (leRefl c hcR)
theorem leAddLeft {M : Semantics.{u}} {α : Type v} {β : Type w} {γ : Type x}
[Representation M α] [Representation M β] [Representation M γ]
(a : Obj (M := M) α) (b : Obj (M := M) β) (c : Obj (M := M) γ)
(haC : In a C) (hbC : In b C) (hcC : In c C) (hcR : In c R)
(hab : Le a b) : Le (add c a hcC haC) (add c b hcC hbC) :=
leAdd c c a b hcC hcC haC hbC (leRefl c hcR) hab
theorem mulSelfNonnegative {M : Semantics.{u}} {α : Type v} [Representation M α]
(a : Obj (M := M) α) (haR : In a R) :
Le (number 0) (mul a a (realToComplex a haR) (realToComplex a haR)) := by
obtain ⟨r, hr⟩ := (M.real_members (denote a)).mp haR
refine ⟨0, r * r, ?_, ?_, mul_self_nonneg r⟩
· simp only [denote, number, Representation.denote, Complex.ofReal_zero]
· change M.mulValue (denote a) (denote a) = _
rw [hr, M.mul_numbers, Complex.ofReal_mul]
/-- Replay the exact even natural exponent independently of which supported
power WD alternative certified the owned object. -/
theorem powStructuralNonnegativeOfEven {M : Semantics.{u}} {α : Type v} {β : Type w}
[Representation M α] [Representation M β]
(p : Obj (M := M) (PowObj (M := M) α β)) (haR : In p.val.base R)
(n : ℕ) (heValue : Same p.val.exponent (number (n : ℂ))) (hEven : Even n) :
Le (number 0) p := by
obtain ⟨r, hr⟩ := (M.real_members (denote p.val.base)).mp haR
refine ⟨0, r ^ n, ?_, ?_, hEven.pow_nonneg r⟩
· simp only [denote, number, Representation.denote, Complex.ofReal_zero]
· change denote p.val.exponent = M.number (n : ℂ) at heValue
change M.powValue (denote p.val.base) (denote p.val.exponent) = _
rw [hr, heValue, M.pow_numbers_nat, Complex.ofReal_pow]
theorem mulNonzero {M : Semantics.{u}} {α : Type v} {β : Type w}
[Representation M α] [Representation M β]
(a : Obj (M := M) α) (b : Obj (M := M) β)
(haC : In a C) (hbC : In b C)
(ha0 : ¬ Same a (number 0)) (hb0 : ¬ Same b (number 0)) :
¬ Same (mul a b haC hbC) (number 0) := by
let x := NativeBridge.asComplex a haC
let y := NativeBridge.asComplex b hbC
have hx := NativeBridge.asComplex_spec a haC
have hy := NativeBridge.asComplex_spec b hbC
exact NativeBridge.notSameOfNativeNonzero _ (x * y)
(NativeBridge.denoteMul a b haC hbC x y hx hy)
(mul_ne_zero (NativeBridge.nativeNonzeroOfDenote a x hx ha0)
(NativeBridge.nativeNonzeroOfDenote b y hy hb0))
end Litex
namespace Litex.NumericModel
/-- An example-only encoding through a chosen well-order, not a selected
production representation of Litex numbers. -/
noncomputable def codeComplex (z : ℂ) : ZFSet.{0} :=
Ordinal.toZFSet (Ordinal.typein (@WellOrderingRel ℂ) z)
theorem codeComplex_injective : Function.Injective codeComplex := by
intro x y h
exact Ordinal.typein_injective (@WellOrderingRel ℂ)
(Ordinal.toZFSet_injective h)
/-- Decode an encoded complex value. The zero branch merely totalizes this
example model outside C; the public arithmetic constructors require C-membership
and never authorize that branch as the meaning of an arbitrary object. -/
noncomputable def decodeComplex (x : ZFSet.{0}) : ℂ := by
classical
exact if h : ∃ z : ℂ, codeComplex z = x then Classical.choose h else 0
@[simp] theorem decodeComplex_codeComplex (z : ℂ) :
decodeComplex (codeComplex z) = z := by
classical
have h : ∃ w : ℂ, codeComplex w = codeComplex z := ⟨z, rfl⟩
unfold decodeComplex
rw [dif_pos h]
exact codeComplex_injective (Classical.choose_spec h)
/-- All five standard sets are actual ZF sets of the corresponding embedded
native numbers. No standard-set tag stands for the whole semantic universe. -/
noncomputable def standardSet : StandardSetValue → ZFSet.{0}
| .natural => ZFSet.range (fun n : ℕ => codeComplex (n : ℂ))
| .integer => ZFSet.range (fun n : ℤ => codeComplex (n : ℂ))
| .rational => ZFSet.range (fun q : ℚ => codeComplex (q : ℂ))
| .real => ZFSet.range (fun r : ℝ => codeComplex (r : ℂ))
| .complex => ZFSet.range codeComplex
theorem complex_members (x : ZFSet.{0}) :
x ∈ standardSet .complex ↔ ∃ z : ℂ, x = codeComplex z := by
simp only [standardSet, ZFSet.mem_range]
constructor
· rintro ⟨z, hz⟩
exact ⟨z, hz.symm⟩
· rintro ⟨z, hz⟩
exact ⟨z, hz.symm⟩
theorem natural_members (x : ZFSet.{0}) :
x ∈ standardSet .natural ↔ ∃ n : ℕ, x = codeComplex (n : ℂ) := by
simp only [standardSet, ZFSet.mem_range]
constructor
· rintro ⟨n, hn⟩
exact ⟨n, hn.symm⟩
· rintro ⟨n, hn⟩
exact ⟨n, hn.symm⟩
theorem integer_members (x : ZFSet.{0}) :
x ∈ standardSet .integer ↔ ∃ z : ℤ, x = codeComplex (z : ℂ) := by
simp only [standardSet, ZFSet.mem_range]
constructor
· rintro ⟨z, hz⟩
exact ⟨z, hz.symm⟩
· rintro ⟨z, hz⟩
exact ⟨z, hz.symm⟩
theorem rational_members (x : ZFSet.{0}) :
x ∈ standardSet .rational ↔ ∃ q : ℚ, x = codeComplex (q : ℂ) := by
simp only [standardSet, ZFSet.mem_range]
constructor
· rintro ⟨q, hq⟩
exact ⟨q, hq.symm⟩
· rintro ⟨q, hq⟩
exact ⟨q, hq.symm⟩
theorem real_members (x : ZFSet.{0}) :
x ∈ standardSet .real ↔ ∃ r : ℝ, x = codeComplex (r : ℂ) := by
simp only [standardSet, ZFSet.mem_range]
constructor
· rintro ⟨r, hr⟩
exact ⟨r, hr.symm⟩
· rintro ⟨r, hr⟩
exact ⟨r, hr.symm⟩
theorem real_subset_complex (x : ZFSet.{0})
(hx : x ∈ standardSet .real) : x ∈ standardSet .complex := by
obtain ⟨r, rfl⟩ := (real_members x).mp hx
exact (complex_members (codeComplex (r : ℂ))).mpr ⟨(r : ℂ), rfl⟩
noncomputable def addValue (a b : ZFSet.{0}) : ZFSet.{0} :=
codeComplex (decodeComplex a + decodeComplex b)
noncomputable def subValue (a b : ZFSet.{0}) : ZFSet.{0} :=
codeComplex (decodeComplex a - decodeComplex b)
noncomputable def mulValue (a b : ZFSet.{0}) : ZFSet.{0} :=
codeComplex (decodeComplex a * decodeComplex b)
noncomputable def negValue (a : ZFSet.{0}) : ZFSet.{0} :=
codeComplex (-decodeComplex a)
noncomputable def divValue (a b : ZFSet.{0}) : ZFSet.{0} :=
codeComplex (decodeComplex a / decodeComplex b)
/-- Totalization outside the certified integer-power domain belongs only to
this explicit candidate model. The public constructor retains the exponent
object and evidence identifying it with an exact integer. -/
noncomputable def powValue (a e : ZFSet.{0}) : ZFSet.{0} :=
codeComplex (decodeComplex a ^ (⌊(decodeComplex e).re⌋ : ℤ))
theorem add_numbers (a b : ℂ) :
addValue (codeComplex a) (codeComplex b) = codeComplex (a + b) := by
simp only [addValue, decodeComplex_codeComplex]
theorem sub_numbers (a b : ℂ) :
subValue (codeComplex a) (codeComplex b) = codeComplex (a - b) := by
simp only [subValue, decodeComplex_codeComplex]
theorem mul_numbers (a b : ℂ) :
mulValue (codeComplex a) (codeComplex b) = codeComplex (a * b) := by
simp only [mulValue, decodeComplex_codeComplex]
theorem neg_numbers (a : ℂ) :
negValue (codeComplex a) = codeComplex (-a) := by
simp only [negValue, decodeComplex_codeComplex]
theorem div_numbers (a b : ℂ) (_hb : b ≠ 0) :
divValue (codeComplex a) (codeComplex b) = codeComplex (a / b) := by
simp only [divValue, decodeComplex_codeComplex]
theorem pow_numbers_nat (a : ℂ) (n : ℕ) :
powValue (codeComplex a) (codeComplex (n : ℂ)) = codeComplex (a ^ n) := by
simp only [powValue, decodeComplex_codeComplex, Complex.natCast_re, Int.floor_natCast,
zpow_natCast]
theorem pow_numbers_int (a : ℂ) (z : ℤ) (_ha : a ≠ 0) :
powValue (codeComplex a) (codeComplex (z : ℂ)) = codeComplex (a ^ z) := by
simp only [powValue, decodeComplex_codeComplex, Complex.intCast_re, Int.floor_intCast]
theorem add_closed {a b : ZFSet.{0}}
(ha : a ∈ standardSet .complex) (hb : b ∈ standardSet .complex) :
addValue a b ∈ standardSet .complex := by
obtain ⟨x, rfl⟩ := (complex_members a).mp ha
obtain ⟨y, rfl⟩ := (complex_members b).mp hb
exact (complex_members _).mpr ⟨x + y, add_numbers x y⟩
theorem div_closed {a b : ZFSet.{0}}
(ha : a ∈ standardSet .complex) (hb : b ∈ standardSet .complex)
(hb0 : b ≠ codeComplex 0) : divValue a b ∈ standardSet .complex := by
obtain ⟨x, rfl⟩ := (complex_members a).mp ha
obtain ⟨y, rfl⟩ := (complex_members b).mp hb
have hy0 : y ≠ 0 := fun h => hb0 (congrArg codeComplex h)
exact (complex_members _).mpr ⟨x / y, div_numbers x y hy0⟩
/-- A concrete candidate for the numeric object interface. The supported set
and function contracts have separate instances below; this is not a complete
interpretation of all Litex objects and rules. Every Value is
already a genuine ZF set, so its sethood predicate is True. Membership is
actual ZF membership and equality is faithful
to the injective encoding; neither proposition is trivialized. Arithmetic is
only source-valid under the separate WD/domain proofs required by Litex.Obj.
This witness installs no default model or Representation for arbitrary types. -/
noncomputable def model : Semantics.{1} where
Value := ZFSet.{0}
mem := fun x A => x ∈ A
isSet := fun _ => True
number := codeComplex
standard := standardSet
addValue := addValue
subValue := subValue
mulValue := mulValue
negValue := negValue
divValue := divValue
powValue := powValue
number_injective := codeComplex_injective
complex_members := complex_members
natural_members := natural_members
integer_members := integer_members
rational_members := rational_members
real_members := real_members
real_subset_complex := real_subset_complex
member_isSet := fun _ => True.intro
standard_isSet := fun _ => True.intro
add_numbers := add_numbers
sub_numbers := sub_numbers
mul_numbers := mul_numbers
neg_numbers := neg_numbers
div_numbers := div_numbers
pow_numbers_nat := pow_numbers_nat
pow_numbers_int := pow_numbers_int
add_closed := add_closed
div_closed := div_closed
end Litex.NumericModel
namespace Litex
universe t
/-- This representation exists only for values of the chosen semantic model. -/
instance semanticValueRepresentation (M : Semantics.{u}) : Representation M M.Value where
wd x := M.isSet x
denote x := x
wd_isSet h := h
def semanticObject {M : Semantics.{u}} (x : M.Value) (hx : M.isSet x) :
Obj (M := M) M.Value := ⟨x, hx⟩
theorem semanticObject_denote {M : Semantics.{u}} (x : M.Value) (hx : M.isSet x) :
denote (semanticObject x hx) = x := rfl
/-- The bounded set primitives are shared by set builders and function domains.
The laws are explicit model obligations, proved by the ZF model below. -/
class SetSemantics (M : Semantics.{u}) where
emptyValue : M.Value
empty_members : ∀ x, ¬ M.mem x emptyValue
empty_isSet : M.isSet emptyValue
insertValue : M.Value → M.Value → M.Value
insert_members : ∀ a A x, M.mem x (insertValue a A) ↔ x = a ∨ M.mem x A
insert_isSet : ∀ a A, M.isSet a → M.isSet A → M.isSet (insertValue a A)
sepValue : M.Value → (M.Value → Prop) → M.Value
sep_members : ∀ D p x, M.mem x (sepValue D p) ↔ M.mem x D ∧ p x
sep_isSet : ∀ D p, M.isSet D → M.isSet (sepValue D p)
ext : ∀ A B, M.isSet A → M.isSet B → (∀ x, M.mem x A ↔ M.mem x B) → A = B
noncomputable instance numericSetSemantics : SetSemantics NumericModel.model where
emptyValue := (∅ : ZFSet.{0})
empty_members := ZFSet.notMem_empty
empty_isSet := True.intro
insertValue := ZFSet.Insert
insert_members _ _ _ := ZFSet.mem_insert_iff
insert_isSet _ _ _ _ := True.intro
sepValue D p := ZFSet.sep p D
sep_members _ _ _ := ZFSet.mem_sep
sep_isSet _ _ _ := True.intro
ext _ _ _ _ := ZFSet.ext
inductive EmptySetObj where
| empty
instance emptySetRepresentation {M : Semantics.{u}} [S : SetSemantics M] :
Representation M EmptySetObj where
wd _ := True
denote _ := S.emptyValue
wd_isSet _ := S.empty_isSet
def emptySet {M : Semantics.{u}} [SetSemantics M] : Obj (M := M) EmptySetObj :=
⟨.empty, True.intro⟩
/-- Heterogeneous certified children retain enumeration construction shape.
The stricter source WD requires a fresh element, even though set insertion
itself is defined for duplicates. -/
structure InsertObj {M : Semantics.{u}} (α : Type v) (β : Type w)
[Representation M α] [Representation M β] where
element : Obj (M := M) α
tail : Obj (M := M) β
instance insertRepresentation {M : Semantics.{u}} [S : SetSemantics M]
{α : Type v} {β : Type w} [Representation M α] [Representation M β] :
Representation M (InsertObj (M := M) α β) where
wd s := ¬ In s.element s.tail
denote s := S.insertValue (denote s.element) (denote s.tail)
wd_isSet {s} _ := S.insert_isSet _ _ (isSet s.element) (isSet s.tail)
def insert {M : Semantics.{u}} [SetSemantics M]
{α : Type v} {β : Type w} [Representation M α] [Representation M β]
(a : Obj (M := M) α) (A : Obj (M := M) β) (h : ¬ In a A) :
Obj (M := M) (InsertObj (M := M) α β) := ⟨⟨a, A⟩, h⟩
theorem notInEmpty {M : Semantics.{u}} [S : SetSemantics M]
{α : Type v} [Representation M α] (a : Obj (M := M) α) :
¬ In a (emptySet (M := M)) := S.empty_members (denote a)
theorem inInsert_iff {M : Semantics.{u}} [S : SetSemantics M]
{α : Type v} {β : Type w} {γ : Type x}
[Representation M α] [Representation M β] [Representation M γ]
(x : Obj (M := M) α) (a : Obj (M := M) β) (A : Obj (M := M) γ)
(h : ¬ In a A) : In x (insert a A h) ↔ Same x a ∨ In x A :=
S.insert_members _ _ _
theorem notInInsert {M : Semantics.{u}} [SetSemantics M]
{α : Type v} {β : Type w} {γ : Type x}
[Representation M α] [Representation M β] [Representation M γ]
(x : Obj (M := M) α) (a : Obj (M := M) β) (A : Obj (M := M) γ)
(h : ¬ In a A) (hxa : ¬ Same x a) (hxA : ¬ In x A) :
¬ In x (insert a A h) :=
fun hx => ((inInsert_iff x a A h).mp hx).elim hxa hxA
def Subset {M : Semantics.{u}} {α : Type v} {β : Type w}
[Representation M α] [Representation M β]
(A : Obj (M := M) α) (B : Obj (M := M) β) : Prop :=
∀ x, M.mem x (denote A) → M.mem x (denote B)
theorem subsetRefl {M : Semantics.{u}} {α : Type v} [Representation M α]
(A : Obj (M := M) α) : Subset A A := fun _ hx => hx
theorem subsetOfSame {M : Semantics.{u}} {α : Type v} {β : Type w}
{γ : Type x} {δ : Type*}
[Representation M α] [Representation M β] [Representation M γ] [Representation M δ]
(A : Obj (M := M) α) (B : Obj (M := M) β)
(C : Obj (M := M) γ) (D : Obj (M := M) δ)
(hAC : Same A C) (hBD : Same B D) (hAB : Subset A B) : Subset C D := by
intro z hz
rw [← hBD]
apply hAB z
rw [hAC]
exact hz
/-- Replay the source subset definition at the semantic-value representation.
The forall proof comes from the recorded definition child, not target search. -/
theorem subsetOfForall {M : Semantics.{u}} {α : Type v} {β : Type w}
[Representation M α] [Representation M β]
(A : Obj (M := M) α) (B : Obj (M := M) β)
(h : ∀ {γ : Type u} [Representation M γ], (a : Obj (M := M) γ) → In a A → In a B) :
Subset A B := fun z hz => h (semanticObject z (M.member_isSet hz)) hz
theorem emptySubset {M : Semantics.{u}} [S : SetSemantics M]
{α : Type v} [Representation M α] (A : Obj (M := M) α) :
Subset (emptySet (M := M)) A := fun x hx => (S.empty_members x hx).elim
theorem insertSubset {M : Semantics.{u}} [S : SetSemantics M]
{α : Type v} {β : Type w} {γ : Type x}
[Representation M α] [Representation M β] [Representation M γ]
(a : Obj (M := M) α) (A : Obj (M := M) β) (B : Obj (M := M) γ)
(h : ¬ In a A) (ha : In a B) (hA : Subset A B) : Subset (insert a A h) B := by
intro x hx
rcases (S.insert_members _ _ _).mp hx with hxa | hxA
· exact hxa ▸ ha
· exact hA x hxA
theorem setExt {M : Semantics.{u}} [S : SetSemantics M]
{α : Type v} {β : Type w} [Representation M α] [Representation M β]
(A : Obj (M := M) α) (B : Obj (M := M) β) (hAB : Subset A B) (hBA : Subset B A) :
Same A B := S.ext _ _ (isSet A) (isSet B) (fun x => ⟨hAB x, hBA x⟩)
/-- Predicate callbacks are well-typed only on certified members of the bound.
A membership proof certifies formation; it is not a mathematical argument. -/
structure SetBuilderObj {M : Semantics.{u}} (α : Type v) [Representation M α] where
bound : Obj (M := M) α
predicate : (x : Obj (M := M) M.Value) → In x bound → Prop
namespace SetBuilderObj
def condition {M : Semantics.{u}} {α : Type v} [Representation M α]
(s : SetBuilderObj (M := M) α) (x : M.Value) : Prop :=
∃ hx : M.mem x (denote s.bound), s.predicate (semanticObject x (M.member_isSet hx)) hx
end SetBuilderObj
instance setBuilderRepresentation {M : Semantics.{u}} [S : SetSemantics M]
{α : Type v} [Representation M α] : Representation M (SetBuilderObj (M := M) α) where
wd _ := True
denote s := S.sepValue (denote s.bound) s.condition
wd_isSet {s} _ := S.sep_isSet _ _ (isSet s.bound)
def setBuilder {M : Semantics.{u}} [SetSemantics M]
{α : Type v} [Representation M α] (D : Obj (M := M) α)
(p : (x : Obj (M := M) M.Value) → In x D → Prop) :
Obj (M := M) (SetBuilderObj (M := M) α) := ⟨⟨D, p⟩, True.intro⟩
theorem inSetBuilder_iff {M : Semantics.{u}} [S : SetSemantics M]
{α : Type v} {β : Type w} [Representation M α] [Representation M β]
(a : Obj (M := M) α) (D : Obj (M := M) β)
(p : (x : Obj (M := M) M.Value) → In x D → Prop) :
In a (setBuilder D p) ↔
∃ ha : In a D, p (semanticObject (denote a) (M.member_isSet ha)) ha := by
rw [In, show denote (setBuilder D p) = S.sepValue (denote D)
(SetBuilderObj.condition ⟨D, p⟩) from rfl, S.sep_members]
exact ⟨fun h => h.2, fun h => ⟨h.choose, h⟩⟩
theorem setBuilderSubset {M : Semantics.{u}} [S : SetSemantics M]
{α : Type v} [Representation M α] (D : Obj (M := M) α)
(p : (x : Obj (M := M) M.Value) → In x D → Prop) : Subset (setBuilder D p) D :=
fun _ hx => ((S.sep_members _ _ _).mp hx).1
namespace NativeSetBridge
/-- A numeric pullback observes only the numeric slice. A full numeric-set view
also needs the corresponding source subset witness, as in the completeness
lemmas below. Arbitrary objects keep their registered host representation. -/
def complexView {M : Semantics.{u}} {α : Type v} [Representation M α]
(A : Obj (M := M) α) : Set ℂ := {z | In (number z) A}
def realView {M : Semantics.{u}} {α : Type v} [Representation M α]
(A : Obj (M := M) α) : Set ℝ := {r | In (number (r : ℂ)) A}
theorem complexView_ofSame {M : Semantics.{u}} {α : Type v} {β : Type w}
[Representation M α] [Representation M β]
(A : Obj (M := M) α) (B : Obj (M := M) β) (h : Same A B) :
complexView A = complexView B :=
Set.ext fun z => ⟨fun hz => Eq.mp (congrArg (M.mem (M.number z)) h) hz,
fun hz => Eq.mpr (congrArg (M.mem (M.number z)) h) hz⟩
theorem complexView_subset {M : Semantics.{u}} {α : Type v} {β : Type w}
[Representation M α] [Representation M β]
(A : Obj (M := M) α) (B : Obj (M := M) β) (h : Subset A B) :
complexView A ⊆ complexView B := fun z hz => h (M.number z) hz
theorem realView_subset {M : Semantics.{u}} {α : Type v} {β : Type w}
[Representation M α] [Representation M β]
(A : Obj (M := M) α) (B : Obj (M := M) β) (h : Subset A B) :
realView A ⊆ realView B := fun r hr => h (M.number (r : ℂ)) hr
theorem complexView_complete {M : Semantics.{u}} {α : Type v} [Representation M α]
(A : Obj (M := M) α) (h : Subset A C) (x : M.Value) (hx : M.mem x (denote A)) :
∃ z : ℂ, x = M.number z ∧ z ∈ complexView A := by
obtain ⟨z, hz⟩ := (M.complex_members x).mp (h x hx)
exact ⟨z, hz, Eq.mp (congrArg (fun y => M.mem y (denote A)) hz) hx⟩
theorem realView_complete {M : Semantics.{u}} {α : Type v} [Representation M α]
(A : Obj (M := M) α) (h : Subset A R) (x : M.Value) (hx : M.mem x (denote A)) :
∃ r : ℝ, x = M.number (r : ℂ) ∧ r ∈ realView A := by
obtain ⟨r, hr⟩ := (M.real_members x).mp (h x hx)
exact ⟨r, hr, Eq.mp (congrArg (fun y => M.mem y (denote A)) hr) hx⟩
theorem complexView_empty {M : Semantics.{u}} [SetSemantics M] :
complexView (emptySet (M := M)) = ∅ :=
Set.ext fun z => ⟨fun hz => (notInEmpty (number z) hz).elim, fun h => h.elim⟩
theorem complexView_insert {M : Semantics.{u}} [SetSemantics M]
{α : Type v} [Representation M α] (z : ℂ) (A : Obj (M := M) α)
(h : ¬ In (number z) A) : complexView (insert (number z) A h) =
Insert.insert z (complexView A) := by
apply Set.ext
intro x
constructor
· intro hx
rcases (inInsert_iff (number x) (number z) A h).mp hx with eq | mem
· exact Or.inl (M.number_injective eq)
· exact Or.inr mem
· intro hx
rcases hx with eq | mem
· exact (inInsert_iff (number x) (number z) A h).mpr (Or.inl (congrArg M.number eq))
· exact (inInsert_iff (number x) (number z) A h).mpr (Or.inr mem)
end NativeSetBridge
/-- A graph has exactly its declared domain and one codomain value per input. -/
def IsFunctionGraph {M : Semantics.{u}} (pair : M.Value → M.Value → M.Value)
(D B f : M.Value) : Prop :=
(∀ p, M.mem p f → ∃ x, M.mem x D ∧ ∃ y, M.mem y B ∧ p = pair x y) ∧
∀ x, M.mem x D → ∃! y, M.mem (pair x y) f
/-- Additional set/function structure; the existing numeric model is not copied. -/
class FunctionSemantics (M : Semantics.{u}) extends SetSemantics M where
pairValue : M.Value → M.Value → M.Value
pair_injective : Function.Injective2 pairValue
productValue : M.Value → M.Value → M.Value
product_members : ∀ D E p,
M.mem p (productValue D E) ↔ ∃ x, M.mem x D ∧ ∃ y, M.mem y E ∧ p = pairValue x y
product_isSet : ∀ D E, M.isSet D → M.isSet E → M.isSet (productValue D E)
fnSetValue : M.Value → M.Value → M.Value
fnSet_members : ∀ D B f, M.mem f (fnSetValue D B) ↔ IsFunctionGraph pairValue D B f
fnSet_isSet : ∀ D B, M.isSet D → M.isSet B → M.isSet (fnSetValue D B)
graphValue : M.Value → M.Value → (M.Value → M.Value) → M.Value
graph_members : ∀ D B body p,
M.mem p (graphValue D B body) ↔
∃ x, M.mem x D ∧ ∃ y, M.mem y B ∧ p = pairValue x y ∧ y = body x
callValue : M.Value → M.Value → M.Value
call_graph : ∀ D B f x, IsFunctionGraph pairValue D B f → M.mem x D →
M.mem (pairValue x (callValue f x)) f
graph_ext : ∀ D B f g, IsFunctionGraph pairValue D B f →
IsFunctionGraph pairValue D B g →
(∀ x y, M.mem (pairValue x y) f ↔ M.mem (pairValue x y) g) → f = g
namespace FunctionSemantics
variable {M : Semantics.{u}} [F : FunctionSemantics M]
theorem pair_mem_graph (D B : M.Value) (body : M.Value → M.Value) (x y : M.Value) :
M.mem (F.pairValue x y) (F.graphValue D B body) ↔
M.mem x D ∧ M.mem y B ∧ y = body x := by
rw [F.graph_members]
constructor
· rintro ⟨a, ha, b, hb, hp, hbody⟩
obtain ⟨rfl, rfl⟩ := F.pair_injective hp
exact ⟨ha, hb, hbody⟩
· rintro ⟨hx, hy, hbody⟩
exact ⟨x, hx, y, hy, rfl, hbody⟩
theorem graph_isFunction (D B : M.Value) (body : M.Value → M.Value)
(hbody : ∀ x, M.mem x D → M.mem (body x) B) :
IsFunctionGraph F.pairValue D B (F.graphValue D B body) := by
constructor
· intro p hp
obtain ⟨x, hx, y, hy, hpair, _⟩ := (F.graph_members D B body p).mp hp
exact ⟨x, hx, y, hy, hpair⟩
· intro x hx
refine ⟨body x, (pair_mem_graph D B body x (body x)).mpr ⟨hx, hbody x hx, rfl⟩, ?_⟩
intro y hy
exact ((pair_mem_graph D B body x y).mp hy).2.2
theorem graph_inFnSet (D B : M.Value) (body : M.Value → M.Value)
(hbody : ∀ x, M.mem x D → M.mem (body x) B) :
M.mem (F.graphValue D B body) (F.fnSetValue D B) :=
(F.fnSet_members D B _).mpr (graph_isFunction D B body hbody)
theorem call_mem (D B f x : M.Value) (hf : M.mem f (F.fnSetValue D B))
(hx : M.mem x D) : M.mem (F.callValue f x) B := by
have hgraph := (F.fnSet_members D B f).mp hf
obtain ⟨a, _, b, hb, hp⟩ := hgraph.1 _ (F.call_graph D B f x hgraph hx)
obtain ⟨_, hresult⟩ := F.pair_injective hp
exact hresult ▸ hb
theorem call_graphValue (D B : M.Value) (body : M.Value → M.Value)
(hbody : ∀ x, M.mem x D → M.mem (body x) B) (x : M.Value) (hx : M.mem x D) :
F.callValue (F.graphValue D B body) x = body x := by
have hpoint := F.call_graph D B _ x (graph_isFunction D B body hbody) hx
exact ((pair_mem_graph D B body x _).mp hpoint).2.2
end FunctionSemantics
namespace NumericFunctionModel
noncomputable def graph (D B : ZFSet.{0}) (body : ZFSet.{0} → ZFSet.{0}) : ZFSet.{0} :=
ZFSet.pairSep (fun x y => y = body x) D B
noncomputable def call (f x : ZFSet.{0}) : ZFSet.{0} := by
classical
exact if h : ∃! y, ZFSet.pair x y ∈ f then Classical.choose h.exists
else NumericModel.codeComplex 0
theorem call_graph (D B f x : ZFSet.{0}) (hf : ZFSet.IsFunc D B f) (hx : x ∈ D) :
ZFSet.pair x (call f x) ∈ f := by
classical
have h := hf.2 x hx
unfold call
rw [dif_pos h]
exact Classical.choose_spec h.exists
theorem function_iff (D B f : ZFSet.{0}) :
IsFunctionGraph ZFSet.pair (M := NumericModel.model) D B f ↔ ZFSet.IsFunc D B f := by
constructor
· intro h
exact ⟨fun p hp => (ZFSet.mem_prod).mpr (h.1 p hp), h.2⟩
· intro h
exact ⟨fun p hp => (ZFSet.mem_prod).mp (h.1 hp), h.2⟩
theorem function_ext (D B f g : ZFSet.{0}) (hf : ZFSet.IsFunc D B f)
(hg : ZFSet.IsFunc D B g)
(h : ∀ x y, ZFSet.pair x y ∈ f ↔ ZFSet.pair x y ∈ g) : f = g := by
apply ZFSet.ext
intro p
constructor
· intro hp
obtain ⟨x, _, y, _, rfl⟩ := ZFSet.mem_prod.mp (hf.1 hp)
exact (h x y).mp hp
· intro hp
obtain ⟨x, _, y, _, rfl⟩ := ZFSet.mem_prod.mp (hg.1 hp)
exact (h x y).mpr hp
noncomputable instance numericFunctionSemantics : FunctionSemantics NumericModel.model where
toSetSemantics := numericSetSemantics
pairValue := ZFSet.pair
pair_injective := ZFSet.pair_injective
productValue := ZFSet.prod
product_members _ _ _ := ZFSet.mem_prod
product_isSet _ _ _ _ := True.intro
fnSetValue := ZFSet.funs
fnSet_members D B f := ZFSet.mem_funs.trans (function_iff D B f).symm
fnSet_isSet _ _ _ _ := True.intro
graphValue := graph
graph_members _ _ _ _ := ZFSet.mem_pairSep
callValue := call
call_graph D B f x hf hx := call_graph D B f x ((function_iff D B f).mp hf) hx
graph_ext D B f g hf hg h := function_ext D B f g
((function_iff D B f).mp hf) ((function_iff D B g).mp hg) h
end NumericFunctionModel
namespace FunctionSemantics
variable {M : Semantics.{u}} [F : FunctionSemantics M]
/-- Decoding is only used internally to interpret a two-parameter formula graph. -/
noncomputable def unpairValue (p : M.Value) : M.Value × M.Value := by
classical
exact if h : ∃ v : M.Value × M.Value, p = F.pairValue v.1 v.2 then
Classical.choose h else (M.number 0, M.number 0)
theorem unpair_pair (a b : M.Value) :
unpairValue (F.pairValue a b) = (a, b) := by
classical
have h : ∃ v : M.Value × M.Value, F.pairValue a b = F.pairValue v.1 v.2 :=
⟨(a, b), rfl⟩
unfold unpairValue
rw [dif_pos h]
obtain ⟨ha, hb⟩ := F.pair_injective (Classical.choose_spec h)
exact Prod.ext ha.symm hb.symm
end FunctionSemantics
inductive NumericInputDomain where
| one (input : StandardSetValue)
| two (first second : StandardSetValue)
/-- Numeric domains and guards remain ordinary semantic predicates. -/
structure FunctionSignature (M : Semantics.{u}) where
inputs : NumericInputDomain
output : StandardSetValue
guard : M.Value → Prop
namespace FunctionSignature
variable {M : Semantics.{u}} [F : FunctionSemantics M]
def one (A B : StandardSetValue) (guard : M.Value → Prop) : FunctionSignature M :=
⟨.one A, B, guard⟩
noncomputable def two (A E B : StandardSetValue) (guard : M.Value → M.Value → Prop) :
FunctionSignature M :=
⟨.two A E, B, fun p => guard (FunctionSemantics.unpairValue p).1
(FunctionSemantics.unpairValue p).2⟩
def baseDomain (s : FunctionSignature M) : M.Value :=
match s.inputs with
| .one A => M.standard A
| .two A E => F.productValue (M.standard A) (M.standard E)
def domain (s : FunctionSignature M) : M.Value := F.sepValue s.baseDomain s.guard
def target (s : FunctionSignature M) : M.Value := M.standard s.output
theorem domain_isSet (s : FunctionSignature M) : M.isSet s.domain := by
apply F.sep_isSet
cases s with
| mk inputs output guard =>
cases inputs with
| one A => exact M.standard_isSet A
| two A E => exact F.product_isSet _ _ (M.standard_isSet A) (M.standard_isSet E)
theorem one_domain (A B : StandardSetValue) (guard : M.Value → Prop) (x : M.Value) :
M.mem x (one A B guard).domain ↔ M.mem x (M.standard A) ∧ guard x :=
F.sep_members _ _ _
theorem two_domain (A E B : StandardSetValue) (guard : M.Value → M.Value → Prop)
(a b : M.Value) :
M.mem (F.pairValue a b) (two A E B guard).domain ↔
M.mem a (M.standard A) ∧ M.mem b (M.standard E) ∧ guard a b := by
change M.mem (F.pairValue a b)
(F.sepValue (F.productValue (M.standard A) (M.standard E)) _) ↔ _
rw [F.sep_members]
simp only [two, FunctionSemantics.unpair_pair]
constructor
· rintro ⟨h, hg⟩
obtain ⟨x, hx, y, hy, hp⟩ := (F.product_members _ _ _).mp h
obtain ⟨rfl, rfl⟩ := F.pair_injective hp
exact ⟨hx, hy, hg⟩
· rintro ⟨ha, hb, hg⟩
exact ⟨(F.product_members _ _ _).mpr ⟨a, ha, b, hb, rfl⟩, hg⟩
end FunctionSignature
instance functionSignatureRepresentation {M : Semantics.{u}} [F : FunctionSemantics M] :
Representation M (FunctionSignature M) where
wd _ := True
denote s := F.fnSetValue s.domain s.target
wd_isSet {s} _ := F.fnSet_isSet _ _ s.domain_isSet (M.standard_isSet s.output)
def fnSet {M : Semantics.{u}} [FunctionSemantics M] (s : FunctionSignature M) :
Obj (M := M) (FunctionSignature M) := ⟨s, True.intro⟩
/-- A formula object denotes a set-theoretic graph, not its interpretation callback.
The callback is the compiler's recursive interpretation of the source body AST. -/
structure FormulaFn (M : Semantics.{u}) where
signature : FunctionSignature M
bodyValue : M.Value → M.Value
instance formulaFnRepresentation {M : Semantics.{u}} [F : FunctionSemantics M] :
Representation M (FormulaFn M) where
wd f := ∀ x, M.mem x f.signature.domain → M.mem (f.bodyValue x) f.signature.target
denote f := F.graphValue f.signature.domain f.signature.target f.bodyValue
wd_isSet h := M.member_isSet
(FunctionSemantics.graph_inFnSet _ _ _ h)
def formulaFn {M : Semantics.{u}} [FunctionSemantics M]
(A B : StandardSetValue) (guard : M.Value → Prop) (body : M.Value → M.Value)
(hReturn : ∀ x, M.mem x (M.standard A) → guard x → M.mem (body x) (M.standard B)) :
Obj (M := M) (FormulaFn M) :=
⟨⟨FunctionSignature.one A B guard, body⟩, fun x hx =>
hReturn x ((FunctionSignature.one_domain A B guard x).mp hx).1
((FunctionSignature.one_domain A B guard x).mp hx).2⟩
noncomputable def formulaFn2 {M : Semantics.{u}} [F : FunctionSemantics M]
(A E B : StandardSetValue) (guard : M.Value → M.Value → Prop)
(body : M.Value → M.Value → M.Value)
(hReturn : ∀ x y, M.mem x (M.standard A) → M.mem y (M.standard E) →
guard x y → M.mem (body x y) (M.standard B)) : Obj (M := M) (FormulaFn M) := by
let s := FunctionSignature.two A E B guard
let interpretation := fun p => body (FunctionSemantics.unpairValue p).1
(FunctionSemantics.unpairValue p).2
refine ⟨⟨s, interpretation⟩, ?_⟩
intro p hp
obtain ⟨hproduct, hg⟩ := (F.sep_members s.baseDomain s.guard p).mp hp
obtain ⟨x, hx, y, hy, rfl⟩ := (F.product_members _ _ _).mp hproduct
change M.mem (body _ _) (M.standard B)
simpa only [FunctionSemantics.unpair_pair] using hReturn x y hx hy
(by simpa only [s, FunctionSignature.two, FunctionSemantics.unpair_pair] using hg)
theorem formulaFnInFnSet {M : Semantics.{u}} [FunctionSemantics M]
(f : Obj (M := M) (FormulaFn M)) : In f (fnSet f.val.signature) :=
FunctionSemantics.graph_inFnSet _ _ _ f.wd
structure CallObj {M : Semantics.{u}} (α : Type v) (β : Type w)
[Representation M α] [Representation M β] where
input : StandardSetValue
output : StandardSetValue
guard : M.Value → Prop
function : Obj (M := M) α
argument : Obj (M := M) β
instance callRepresentation {M : Semantics.{u}} [F : FunctionSemantics M]
{α : Type v} {β : Type w} [Representation M α] [Representation M β] :
Representation M (CallObj (M := M) α β) where
wd c := In c.function (fnSet (FunctionSignature.one c.input c.output c.guard)) ∧
M.mem (denote c.argument) (M.standard c.input) ∧ c.guard (denote c.argument)
denote c := F.callValue (denote c.function) (denote c.argument)
wd_isSet {c} h := M.member_isSet (FunctionSemantics.call_mem _ _ _ _ h.1
((FunctionSignature.one_domain c.input c.output c.guard _).mpr h.2))
def call {M : Semantics.{u}} [FunctionSemantics M]
{α : Type v} {β : Type w} [Representation M α] [Representation M β]
(A B : StandardSetValue) (guard : M.Value → Prop)
(f : Obj (M := M) α) (a : Obj (M := M) β)
(hf : In f (fnSet (FunctionSignature.one A B guard)))
(ha : In a (standardSet A)) (hg : guard (denote a)) :
Obj (M := M) (CallObj (M := M) α β) := ⟨⟨A, B, guard, f, a⟩, hf, ha, hg⟩
structure CallObj2 {M : Semantics.{u}} (α : Type v) (β : Type w) (γ : Type t)
[Representation M α] [Representation M β] [Representation M γ] where
firstInput : StandardSetValue
secondInput : StandardSetValue
output : StandardSetValue
guard : M.Value → M.Value → Prop
function : Obj (M := M) α
first : Obj (M := M) β
second : Obj (M := M) γ
noncomputable instance call2Representation {M : Semantics.{u}} [F : FunctionSemantics M]
{α : Type v} {β : Type w} {γ : Type t}
[Representation M α] [Representation M β] [Representation M γ] :
Representation M (CallObj2 (M := M) α β γ) where
wd c := In c.function (fnSet (FunctionSignature.two c.firstInput c.secondInput
c.output c.guard)) ∧ M.mem (denote c.first) (M.standard c.firstInput) ∧
M.mem (denote c.second) (M.standard c.secondInput) ∧ c.guard (denote c.first) (denote c.second)
denote c := F.callValue (denote c.function) (F.pairValue (denote c.first) (denote c.second))
wd_isSet {c} h := M.member_isSet (FunctionSemantics.call_mem _ _ _ _ h.1
((FunctionSignature.two_domain c.firstInput c.secondInput c.output c.guard _ _).mpr h.2))
noncomputable def call2 {M : Semantics.{u}} [FunctionSemantics M]
{α : Type v} {β : Type w} {γ : Type t}
[Representation M α] [Representation M β] [Representation M γ]
(A E B : StandardSetValue) (guard : M.Value → M.Value → Prop)
(f : Obj (M := M) α) (a : Obj (M := M) β) (b : Obj (M := M) γ)
(hf : In f (fnSet (FunctionSignature.two A E B guard)))
(ha : In a (standardSet A)) (hb : In b (standardSet E)) (hg : guard (denote a) (denote b)) :
Obj (M := M) (CallObj2 (M := M) α β γ) := ⟨⟨A, E, B, guard, f, a, b⟩, hf, ha, hb, hg⟩
section FunctionObjects
variable {M : Semantics.{u}} [F : FunctionSemantics M]
/-- These laws consume the WD proofs stored in the call object. -/
theorem callInOutput {α : Type v} {β : Type w}
[Representation M α] [Representation M β]
(c : Obj (M := M) (CallObj (M := M) α β)) : In c (standardSet c.val.output) :=
FunctionSemantics.call_mem _ _ _ _ c.wd.1
((FunctionSignature.one_domain c.val.input c.val.output c.val.guard _).mpr c.wd.2)
theorem call2InOutput {α : Type v} {β : Type w} {γ : Type t}
[Representation M α] [Representation M β] [Representation M γ]
(c : Obj (M := M) (CallObj2 (M := M) α β γ)) : In c (standardSet c.val.output) :=
FunctionSemantics.call_mem _ _ _ _ c.wd.1
((FunctionSignature.two_domain c.val.firstInput c.val.secondInput c.val.output
c.val.guard _ _).mpr c.wd.2)
omit F in
theorem functionObject_proofIndependent {α : Type v} [Representation M α]
(a : α) (h₁ h₂ : WD (M := M) a) :
denote (⟨a, h₁⟩ : Obj (M := M) α) = denote (⟨a, h₂⟩ : Obj (M := M) α) := rfl
theorem callCongr {α : Type v} {β : Type w} {γ : Type t} {δ : Type*}
[Representation M α] [Representation M β] [Representation M γ] [Representation M δ]
(c : Obj (M := M) (CallObj (M := M) α β))
(d : Obj (M := M) (CallObj (M := M) γ δ))
(hf : Same c.val.function d.val.function) (ha : Same c.val.argument d.val.argument) :
Same c d := congrArg₂ F.callValue hf ha
theorem call2Congr {α : Type v} {β : Type w} {γ : Type t}
{δ : Type*} {ε : Type*} {ζ : Type*}
[Representation M α] [Representation M β] [Representation M γ]
[Representation M δ] [Representation M ε] [Representation M ζ]
(c : Obj (M := M) (CallObj2 (M := M) α β γ))
(d : Obj (M := M) (CallObj2 (M := M) δ ε ζ))
(hf : Same c.val.function d.val.function)
(ha : Same c.val.first d.val.first) (hb : Same c.val.second d.val.second) :
Same c d := congrArg₂ F.callValue hf (congrArg₂ F.pairValue ha hb)
theorem callFormula_denote {α : Type v} [Representation M α]
(A B : StandardSetValue) (guard : M.Value → Prop) (body : M.Value → M.Value)
(hReturn : ∀ x, M.mem x (M.standard A) → guard x → M.mem (body x) (M.standard B))
(a : Obj (M := M) α) (ha : In a (standardSet A)) (hg : guard (denote a)) :
denote (call A B guard (formulaFn A B guard body hReturn) a
(formulaFnInFnSet _) ha hg) = body (denote a) :=
FunctionSemantics.call_graphValue _ _ _ (formulaFn A B guard body hReturn).wd _
((FunctionSignature.one_domain A B guard _).mpr ⟨ha, hg⟩)
/-- The source body's owned object supplies the correspondence to its template. -/
theorem callFormula_same {α : Type v} {β : Type w}
[Representation M α] [Representation M β]
(A B : StandardSetValue) (guard : M.Value → Prop) (body : M.Value → M.Value)
(hReturn : ∀ x, M.mem x (M.standard A) → guard x → M.mem (body x) (M.standard B))
(a : Obj (M := M) α) (ha : In a (standardSet A)) (hg : guard (denote a))
(b : Obj (M := M) β) (hBody : body (denote a) = denote b) :
Same (call A B guard (formulaFn A B guard body hReturn) a
(formulaFnInFnSet _) ha hg) b :=
(callFormula_denote A B guard body hReturn a ha hg).trans hBody
theorem callFormula2_denote {α : Type v} {β : Type w}
[Representation M α] [Representation M β]
(A E B : StandardSetValue) (guard : M.Value → M.Value → Prop)
(body : M.Value → M.Value → M.Value)
(hReturn : ∀ x y, M.mem x (M.standard A) → M.mem y (M.standard E) →
guard x y → M.mem (body x y) (M.standard B))
(a : Obj (M := M) α) (b : Obj (M := M) β)
(ha : In a (standardSet A)) (hb : In b (standardSet E)) (hg : guard (denote a) (denote b)) :
denote (call2 A E B guard (formulaFn2 A E B guard body hReturn) a b
(formulaFnInFnSet _) ha hb hg) = body (denote a) (denote b) := by
have h := FunctionSemantics.call_graphValue _ _ _ (formulaFn2 A E B guard body hReturn).wd
(F.pairValue (denote a) (denote b))
((FunctionSignature.two_domain A E B guard _ _).mpr ⟨ha, hb, hg⟩)
change F.callValue (F.graphValue (FunctionSignature.two A E B guard).domain
(FunctionSignature.two A E B guard).target (fun p => body (FunctionSemantics.unpairValue p).1
(FunctionSemantics.unpairValue p).2))
(F.pairValue (denote a) (denote b)) = body (denote a) (denote b)
simpa only [formulaFn2, FunctionSemantics.unpair_pair] using h
theorem callFormula2_same {α : Type v} {β : Type w} {γ : Type t}
[Representation M α] [Representation M β] [Representation M γ]
(A E B : StandardSetValue) (guard : M.Value → M.Value → Prop)
(body : M.Value → M.Value → M.Value)
(hReturn : ∀ x y, M.mem x (M.standard A) → M.mem y (M.standard E) →
guard x y → M.mem (body x y) (M.standard B))
(a : Obj (M := M) α) (b : Obj (M := M) β)
(ha : In a (standardSet A)) (hb : In b (standardSet E)) (hg : guard (denote a) (denote b))
(c : Obj (M := M) γ) (hBody : body (denote a) (denote b) = denote c) :
Same (call2 A E B guard (formulaFn2 A E B guard body hReturn) a b
(formulaFnInFnSet _) ha hb hg) c :=
(callFormula2_denote A E B guard body hReturn a b ha hb hg).trans hBody
end FunctionObjects
end Litex