2026-04-19 theorem 6 min read

DEML Is Incomplete

DEML: deml(x,y) = exp(−x) − ln(y). It gives exp(−x) in one node — an improvement over EML for decay functions. But it cannot build exp(+x) or neg(x). Here is the proof.

The key identity

Start with what DEML can do. The most useful univariate identity is:

deml(1, deml(x, 1)) = 1/e + x

Algebraic proof:

deml(1, deml(x, 1))
  = exp(−1) − ln(deml(x, 1))
  = exp(−1) − ln(exp(−x) − ln(1))
  = exp(−1) − ln(exp(−x))
  = exp(−1) − (−x)
  = 1/e + x  ✓

This is a 3-node DEML tree that extracts x, shifted by the constant 1/e ≈ 0.368. More generally, for any constant c (DEML-constructible or not):

deml(c, deml(x, 1)) = exp(−c) + x

The slope is always +1. The offset exp(−c) is always positive. This is DEML's only mechanism for producing functions linear in x.

The incompleteness theorem

Theorem (DEML Incompleteness): The operator deml(x,y) = exp(−x) − ln(y) with terminal 1 cannot construct neg(x) = −x or exp(+x) as finite binary trees. Therefore DEML is incomplete: it does not generate all elementary functions.

Proof

Every DEML tree T over {1, x} falls into one of two structural cases:

Case 1: x appears in a left branch. Any path from the root where x enters through a left child eventually contributes through exp(−f(x)). Since f(x) grows with x (or is bounded), exp(−f(x)) decays toward 0. The slope contribution from this case is ≤ 0 and approaches 0.

Case 2: x enters through a right branch via deml(x, 1). The only DEML tree that introduces x through a right branch in a non-decaying way is deml(x, 1) = exp(−x). When this appears as the right child of another DEML node:

deml(c, deml(x, 1)) = exp(−c) + x

Slope = +1. The positive constant exp(−c) > 0 cannot be cancelled by any further DEML composition without introducing neg(x) itself.

The trap: Feeding the output back into the left branch:

deml(1/e + x, 1) = exp(−(1/e + x)) = exp(−1/e) · exp(−x)

This is exponential decay, not growth. Every attempt to use the +x output to produce exp(+x) results in exp(−x) decay.

Consequence for neg(x): neg(x) = −x requires slope −1. But every DEML tree over {1, x} has slope ∈ {0, +1} in its x-linear component. Slope −1 is unreachable. □

Consequence for exp(+x): exp(+x) = deml(neg(x), 1). Since neg(x) is not DEML-constructible, neither is exp(+x). □

Exhaustive search confirmation

An exhaustive search over all DEML trees up to N = 17 nodes (861,952 trees) found no tree computing neg(x) = −x:

N nodes Trees checked Best error vs −x
1 2 4.14
3 4 2.04
5 16 2.04
7 80 1.93
9 448 1.37
11 2,688 1.19
13 16,896 0.88
15 109,824 0.88
17 732,160 0.84

The error is not converging to 0. It stalls at ~0.84. This is consistent with neg(x) being outside the DEML closure entirely, not just requiring a larger tree.

What DEML can and cannot construct

Function DEML Note
exp(−x) 1 node deml(x, 1) — native
x + K 3 nodes deml(K, deml(x, 1)) — K any DEML constant
−ln(x) + K 3 nodes deml(K, x)
exp(−exp(−x)) 5 nodes deml(deml(x,1), 1) — composable
neg(x) = −x impossible slope −1 unreachable
exp(+x) impossible requires neg(x)
add(x, y) impossible requires neg for general case
mul(x, y) impossible requires exp(+x) and ln

Implication for the BEST router

DEML is not complete, but it is useful. For any expression matching the pattern exp(−f(x)) where f is an EML-constructible subexpression, DEML provides a 1-node primitive that replaces a deep EML tower. The BEST router treats DEML as a special-case gate for negative-exponent patterns: Boltzmann factors, Gaussian decay, Arrhenius equations.

The incompleteness result constrains what DEML can do as a standalone system. As a routing target within BEST, it remains the optimal gate for its native pattern.

Reproduce

python python/results/s_r1_deml_incompleteness.json  # results
# Search script:
# python -c "import math; d=lambda x,y:math.exp(-x)-math.log(y); print(d(1,d(2,1)), 1/math.e+2)"

Cite this work

Monogate Research (2026). "DEML Is Incomplete: A Structural Proof." monogate research blog. https://monogate.org/blog/deml-is-incomplete

License

CC BY 4.0 — free to share and adapt with attribution. · Code: pip install monogate · Paper: arXiv:2603.21852

React