core/docs/adr/ADR-0261-existential-witness-band.md
Shay e84c0e8428 feat(deduction-serve): Band v6-EX — existential witnesses, decided (ADR-0261)
Completes the all/no/some square. `some` is read for the first time:
"All mammals are vertebrates. Some whales are mammals. Therefore some
whales are vertebrates." is decided entailed; "All unicorns are horned.
Therefore some unicorns are horned." is decided unsettled, with the
no-existential-import reading disclosed in the surface.

Mechanism (generate/proof_chain/exist.py): v5-VP's per-individual
lowering over a domain widened by one Skolem witness per existential
premise and — the load-bearing part — one ARBITRARY element per
existential conclusion, at which every universal still instantiates and
about which no premise asserts anything. Refuting an existential means
deriving a universal, and the arbitrary element is what makes that
derivation genuine instead of an assumption of domain closure: without
it "Rex is a wolf. Rex is not tame. Therefore some wolves are tame."
reads as REFUTED from a domain of one wolf. With it, UNKNOWN.

Four `en_exist_*` bands earned SERVE at 720x wrong=0 on the first arena
seal (25-band ledger); the 32-case hand-authored v2_exist split passed
32/32 first run; full lane 166/166 wrong=0 across six splits.

Also fixes a wrong-answer path this work uncovered in Band v1b
(ADR-0261 §5.1): `to_syllogism` FILTERED premises it could not express
out of the projection and answered from the remainder, so "Aristotle is
a philosopher. All philosophers are scholars. Therefore some scholars
are philosophers." lost its only witness and was served "that doesn't
follow". It now refuses — matching its propositional sibling
`to_deductive_logic`, which always has — and the argument falls through
to the bands that can hold a singular fact. The categorical band
re-earned SERVE 720/720 after the change; both examples are pinned as
regression cases.

Promotion: `ds-mem-0020` declined -> unknown (ADR-0258's existential
scope-out, now read; an anonymous witness never transfers to a named
individual, so UNKNOWN is its honest verdict, not entailed).

[Verification]: core test --suite deductive 232 passed; reader tests
33/33; register+surface tests 52 passed; arena 25 bands x 720 wrong=0
(all SERVE); lane 166/166 wrong=0; lane SHAs 9/10 match (public_demo
drift is pre-existing on the base commit and unrelated — evidence in
the Tier-S brief).
2026-07-24 14:14:37 -07:00

11 KiB
Raw Blame History

ADR-0261 — Band v6-EX: existential arguments, decided

  • Status: Proposed
  • Date: 2026-07-24
  • Arc: deduction-serve (ADR-0256 → 0257 → 0258 → 0259 → 0260 → this)
  • Governs: generate/proof_chain/exist.py, the en_exist_* shape-bands, their arena templates, the v2_exist lane split, the _exist_band_surface serving tier, and the refuse-don't-drop contract of generate.meaning_graph.projectors.to_syllogism.

1. Context

The band cascade reads all and no; some refuses (quantifier_out_of_band) in every fallback tier — ADR-0258 §6 listed existentials as a deliberate scope-out, and the generalization arc (docs/plans/generalization-arc-2026-07-24.md Phase 1.2) schedules them as the move that completes the square of opposition.

Band v1b already decides categorical some-syllogisms — but only inside the shared reader's morphology lexicon, and only for arguments that are purely categorical. Real subject matter is neither: it mixes singular facts, verb predicates, and vocabulary the lexicon has never seen. Everything outside that narrow window refused.

Existentials are also the first construct in this arc whose lowering is not a straightforward instantiation. A universal instantiates at things the argument already names; an existential asserts a thing the argument does NOT name, and an existential conclusion asks about things that may not be named at all. Get that wrong in the obvious way — lower some over just the named individuals — and the reader will report REFUTED for arguments that are merely unproven, which is precisely the wrong-answer class this arc exists to prevent.

2. Decision

Add generate.proof_chain.exist.read_exist_argument as the LAST fallback tier (after v1 / v1b / v2-EN / v3-MEM / v4-CM / v5-VP), extending v5-VP's per-individual lowering — both atom families unchanged — with two new kinds of domain element:

  • A witness per existential PREMISE (a Skolem constant nothing else names): "some C1 are C2" ⇒ mem(w,C1) & mem(w,C2); the O-form negates the second conjunct; the verb forms mint a verb atom instead.
  • One arbitrary element per existential CONCLUSION: a domain element about which no premise asserts anything and at which every universal is still instantiated.

An existential conclusion lowers to the disjunction of its conjunction over the WHOLE domain — named individuals, witnesses, and the arbitrary element.

New sentence shapes, all some-led: some <C> are|is [not] [a|an] <C2> (I-form and O-form) and some <C> [do not] <verb> [<object>]. Every other shape delegates verbatim to v3-MEM's and v5-VP's parsers, refusals included.

Bands (priority order): en_exist_negative (any negative universal) > en_exist_chain (≥2 universals) > en_exist_universal (exactly 1) > en_exist_witness (no universals). Rendered by render_entailment_exist — the verb surface with the no-existential-import reading disclosed in the UNKNOWN template. Rides deduction_serving_enabled (default off); no new flag.

Second decision, forced by the first (§5.1): to_syllogism now REFUSES when the comprehension carries a relation it cannot express, instead of filtering that relation out and projecting the remainder.

3. Why this is sound

  1. ENTAILED. Let M be any first-order model of the premises. Each witness is interpretable in M (its existential premise asserts a satisfier); universal instantiation is truth-preserving at every element; the arbitrary element may be interpreted as ANY element, domains being non-empty. So every lowered premise holds in M. If the lowered premises propositionally entail the query disjunction, some element of M satisfies the conjunction — which is ∃. Skolem constants occur nowhere in the original argument, so this is entailment-preserving Skolemization, not merely satisfiability-preserving.
  2. REFUTED — the arbitrary element is load-bearing. Refuting ∃x φ(x) means deriving ∀x ¬φ(x). The lowered conjunction dual is entailed only if it is entailed at the arbitrary element, and that element is arbitrary (no premise mentions it), so what holds of it holds of every element — the universal is genuinely derived, never assumed by domain closure. Without it, "Rex is a wolf. Rex is not tame. Therefore some wolves are tame." would come back REFUTED — asserting that no wolf anywhere is tame — from a domain of one. With it, the honest UNKNOWN. This is the single most important line of this ADR and it is pinned by a named test.
  3. Completeness within the fragment lifts exactly as v3-MEM/v5-VP: a propositional countermodel becomes a first-order countermodel whose domain is the named individuals, the witnesses, and the arbitrary element.
  4. No existential import. Universals are read as vacuously true over an empty class, so the subaltern moods (Darapti, Felapton, Bamalip) are UNKNOWN, and the two contradictory pairs of the square are decided: an A-form REFUTES the corresponding O-form, an E-form REFUTES the I-form. This matches the modern first-order reading, matches what the categorical band (v1b) already does, and is the conservative choice — it declines to claim a member exists that no premise asserted. It is disclosed to the user in the UNKNOWN surface rather than left as a silent convention.
  5. The plural do not is read here and refused in v5-VP — deliberately, not inconsistently. "All C do not V" is genuinely scope-ambiguous (¬∀ vs ∀¬) and refuses; "some C do not V" is unambiguously ∃x(C(x) ∧ ¬V(x)).
  6. Cascade honesty — every arena template and lane case was verified to fall through all six earlier bands, so this tier is pure widening: every previously-served argument is served byte-identically. The one previously DECLINED case it now decides (ds-mem-0020) is promoted to its correct verdict, not a favorable one.

4. License and render

The four en_exist_* bands earned SERVE through the ADR-0199 arena (720/band committed, wrong=0, θ_SERVE=0.99; ledger resealed at 25 bands). The by-construction gold is cross-checked template-by-template against the independent truth-table oracle over each template's INTENDED lowering — every universal's per-element implications and every query disjunct spelled out — so a lowering that drops or invents a domain element shows up as a disagreement rather than passing silently (INV-25). Unearned or ledger-stripped deployments serve the same sound answer hedged (_UNVERIFIED_SHAPE_DISCLOSURE).

5. Findings and scope-outs

5.1 A wrong-answer path found in Band v1b (fixed here)

Authoring this band's lane surfaced a defect in to_syllogism that predates it. The projector built its premise list by FILTERING the meaning graph's relations down to the categorical ones — silently discarding anything else, then answering from what survived. Two consequences, both wrong served answers rather than declines:

  • "Aristotle is a philosopher. All philosophers are scholars. Therefore some scholars are philosophers." — the singular member premise was dropped, the argument lost its only witness, and serving replied "That doesn't follow." It does follow.
  • "Every mineral is a solid. Some quartzes are minerals. Therefore some quartzes are solids." — the shared reader misreads "every mineral" as an individual named every_mineral (a separate reader gap, §5.2), the resulting member relation was dropped, and a valid Darii was served as "That doesn't follow."

The arena never caught it because the CATEGORICAL band's templates are all purely categorical two-premise syllogisms in the synthetic lexicon — a family in which nothing is ever dropped. A band can hold an earned license and still have an unmeasured wrong-answer path if its practice corpus does not span its reachable inputs; that lesson is the durable part of this finding.

The fix makes to_syllogism behave exactly like its propositional sibling to_deductive_logic, which has always refused on a relation it cannot express: refuse, don't drop. Refused texts fall through to the reader bands that CAN hold a singular fact — v6-EX decides both examples correctly. The categorical band re-earned SERVE at 720/720 after the change (no coverage lost), and both examples are now pinned as regression cases (ds-ex-0008, ds-ex-0011, plus a projector unit test and an e2e test).

5.2 Scope-outs (typed refusals today)

  1. "Every C is a D" misread by the shared readercomprehend reads the quantifier phrase as an individual (every_mineral). Post-§5.1 this is harmless (v1b refuses; v6-EX reads the sentence correctly through v3-MEM's universal parser), so it is recorded, not patched: fixing the shared reader's template set is its own unit of work with its own lane.
  2. Partitives — "some of the sailors" refuses partitive_out_of_band rather than reading "of the sailors" as an opaque class run.
  3. Multi-token subjects in verb existentials, PPs, ditransitivessentence_shape_out_of_band, inherited from v5-VP's closed grammar.
  4. Tensesome C were P / some C did not V refuse tense_out_of_band.
  5. Connective × existential composition — "If some C are P then …" refuses mixed_structure_out_of_band; fusing v4-CM's connective grammar over existential leaves is a later composition.
  6. Numeric and proportional quantifiers (most, few, several, at least two) — quantifier_out_of_band. some is the only existential spelling read; "there is a C that …" is not read either.
  7. Universal conclusions — unchanged from v3-MEM: proving ∀ from these premises needs the eigenvariable machinery this band uses only for the refutation direction, and exposing it as a conclusion form is a separate, testable unit.
  8. Identity / co-reference, existential-import premises — unchanged scope-outs; a user who wants the traditional square can state the existential premise explicitly and this band will use it.

6. Verification

  • tests/test_exist_argument_reader.py — 33 tests: gap-is-real cross-check, flagship Darii lowering (exact formulas and atoms), the arbitrary-element soundness test, no-existential-import, both contradictory pairs, witness non-transfer, one-witness-per-premise, verb existentials with plural do not, number linking inside existentials, 4 band classifications, 13 typed refusals incl. delegated v3-MEM/v5-VP reasons, honesty caps, determinism.
  • tests/test_meaning_graph_projectors.py (+1) — the §5.1 refuse-don't-drop contract.
  • Surface/e2e/lane: tests/test_deduction_surface.py (+5), tests/test_deduction_serve_e2e.py (+2, one of them the §5.1 regression), tests/test_deduction_serve_lane.py (+1 over the 32-case v2_exist split; v2_member docstring updated for the ds-mem-0020 promotion) — full lane 166/166, wrong=0, all six splits.
  • Arena: 4 × 720 committed, wrong=0, first seal run; all 25 bands still SERVE; corpus soundness asserted against the independent oracle before sealing (18,000 cases).