"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). The expression \(\text{eml}(1, 1)\) equals the base of the natural logarithm \(e\)."

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

Plug in the numbers, and out comes one of the most famous constants in mathematics.

What Was Claimed?

A binary operator called "eml" takes two numbers and returns the exponential of the first minus the natural logarithm of the second. The claim is that when both inputs are set to 1, the result is exactly e — Euler's number, approximately 2.71828. It is the kind of claim that looks like it should be easy to verify, and it is — but even easy claims deserve rigorous checking.

What Did We Find?

The proof breaks into two elementary facts. First, the exponential of 1 is e. This is not a computation — it is the definition of the exponential function. The function exp is defined as the unique function satisfying exp(0) = 1 and being its own derivative; evaluating it at 1 gives the constant e. The computer algebra system SymPy confirms this: exp(1) minus its symbolic constant E equals exactly zero.

Second, the natural logarithm of 1 is zero. Since the logarithm answers "what power of e gives this number?", and e raised to the zero power is 1, we get ln(1) = 0. This holds in the complex plane as well — the principal branch of the complex logarithm evaluates to zero at the point z = 1, safely away from any branch cut.

Putting it together: eml(1, 1) = exp(1) - ln(1) = e - 0 = e. SymPy confirms the residual exp(1) - ln(1) - e is exactly zero. As a cross-check, numerical evaluation in Python gives eml(1, 1) = 2.718281828459045, matching the built-in value of e to all 15 displayed decimal places, with zero absolute difference.

What Should You Keep In Mind?

This result is specific to the inputs (1, 1). The operator eml(a, b) is not defined when b = 0, since ln(0) is undefined. For other input values, the result will generally not equal e or any other recognizable constant.

The identity is an algebraic certainty — it follows from definitions and cannot be overturned by new evidence or different computational methods. It is as definitive as mathematical results get.

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 verification was performed by SymPy and independently confirmed by numerical evaluation. 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?

Three adversarial checks were investigated:

  1. Is exp(1) exactly e? Yes — this is definitional. The exponential function is defined such that exp(1) = e. SymPy represents this as the exact symbolic constant E, not a floating-point approximation.

  2. Does ln(1) = 0 hold for the complex logarithm? Yes. The point z = 1 lies on the positive real axis, far from the branch cut along the negative real axis. All standard branches agree: Log(1) = 0.

  3. Could the symbolic simplification miss a nonzero result? No. SymPy evaluates exp(1) to E and ln(1) to 0 before simplify() is called. The remaining expression E - 0 - E = 0 is trivial constant arithmetic, not a complex cancellation.

detailed evidence

Detailed Evidence

Evidence Summary

ID Fact Verified
A1 exp(1) = e (symbolic verification) Computed: True (exp(1) = e confirmed)
A2 ln(1) = 0 (symbolic verification) Computed: True (ln(1) = 0 confirmed)
A3 eml(1, 1) - e = 0 (symbolic simplification) Computed: True (residual identically 0)

Proof Logic

The claim defines eml(a, b) = exp(a) - ln(b) and asserts that eml(1, 1) equals the mathematical constant e. The proof decomposes into two elementary facts and their combination.

exp(1) = e (A1). The exponential function evaluated at 1 returns e by definition. SymPy confirms that exp(1) - E (where E is SymPy's exact symbolic constant for Euler's number) simplifies to 0.

ln(1) = 0 (A2). The natural logarithm of 1 is 0. For the principal branch of the complex logarithm: Log(z) = ln|z| + i·Arg(z). At z = 1: |1| = 1 and Arg(1) = 0, giving Log(1) = 0. SymPy confirms ln(1) = 0 symbolically.

eml(1, 1) = e (A3). Substituting a = 1, b = 1 into the operator definition: eml(1, 1) = exp(1) - ln(1) = e - 0 = e. SymPy confirms that exp(1) - ln(1) - E simplifies to exactly 0 (A3 depends on A1 and A2).

As an independent cross-check, the identity was verified numerically: Python's cmath.exp(1) - cmath.log(1) returns 2.718281828459045, which matches math.e to all 15 displayed digits. The absolute difference is 0.00e+00.

Conclusion

Verdict: PROVED. The expression eml(1, 1) = exp(1) - ln(1) equals the mathematical constant e. This follows from two elementary facts: exp(1) = e by definition (A1) and ln(1) = 0 in the principal branch (A2). The combined identity eml(1, 1) - e = 0 is confirmed symbolically (A3) and numerically.

audit trail

Claim Specification
Field Value
Subject Binary operator eml(a, b) = exp(a) - ln(b)
Property eml(1, 1) = e
Operator ==
Threshold True
Operator Note Substituting a = 1, b = 1: eml(1, 1) = exp(1) - ln(1). exp(1) = e by definition of the exponential function. ln(1) = 0 (principal branch of the complex logarithm: Log(1) = ln|1| + i*Arg(1) = 0 + 0 = 0). Therefore eml(1, 1) = e - 0 = e. This is an exact algebraic identity, not a numerical approximation.

Source: proof.py JSON summary

Claim Interpretation

The claim defines a binary operator eml(a, b) = exp(a) - ln(b) and asserts that evaluating it at (1, 1) yields the mathematical constant e. This is a specific-point evaluation: eml(1, 1) = exp(1) - ln(1). Since exp(1) = e by definition and ln(1) = 0, the result is e - 0 = e.

The formal interpretation uses exact equality (==) with threshold True. The operator_note documents the complete reasoning chain: substitution, evaluation of exp(1) and ln(1), and the conclusion that the result is an exact algebraic identity.

Formalization scope: The formal interpretation is a faithful 1:1 mapping of the natural-language claim. The operator eml is fully defined in the claim, the input values are explicit (a = 1, b = 1), and the expected output (e) is unambiguous. The only interpretive choice is using the principal branch of the complex logarithm, which is the standard convention and produces the unique value ln(1) = 0.

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: exp(1) - e = 0: 0 == 0 = True
  A2: ln(1) = 0: 0 == 0 = True
  A3: simplify(eml(1,1) - e) = 0: 0 == 0 = True
  Numerical: eml(1,1) = 2.718281828459045
  Numerical: e        = 2.718281828459045
  |eml(1,1) - e|      = 0.00e+00
  Numerical cross-check: |eml(1,1) - e| < 1e-15: True == True = True
  All facts verified (symbolic + numerical): True == True = True

Source: proof.py inline output (execution trace)

Adversarial Checks

Check 1: Is exp(1) exactly e?

  • Question: Is exp(1) exactly e, or just an approximation?
  • Verification performed: The exponential function exp is defined such that exp(1) = e by definition. In SymPy, exp(1) returns the symbolic constant E (Euler's number), not a floating-point approximation. The identity exp(1) = e is definitional, not computed.
  • Finding: exp(1) = e is exact and definitional. No approximation is involved.
  • Breaks proof: No

Check 2: Does ln(1) = 0 hold for the complex logarithm?

  • Question: Does ln(1) = 0 hold for the complex logarithm?
  • Verification performed: The principal branch of the complex logarithm is defined as Log(z) = ln|z| + iArg(z) where Arg is the principal argument in (-pi, pi]. For z = 1: |1| = 1, Arg(1) = 0, so Log(1) = ln(1) + i0 = 0. This holds regardless of branch cut conventions since z = 1 is on the positive real axis.
  • Finding: ln(1) = 0 holds universally for the principal branch of the complex logarithm. No branch ambiguity at z = 1.
  • Breaks proof: No

Check 3: Could SymPy's simplify() miss a nonzero result?

  • Question: Could SymPy's simplify() fail to reduce a nonzero expression to zero?
  • Verification performed: For the expression exp(1) - ln(1) - E, SymPy evaluates exp(1) to E and ln(1) to 0 before simplify() is even called. The expression becomes E - 0 - E = 0, which is trivial constant arithmetic. There is no symbolic variable or complex cancellation involved. Additionally, the numerical cross-check confirms the result independently.
  • Finding: The simplification is trivial constant folding (E - 0 - E = 0). No risk of simplify() missing a cancellation.
  • 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 substitution, evaluation, and principal branch convention
  • Rule 5: 3 adversarial checks: definitional exactness of exp(1), complex logarithm branch at z = 1, simplification reliability
  • Rule 6: N/A — pure computation, no empirical facts. Cross-check uses mathematically independent method (numerical evaluation via cmath/math vs. symbolic algebra via SymPy)
  • Rule 7: All computations via SymPy (symbolic) and cmath/math (numerical); no hard-coded constants
  • validate_proof.py result: PASS — 16/16 checks passed, 0 issues, 0 warnings

Source: author analysis

references & relationships

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). The expression eml(1, 1) equals the base of the natural logarithm e.” — Proved. https://doi.org/10.5281/zenodo.19635611
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). The expression eml(1, 1) equals the base of the natural logarithm e.” — Proved." 2026. https://doi.org/10.5281/zenodo.19635611.
@misc{proofengine_the_binary_operator_eml_is_defined_by_the_expression_text_eml_a_b_exp_a_ln_b,
  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). The expression eml(1, 1) equals the base of the natural logarithm e.” — Proved},
  author  = {{Proof Engine}},
  year    = {2026},
  url     = {https://proofengine.info/proofs/the-binary-operator-eml-is-defined-by-the-expression-text-eml-a-b-exp-a-ln-b/},
  note    = {Verdict: PROVED. Generated by proof-engine v1.18.0},
  doi     = {10.5281/zenodo.19635611},
}
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). The expression eml(1, 1) equals the base of the natural logarithm e.” — Proved
AU  - Proof Engine
PY  - 2026
UR  - https://proofengine.info/proofs/the-binary-operator-eml-is-defined-by-the-expression-text-eml-a-b-exp-a-ln-b/
N1  - Verdict: PROVED. Generated by proof-engine v1.18.0
DO  - 10.5281/zenodo.19635611
ER  -
View proof source 241 lines · 8.1 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, 1) = e
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, Rational

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"The expression \(\text{eml}(1, 1)\) equals the base of the natural "
    r"logarithm \(e\)."
)

CLAIM_FORMAL = {
    "subject": "Binary operator eml(a, b) = exp(a) - ln(b)",
    "property": "eml(1, 1) = e",
    "operator": "==",
    "operator_note": (
        "Substituting a = 1, b = 1: eml(1, 1) = exp(1) - ln(1). "
        "exp(1) = e by definition of the exponential function. "
        "ln(1) = 0 (principal branch of the complex logarithm: "
        "Log(1) = ln|1| + i*Arg(1) = 0 + 0 = 0). "
        "Therefore eml(1, 1) = e - 0 = e. This is an exact algebraic "
        "identity, not a numerical approximation."
    ),
    "threshold": True,
    "is_time_sensitive": False,
}

# 2. FACT REGISTRY — A-types only for pure math
FACT_REGISTRY = {
    "A1": {
        "label": "exp(1) = e (symbolic verification)",
        "method": None,
        "result": None,
    },
    "A2": {
        "label": "ln(1) = 0 (symbolic verification)",
        "method": None,
        "result": None,
    },
    "A3": {
        "label": "eml(1, 1) - e = 0 (symbolic simplification)",
        "method": None,
        "result": None,
    },
}

# ============================================================================
# 3. COMPUTATION — primary method: symbolic evaluation
# ============================================================================

# A1: Verify exp(1) = e symbolically
exp_1 = exp(1)
A1_verified = compare(
    simplify(exp_1 - E), "==", 0,
    label="A1: exp(1) - e = 0",
)

# A2: Verify ln(1) = 0 symbolically
ln_1 = ln(1)
A2_verified = compare(
    ln_1, "==", 0,
    label="A2: ln(1) = 0",
)

# A3: Verify eml(1, 1) - e = 0 symbolically
eml_1_1 = exp(1) - ln(1)
residual = simplify(eml_1_1 - E)
A3_verified = compare(
    residual, "==", 0,
    label="A3: simplify(eml(1,1) - e) = 0",
)

# ============================================================================
# 4. CROSS-CHECKS — numerical evaluation (Rule 6)
# ============================================================================

import math
import cmath

eml_numerical = cmath.exp(1) - cmath.log(1)
e_numerical = math.e
numerical_diff = abs(eml_numerical.real - e_numerical)
print(f"  Numerical: eml(1,1) = {eml_numerical.real:.15f}")
print(f"  Numerical: e        = {e_numerical:.15f}")
print(f"  |eml(1,1) - e|      = {numerical_diff:.2e}")

numerical_crosscheck = compare(
    numerical_diff < 1e-15, "==", True,
    label="Numerical cross-check: |eml(1,1) - e| < 1e-15",
)

# ============================================================================
# 5. ADVERSARIAL CHECKS (Rule 5)
# ============================================================================

adversarial_checks = [
    {
        "question": "Is exp(1) exactly e, or just an approximation?",
        "verification_performed": (
            "The exponential function exp is defined such that exp(1) = e "
            "by definition. In SymPy, exp(1) returns the symbolic constant E "
            "(Euler's number), not a floating-point approximation. The "
            "identity exp(1) = e is definitional, not computed."
        ),
        "finding": (
            "exp(1) = e is exact and definitional. No approximation is involved."
        ),
        "breaks_proof": False,
    },
    {
        "question": "Does ln(1) = 0 hold for the complex logarithm?",
        "verification_performed": (
            "The principal branch of the complex logarithm is defined as "
            "Log(z) = ln|z| + i*Arg(z) where Arg is the principal argument "
            "in (-pi, pi]. For z = 1: |1| = 1, Arg(1) = 0, so "
            "Log(1) = ln(1) + i*0 = 0. This holds regardless of branch "
            "cut conventions since z = 1 is on the positive real axis."
        ),
        "finding": (
            "ln(1) = 0 holds universally for the principal branch of the "
            "complex logarithm. No branch ambiguity at z = 1."
        ),
        "breaks_proof": False,
    },
    {
        "question": "Could SymPy's simplify() fail to reduce a nonzero expression to zero?",
        "verification_performed": (
            "For the expression exp(1) - ln(1) - E, SymPy evaluates exp(1) "
            "to E and ln(1) to 0 before simplify() is even called. The "
            "expression becomes E - 0 - E = 0, which is trivial constant "
            "arithmetic. There is no symbolic variable or complex cancellation "
            "involved. Additionally, the numerical cross-check confirms the "
            "result independently."
        ),
        "finding": (
            "The simplification is trivial constant folding (E - 0 - E = 0). "
            "No risk of simplify() missing a cancellation."
        ),
        "breaks_proof": False,
    },
]

# ============================================================================
# 6. VERDICT AND STRUCTURED OUTPUT
# ============================================================================

if __name__ == "__main__":
    all_verified = A1_verified and A2_verified and A3_verified and numerical_crosscheck
    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: simplify(exp(1) - E); verify equals 0",
        result="Confirmed: exp(1) = e",
    )
    builder.add_computed_fact(
        "A2",
        label=FACT_REGISTRY["A2"]["label"],
        method="SymPy symbolic evaluation of ln(1); verify equals 0",
        result="Confirmed: ln(1) = 0",
    )
    builder.add_computed_fact(
        "A3",
        label=FACT_REGISTRY["A3"]["label"],
        method=(
            "SymPy symbolic simplification of exp(1) - ln(1) - E; "
            "verify result is 0"
        ),
        result="Confirmed: residual = 0",
        depends_on=["A1", "A2"],
    )

    builder.add_cross_check(
        description=(
            "Symbolic (A3) vs numerical: symbolic proves identity exactly; "
            "numerical confirms via Python math.e and cmath.exp/cmath.log"
        ),
        fact_ids=["A3"],
        agreement=A3_verified and numerical_crosscheck,
    )

    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(
        exp_1_equals_e=A1_verified,
        ln_1_equals_zero=A2_verified,
        symbolic_residual_zero=A3_verified,
        numerical_crosscheck_passed=numerical_crosscheck,
        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