"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)\)."

mathematics · generated 2026-04-16 · v1.18.0
PROVED pure computation — no citations
Verified by computation — no external sources required.
Verified by Proof Engine — an open-source tool that verifies claims using cited sources and executable code. Reasoning transparent and auditable.
methodology · github · re-run this proof · submit your own

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:

  1. 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.

  2. 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.

  3. 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.

  4. 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

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

Claim Specification
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

Claim Interpretation

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

Computation Traces
  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)

Adversarial Checks

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

Quality Checks
  • 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

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 304 lines · 11.2 KB

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()

↓ download proof.py · view on Zenodo (immutable)

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 install

First run takes longer while Binder builds the container image; subsequent runs are cached.

machine-readable formats

Jupyter Notebook interactive re-verification W3C PROV-JSON provenance trace RO-Crate 1.1 research object package
Downloads & raw data

found this useful? ★ star on github