(proposition: Expression)
| 193 | if (op === 'NotElement') return assumeNotElement(proposition); |
| 194 | if (op === 'Equal') return assumeEquality(proposition); |
| 195 | if (op === 'NotEqual') return assumeNotEqual(proposition); |
| 196 | if (op === 'And') return assumeConjunction(proposition); |
| 197 | if (isInequalityOperator(op)) return assumeInequality(proposition); |
| 198 | |
| 199 | // Well-formed predicate shapes that the assumptions layer cannot |
| 200 | // represent (disjunctions, quantifiers...): return 'not-a-predicate' |
| 201 | // instead of throwing, so callers (e.g. the Fungrim loader) can probe |
| 202 | // guard dischargeability in bulk (design §4.1, §9). |
| 203 | if (UNSUPPORTED_PREDICATE_OPERATORS.has(op)) return 'not-a-predicate'; |
| 204 | |
| 205 | // Outright malformed input (not a predicate operator at all) reports |
| 206 | // `'not-a-predicate'` too — errors are VALUES (error-propagation design |
| 207 | // §8a): the throw escaped to the host on the direct route (`Assume(Ln("a"))` |
| 208 | // via `ce.box`), while the same program run through Epsil became an |
| 209 | // `["Error", …]` value, so the two routes disagreed on whether an |
| 210 | // unassumable proposition is catastrophic. Every sub-dispatcher below |
| 211 | // already reports malformed input this way (`!isFunction(proposition)`, |
no test coverage detected