"The binary operator eml is defined by the expression \(\text{eml}(a, b) = \exp(a) - \ln(b)\) (where exp is the exponential function and ln is the principal branch of the natural logarithm). For every real \(x > 0\), the nested expression \(\text{eml}(1, \text{eml}(\text{eml}(1, x), 1))\) equals the natural logarithm \(\ln(x)\)."
Three layers of an unfamiliar operator, and what comes out the other side is one of the most fundamental functions in mathematics.
What Was Claimed?
Someone defined an operator called "eml" that takes two numbers and returns the exponential of the first minus the logarithm of the second. The claim is that if you nest this operator three times in a specific pattern — eml(1, eml(eml(1, x), 1)) — the result is simply ln(x), the natural logarithm, for every positive real number x.
This is surprising on its face. The operator involves exponentials, which grow explosively, and logarithms, which grow slowly. Nesting three calls should compound these effects. Yet the claim says the result collapses to a single, clean logarithm.
What Did We Find?
The proof unwinds the nesting one layer at a time, verifying each step with a computer algebra system.
The innermost call, eml(1, x), evaluates to e minus ln(x) — straightforward substitution using the definition of the operator and the fact that exp(1) equals the mathematical constant e.
The middle call feeds this result into eml as the first argument, with 1 as the second. This gives exp(e - ln(x)) minus ln(1). Since ln(1) is zero, the result is exp(e - ln(x)), which simplifies to exp(e) divided by x using standard exponent rules.
The outer call then takes 1 as the first argument and the middle result as the second. This gives e minus ln(exp(e)/x). The logarithm of a quotient splits into a difference: ln(exp(e)) minus ln(x). Since ln(exp(e)) equals e — the logarithm and exponential cancel — the expression becomes e minus (e minus ln(x)), which is simply ln(x).
Every one of these steps was confirmed by SymPy's symbolic algebra engine, which verified that the full nested expression minus ln(x) simplifies to exactly zero for a general positive symbol x. As an independent cross-check, the identity was evaluated numerically at six representative values spanning four orders of magnitude — from x = 0.01 to x = 100 — and matched ln(x) to within machine epsilon at every point.
What Should You Keep In Mind?
The identity requires x to be a positive real number. This ensures every logarithm in the chain is real-valued, and guarantees that ln(exp(y)) = y holds without branch-cut ambiguity. For complex x, additional care would be needed.
The intermediate expressions can be extreme — for small x, the middle step produces very large numbers, while for large x it produces values near zero. But the algebraic cancellations are exact regardless. This is a structural property of the operator, not a numerical coincidence.
The result reveals that the eml operator, despite involving both exponentials and logarithms, can invert itself through nesting. The logarithm emerges not from any single step but from precise cancellation across all three layers.
How Was This Verified?
This claim was verified using the proof-engine framework, which requires every step to be executed by code rather than asserted by the AI. The symbolic derivation was performed by SymPy and independently cross-checked with numerical evaluation at six points. The result being verified was originally established in A. Odrzywołek, "All elementary functions from a single binary operator" (arXiv:2603.21852, 2026); this proof was developed independently using different methods. For the full formal breakdown, see the structured proof report. For verification details including computation traces and adversarial checks, see the full verification audit. To reproduce the proof yourself, re-run the proof script.
What could challenge this verdict?
Four adversarial checks were investigated:
-
Boundary behavior at x -> 0+. As x approaches zero, intermediate expressions diverge (eml(1, x) -> +infinity, then exp of that -> +infinity). But the final cancellation e - (e - ln(x)) = ln(x) is algebraically exact regardless of the magnitude of intermediate values.
-
Boundary behavior at x -> +infinity. As x grows, eml(1, x) -> -infinity and exp(eml(1, x)) -> 0+. Despite intermediate values approaching 0 or -infinity, the identity holds exactly.
-
Validity of ln(exp(y)) = y. This step is the crux: it holds for all real y, since ln and exp are inverse functions on the reals. The claim restricts to x > 0, ensuring e - ln(x) is real. No branch cut ambiguity arises.
-
Numerical overflow risk. For representable positive floats, exp(e - ln(x)) stays within float64 range. Overflow would require x below the smallest positive float. The proof rests on exact symbolic algebra; numerics are supplementary.
detailed evidence
Evidence Summary
| ID | Fact | Verified |
|---|---|---|
| A1 | eml(1, x) = e - ln(x) (inner evaluation) | Computed: True (residual = 0) |
| A2 | eml(eml(1, x), 1) = exp(e)/x (middle evaluation) | Computed: True (residual = 0) |
| A3 | eml(1, eml(eml(1, x), 1)) - ln(x) = 0 (full identity) | Computed: True (residual = 0) |
| A4 | Numerical spot-check at 6 positive real points | Computed: True (max |
Proof Logic
The claim asserts that a triple nesting of the operator eml(a, b) = exp(a) - ln(b), evaluated at specific arguments, recovers the natural logarithm. The proof unwinds the nesting layer by layer.
Inner layer (A1). Evaluating the innermost call: eml(1, x) = exp(1) - ln(x) = e - ln(x). SymPy confirms this symbolically with zero residual.
Middle layer (A2). Feeding the inner result into eml as the first argument with b = 1: eml(e - ln(x), 1) = exp(e - ln(x)) - ln(1). Since ln(1) = 0, this reduces to exp(e - ln(x)). Using the exponent rule exp(a - b) = exp(a)/exp(b): exp(e - ln(x)) = exp(e) · exp(-ln(x)) = exp(e)/x. SymPy confirms this simplification exactly (A2 depends on A1).
Outer layer and full identity (A3). Feeding the middle result as the second argument to eml with a = 1: eml(1, exp(e)/x) = exp(1) - ln(exp(e)/x) = e - [ln(exp(e)) - ln(x)] = e - [e - ln(x)] = ln(x). The key steps: ln(exp(e)) = e (since ln and exp are inverse functions on the reals) and the logarithm of a quotient splits as a difference. SymPy verifies that the full nested expression minus ln(x) is identically 0 for symbolic positive x (A3 depends on A1 and A2).
Numerical cross-check (A4). The identity was evaluated numerically at six representative points spanning four orders of magnitude: x = 0.01, 0.5, 1, 2, e, and 100. At every point, the nested expression matched ln(x) to within 8.88e-16 — machine epsilon for float64 arithmetic. The symbolic result (A3) and numerical cross-check (A4) agree completely.
Conclusion
Verdict: PROVED. For every real x > 0, the triple nesting eml(1, eml(eml(1, x), 1)) equals ln(x). The proof unwinds the nesting layer by layer: the inner call produces e - ln(x) (A1), the middle call yields exp(e)/x (A2), and the outer call recovers ln(x) through the cancellation e - (e - ln(x)) (A3). Numerical evaluation at 6 points spanning x = 0.01 to x = 100 confirms agreement to machine epsilon (A4).
audit trail
| Field | Value |
|---|---|
| Subject | Binary operator eml(a, b) = exp(a) - ln(b) |
| Property | eml(1, eml(eml(1, x), 1)) = ln(x) for all real x > 0 |
| Operator | == |
| Threshold | True |
| Operator Note | The claim asserts a symbolic identity for the triple nesting of eml. Working inside out: (1) eml(1, x) = exp(1) - ln(x) = e - ln(x). (2) eml(eml(1, x), 1) = exp(e - ln(x)) - ln(1) = exp(e)/x. (3) eml(1, exp(e)/x) = exp(1) - ln(exp(e)/x) = e - (e - ln(x)) = ln(x). The domain restriction x > 0 ensures ln(x) is real-valued. The proof verifies symbolically that the nested expression minus ln(x) simplifies to 0 for symbolic positive x. |
Source: proof.py JSON summary
The claim defines eml(a, b) = exp(a) - ln(b) and asserts that for every real x > 0, the triple nesting eml(1, eml(eml(1, x), 1)) equals ln(x). This is a symbolic identity involving three nested applications of the same operator at specific argument patterns.
The formal interpretation uses exact equality (==) with threshold True. The operator_note documents the full inside-out derivation: (1) eml(1, x) = e - ln(x), (2) eml(e - ln(x), 1) = exp(e)/x, (3) eml(1, exp(e)/x) = e - ln(exp(e)/x) = ln(x). The domain restriction x > 0 ensures all logarithms are real-valued and ln(exp(y)) = y holds without branch ambiguity.
Formalization scope: The formal interpretation is a faithful 1:1 mapping of the natural-language claim. The operator eml is fully defined, the nesting structure is explicit, and the domain x > 0 is stated in the claim. The only interpretive choice is confirming that ln denotes the real natural logarithm (equivalently, the principal branch restricted to positive reals), which the claim specifies.
Attribution: This result was originally established in A. Odrzywołek, "All elementary functions from a single binary operator," arXiv:2603.21852 (2026). The proof presented here provides independent computational verification using symbolic algebra (SymPy) and numerical methods, and was developed without reference to the original proof.
Source: proof.py JSON summary
A1: eml(1, x) - (e - ln(x)) = 0: 0 == 0 = True
A2: eml(eml(1, x), 1) - exp(e)/x = 0: 0 == 0 = True
A3: eml(1, eml(eml(1, x), 1)) - ln(x) = 0: 0 == 0 = True
x = 0.01 nested = -4.605170185988092 ln(x) = -4.605170185988091 |diff| = 8.88e-16
x = 0.5 nested = -0.693147180559945 ln(x) = -0.693147180559945 |diff| = 1.11e-16
x = 1.0 nested = 0.000000000000000 ln(x) = 0.000000000000000 |diff| = 0.00e+00
x = 2.0 nested = 0.693147180559945 ln(x) = 0.693147180559945 |diff| = 1.11e-16
x = 2.718281828459045 nested = 1.000000000000000 ln(x) = 1.000000000000000 |diff| = 0.00e+00
x = 100.0 nested = 4.605170185988092 ln(x) = 4.605170185988092 |diff| = 0.00e+00
A4: all numerical spot-checks agree within 1e-10: True == True = True
All facts verified (symbolic + numerical): True == True = True
Source: proof.py inline output (execution trace)
Check 1: Does the identity hold at x -> 0+?
- Question: Does the identity hold at the boundary x -> 0+?
- Verification performed: As x -> 0+, ln(x) -> -infinity. The inner expression eml(1, x) = e - ln(x) -> +infinity. Then eml(eml(1, x), 1) = exp(e - ln(x)) -> +infinity. Then eml(1, eml(...)) = e - ln(exp(e - ln(x))) = e - (e - ln(x)) = ln(x) -> -infinity. The algebraic identity holds for all x > 0 regardless of how large or small x is; the intermediate values may be extreme, but the cancellations are exact. The numerical test at x = 0.01 confirms this.
- Finding: The identity holds even as x -> 0+. The intermediate expressions diverge, but the final cancellation is algebraically exact.
- Breaks proof: No
Check 2: Does the identity hold at x -> +infinity?
- Question: Does the identity hold at x -> +infinity?
- Verification performed: As x -> +infinity, ln(x) -> +infinity. eml(1, x) = e - ln(x) -> -infinity. eml(eml(1, x), 1) = exp(e - ln(x)) -> 0+. eml(1, exp(e - ln(x))) = e - ln(exp(e - ln(x))) = e - (e - ln(x)) = ln(x). Again the algebraic cancellation is exact. The numerical test at x = 100 confirms the identity holds for large x.
- Finding: The identity holds as x -> +infinity. Despite intermediate expressions approaching 0 or -infinity, the cancellation is exact.
- Breaks proof: No
Check 3: Is ln(exp(y)) = y always valid for x > 0?
- Question: Is ln(exp(e - ln(x))) = e - ln(x) always valid for x > 0?
- Verification performed: For real y, ln(exp(y)) = y holds for all real y (the natural logarithm and exponential are inverse functions on the reals). Here y = e - ln(x), which is real for any x > 0. So ln(exp(e - ln(x))) = e - ln(x) without restriction. This step would fail for complex x where branch cuts matter, but the claim restricts to real x > 0.
- Finding: ln(exp(y)) = y holds for all real y. Since the claim restricts to x > 0 (making e - ln(x) real), no branch cut issue arises.
- Breaks proof: No
Check 4: Could numerical overflow cause false agreement?
- Question: Could numerical overflow in exp(e - ln(x)) cause false agreement?
- Verification performed: For small x (e.g., x = 0.01), e - ln(x) ≈ 7.323, so exp(7.323) ≈ 1512 — well within float64 range. For very small x (e.g., x = 1e-300), e - ln(x) ≈ 694, and exp(694) ≈ 1e301 — still representable. Overflow would require x < exp(-exp(709)) which is below the smallest positive float. The symbolic proof does not depend on floating-point at all; the numerical cross-check is supplementary.
- Finding: No overflow risk for representable positive floats. The proof rests on exact symbolic algebra, not numerics.
- Breaks proof: No
Source: proof.py JSON summary
- Rule 1: N/A — pure computation, no empirical facts
- Rule 2: N/A — pure computation, no empirical facts
- Rule 3: N/A — proof is not time-sensitive; date.today() used only in generator metadata
- Rule 4: CLAIM_FORMAL with operator_note present; documents the full inside-out derivation and domain restriction
- Rule 5: 4 adversarial checks: boundary behavior at x -> 0+ and x -> +infinity, ln(exp(y)) = y validity, numerical overflow risk
- Rule 6: N/A — pure computation, no empirical facts. Cross-check uses mathematically independent method (numerical evaluation via Python math vs. symbolic algebra via SymPy)
- Rule 7: All computations via SymPy (symbolic) and math (numerical); no hard-coded constants
- validate_proof.py result: PASS — 16/16 checks passed, 0 issues, 0 warnings
Source: author analysis
references & relationships
Builds on — prior proofs this one depends on
Related work — context, sources, supplements
Used by — other proofs on this site that build on this one
- Every elementary function that appears on a standard scientific calculator — including \(+\), \(\times\), \(\div\), exponentiation \(x^y\), \(\sin\), \(\cos\), \(\tan\), \(\sqrt{x}\), \(\log_{10}\), \(\pi\), \(e\), \(i\), and their compositions and inverses — can be realised as a finite binary tree of the operator \(\mathrm{eml}(a, b) = e^{a} - \ln b\) whose leaves are the constant \(1\) and the input variables. Each construction is verified to machine precision at multiple test points on its natural domain.
- The binary operator eml is defined by the expression \(\text{eml}(a, b) = \exp(a) - \ln(b)\). There exists a finite binary tree consisting solely of eml operations, whose 9 leaves are drawn from \(\{1, x, y\}\), such that the tree evaluates exactly to \(x \times y\). The tree has K = 17 tokens (8 eml operations and 9 leaves), and the identity holds for all complex \(x\) and \(y\) (in the algebraic setting where \(\ln \circ \exp\) is the identity).
- The binary operator eml is defined by the expression \(\text{eml}(a, b) = \exp(a) - \ln(b)\). There exists a finite binary tree consisting solely of eml operations, whose 10 leaves are drawn from \(\{1, x, y\}\), such that the tree evaluates exactly to \(x + y\). The tree has K = 19 tokens (9 eml operations and 10 leaves), and the identity holds for all real \(x\) and \(y\) (and formally for all complex \(x, y\) in the algebraic setting where \(\ln \circ \exp\) is the identity).
- Using only the eml operator applied to the constant 1 (and allowing complex intermediates), there exist finite expressions that evaluate exactly to the mathematical constant \(\pi\) and to the imaginary unit \(i\). These expressions can be verified by symbolic simplification or by numerical evaluation that matches the known values \(\pi \approx 3.1415926535\ldots\) and \(i^2 = -1\) to machine precision.
Cite this proof
Proof Engine. (2026). Claim Verification: “The binary operator eml is defined by the expression eml(a, b) = (a) - (b) (where exp is the exponential function and ln is the principal branch of the natural logarithm). For every real x > 0, the nested expression eml(1, eml(eml(1, x), 1)) equals the natural logarithm (x).” — Proved. https://doi.org/10.5281/zenodo.19635615
Proof Engine. "Claim Verification: “The binary operator eml is defined by the expression eml(a, b) = (a) - (b) (where exp is the exponential function and ln is the principal branch of the natural logarithm). For every real x > 0, the nested expression eml(1, eml(eml(1, x), 1)) equals the natural logarithm (x).” — Proved." 2026. https://doi.org/10.5281/zenodo.19635615.
@misc{proofengine_eml_triple_nesting_recovers_ln_x,
title = {Claim Verification: “The binary operator eml is defined by the expression eml(a, b) = (a) - (b) (where exp is the exponential function and ln is the principal branch of the natural logarithm). For every real x > 0, the nested expression eml(1, eml(eml(1, x), 1)) equals the natural logarithm (x).” — Proved},
author = {{Proof Engine}},
year = {2026},
url = {https://proofengine.info/proofs/eml-triple-nesting-recovers-ln-x/},
note = {Verdict: PROVED. Generated by proof-engine v1.18.0},
doi = {10.5281/zenodo.19635615},
}
TY - DATA TI - Claim Verification: “The binary operator eml is defined by the expression eml(a, b) = (a) - (b) (where exp is the exponential function and ln is the principal branch of the natural logarithm). For every real x > 0, the nested expression eml(1, eml(eml(1, x), 1)) equals the natural logarithm (x).” — Proved AU - Proof Engine PY - 2026 UR - https://proofengine.info/proofs/eml-triple-nesting-recovers-ln-x/ N1 - Verdict: PROVED. Generated by proof-engine v1.18.0 DO - 10.5281/zenodo.19635615 ER -
View proof source
This is the exact proof.py that was deposited to Zenodo and runs when you re-execute via Binder. Every fact in the verdict above traces to code below.
"""
Proof: eml(1, eml(eml(1, x), 1)) = ln(x) for every real x > 0
Generated: 2026-04-16
"""
import os
import sys
PROOF_ENGINE_ROOT = os.environ.get("PROOF_ENGINE_ROOT")
if not PROOF_ENGINE_ROOT:
_d = os.path.dirname(os.path.abspath(__file__))
while _d != os.path.dirname(_d):
if os.path.isdir(os.path.join(_d, "proof-engine", "skills", "proof-engine", "scripts")):
PROOF_ENGINE_ROOT = os.path.join(_d, "proof-engine", "skills", "proof-engine")
break
_d = os.path.dirname(_d)
if not PROOF_ENGINE_ROOT:
raise RuntimeError("PROOF_ENGINE_ROOT not set and skill dir not found via walk-up from proof.py")
sys.path.insert(0, PROOF_ENGINE_ROOT)
from datetime import date
from sympy import Symbol, exp, ln, simplify, E, log, assumptions, oo
from scripts.computations import compare
from scripts.proof_summary import ProofSummaryBuilder
# ============================================================================
# 1. CLAIM INTERPRETATION (Rule 4)
# ============================================================================
CLAIM_NATURAL = (
r"The binary operator eml is defined by the expression "
r"\(\text{eml}(a, b) = \exp(a) - \ln(b)\) "
r"(where exp is the exponential function and ln is the principal branch "
r"of the natural logarithm). "
r"For every real \(x > 0\), the nested expression "
r"\(\text{eml}(1, \text{eml}(\text{eml}(1, x), 1))\) equals the "
r"natural logarithm \(\ln(x)\)."
)
CLAIM_FORMAL = {
"subject": "Binary operator eml(a, b) = exp(a) - ln(b)",
"property": "eml(1, eml(eml(1, x), 1)) = ln(x) for all real x > 0",
"operator": "==",
"operator_note": (
"The claim asserts a symbolic identity for the triple nesting of eml. "
"Working inside out: (1) eml(1, x) = exp(1) - ln(x) = e - ln(x). "
"(2) eml(eml(1, x), 1) = exp(e - ln(x)) - ln(1) = exp(e)/x. "
"(3) eml(1, exp(e)/x) = exp(1) - ln(exp(e)/x) = e - (e - ln(x)) "
"= ln(x). The domain restriction x > 0 ensures ln(x) is real-valued. "
"The proof verifies symbolically that the nested expression minus "
"ln(x) simplifies to 0 for symbolic positive x."
),
"threshold": True,
"is_time_sensitive": False,
}
# 2. FACT REGISTRY — A-types only for pure math
FACT_REGISTRY = {
"A1": {
"label": "eml(1, x) = e - ln(x) (inner evaluation)",
"method": None,
"result": None,
},
"A2": {
"label": "eml(eml(1, x), 1) = exp(e)/x (middle evaluation)",
"method": None,
"result": None,
},
"A3": {
"label": "eml(1, eml(eml(1, x), 1)) - ln(x) = 0 (full identity)",
"method": None,
"result": None,
},
"A4": {
"label": "Numerical spot-check at 6 positive real points",
"method": None,
"result": None,
},
}
# ============================================================================
# 3. COMPUTATION — primary method: symbolic simplification
# ============================================================================
# Define eml as a Python function over SymPy expressions
def eml(a, b):
return exp(a) - ln(b)
# Use a positive real symbol
x = Symbol("x", positive=True)
# A1: Verify eml(1, x) = e - ln(x)
inner = eml(1, x)
inner_expected = E - ln(x)
A1_residual = simplify(inner - inner_expected)
A1_verified = compare(
A1_residual, "==", 0,
label="A1: eml(1, x) - (e - ln(x)) = 0",
)
# A2: Verify eml(eml(1, x), 1) simplifies to exp(e)/x
middle = eml(inner, 1)
middle_expected = exp(E) / x
A2_residual = simplify(middle - middle_expected)
A2_verified = compare(
A2_residual, "==", 0,
label="A2: eml(eml(1, x), 1) - exp(e)/x = 0",
)
# A3: Verify the full nested expression equals ln(x)
outer = eml(1, middle)
full_residual = simplify(outer - ln(x))
A3_verified = compare(
full_residual, "==", 0,
label="A3: eml(1, eml(eml(1, x), 1)) - ln(x) = 0",
)
# ============================================================================
# 4. CROSS-CHECKS — numerical evaluation at specific points (Rule 6)
# ============================================================================
import math
test_points = [0.01, 0.5, 1.0, 2.0, math.e, 100.0]
numerical_results = []
for xv in test_points:
# Compute eml(1, eml(eml(1, xv), 1)) numerically
step1 = math.exp(1) - math.log(xv) # eml(1, xv)
step2 = math.exp(step1) - math.log(1) # eml(step1, 1)
step3 = math.exp(1) - math.log(step2) # eml(1, step2)
expected = math.log(xv)
diff = abs(step3 - expected)
numerical_results.append((xv, step3, expected, diff))
print(f" x = {xv:>8} nested = {step3:>20.15f} ln(x) = {expected:>20.15f} |diff| = {diff:.2e}")
max_diff = max(d for _, _, _, d in numerical_results)
A4_verified = compare(
max_diff < 1e-10, "==", True,
label="A4: all numerical spot-checks agree within 1e-10",
)
# ============================================================================
# 5. ADVERSARIAL CHECKS (Rule 5)
# ============================================================================
adversarial_checks = [
{
"question": "Does the identity hold at the boundary x -> 0+?",
"verification_performed": (
"As x -> 0+, ln(x) -> -infinity. The inner expression eml(1, x) "
"= e - ln(x) -> +infinity. Then eml(eml(1, x), 1) = exp(e - ln(x)) "
"-> +infinity. Then eml(1, eml(...)) = e - ln(exp(e - ln(x))) "
"= e - (e - ln(x)) = ln(x) -> -infinity. The algebraic identity "
"holds for all x > 0 regardless of how large or small x is; "
"the intermediate values may be extreme, but the cancellations "
"are exact. The numerical test at x = 0.01 confirms this."
),
"finding": (
"The identity holds even as x -> 0+. The intermediate expressions "
"diverge, but the final cancellation is algebraically exact."
),
"breaks_proof": False,
},
{
"question": "Does the identity hold at x -> +infinity?",
"verification_performed": (
"As x -> +infinity, ln(x) -> +infinity. eml(1, x) = e - ln(x) "
"-> -infinity. eml(eml(1, x), 1) = exp(e - ln(x)) -> 0+. "
"eml(1, exp(e - ln(x))) = e - ln(exp(e - ln(x))) = e - (e - ln(x)) "
"= ln(x). Again the algebraic cancellation is exact. The numerical "
"test at x = 100 confirms the identity holds for large x."
),
"finding": (
"The identity holds as x -> +infinity. Despite intermediate "
"expressions approaching 0 or -infinity, the cancellation is exact."
),
"breaks_proof": False,
},
{
"question": "Is ln(exp(e - ln(x))) = e - ln(x) always valid for x > 0?",
"verification_performed": (
"For real y, ln(exp(y)) = y holds for all real y (the natural "
"logarithm and exponential are inverse functions on the reals). "
"Here y = e - ln(x), which is real for any x > 0. So "
"ln(exp(e - ln(x))) = e - ln(x) without restriction. "
"This step would fail for complex x where branch cuts matter, "
"but the claim restricts to real x > 0."
),
"finding": (
"ln(exp(y)) = y holds for all real y. Since the claim restricts "
"to x > 0 (making e - ln(x) real), no branch cut issue arises."
),
"breaks_proof": False,
},
{
"question": "Could numerical overflow in exp(e - ln(x)) cause false agreement?",
"verification_performed": (
"For small x (e.g., x = 0.01), e - ln(x) ≈ 2.718 + 4.605 ≈ 7.323, "
"so exp(7.323) ≈ 1512 — well within float64 range. For very small x "
"(e.g., x = 1e-300), e - ln(x) ≈ 694, and exp(694) ≈ 1e301 — still "
"representable. Overflow would require x < exp(-exp(709)) which is "
"below the smallest positive float. The symbolic proof does not "
"depend on floating-point at all; the numerical cross-check is "
"supplementary."
),
"finding": (
"No overflow risk for representable positive floats. The proof "
"rests on exact symbolic algebra, not numerics."
),
"breaks_proof": False,
},
]
# ============================================================================
# 6. VERDICT AND STRUCTURED OUTPUT
# ============================================================================
if __name__ == "__main__":
all_verified = A1_verified and A2_verified and A3_verified and A4_verified
claim_holds = compare(
all_verified, "==", CLAIM_FORMAL["threshold"],
label="All facts verified (symbolic + numerical)",
)
any_breaks = any(ac.get("breaks_proof") for ac in adversarial_checks)
if any_breaks:
verdict = "UNDETERMINED"
else:
verdict = "PROVED" if claim_holds else "DISPROVED"
print(f"\nVERDICT: {verdict}")
builder = ProofSummaryBuilder(CLAIM_NATURAL, CLAIM_FORMAL)
builder.add_computed_fact(
"A1",
label=FACT_REGISTRY["A1"]["label"],
method=(
"SymPy symbolic evaluation of eml(1, x) = exp(1) - ln(x) for "
"positive symbol x; verify simplify(result - (E - ln(x))) = 0"
),
result="Confirmed: eml(1, x) = e - ln(x)",
)
builder.add_computed_fact(
"A2",
label=FACT_REGISTRY["A2"]["label"],
method=(
"SymPy symbolic evaluation of eml(eml(1, x), 1) for positive "
"symbol x; verify simplify(result - exp(E)/x) = 0"
),
result="Confirmed: eml(eml(1, x), 1) = exp(e)/x",
depends_on=["A1"],
)
builder.add_computed_fact(
"A3",
label=FACT_REGISTRY["A3"]["label"],
method=(
"SymPy symbolic evaluation of eml(1, eml(eml(1, x), 1)) for "
"positive symbol x; verify simplify(result - ln(x)) = 0"
),
result="Confirmed: full nested expression = ln(x), residual = 0",
depends_on=["A1", "A2"],
)
builder.add_computed_fact(
"A4",
label=FACT_REGISTRY["A4"]["label"],
method=(
"Numerical evaluation of eml(1, eml(eml(1, x), 1)) - ln(x) at "
"x = 0.01, 0.5, 1, 2, e, 100 using Python math; verify all < 1e-10"
),
result=f"Confirmed: max |diff| = {max_diff:.2e}",
)
builder.add_cross_check(
description=(
"Symbolic (A3) vs numerical (A4): symbolic proves identity exactly "
"for all x > 0; numerical confirms at 6 representative points "
"spanning 4 orders of magnitude"
),
fact_ids=["A3", "A4"],
agreement=A3_verified and A4_verified,
)
for ac in adversarial_checks:
builder.add_adversarial_check(
question=ac["question"],
verification_performed=ac["verification_performed"],
finding=ac["finding"],
breaks_proof=ac["breaks_proof"],
)
builder.set_verdict(verdict)
builder.set_key_results(
inner_evaluation_verified=A1_verified,
middle_evaluation_verified=A2_verified,
full_identity_verified=A3_verified,
numerical_crosscheck_passed=A4_verified,
claim_holds=claim_holds,
)
builder.emit()
Re-execute this proof
The verdict above is cached from when this proof was minted. To re-run the exact
proof.py shown in "View proof source" and see the verdict recomputed live,
launch it in your browser — no install required.
Re-execute the exact bytes deposited at Zenodo.
Re-execute in Binder runs in your browser · ~60s · no installFirst run takes longer while Binder builds the container image; subsequent runs are cached.
machine-readable formats
Downloads & raw data
found this useful? ★ star on github