422 lines
9.8 KiB
Markdown
422 lines
9.8 KiB
Markdown
# Semantic-Symbolic Binding Graph Proposal
|
|
|
|
**Status:** Proposed architecture direction
|
|
**Date:** 2026-05-23
|
|
**Scope:** Documentation only; no runtime behavior change.
|
|
**Related work:** ADR-0115..0118 math parser/solver/verifier/realizer, ADR-0126 candidate-graph parser, ADR-0131 proof corridor.
|
|
|
|
---
|
|
|
|
## Executive summary
|
|
|
|
CORE's current bounded math path already performs an early version of semantic-to-math compilation:
|
|
|
|
```text
|
|
natural-language statement
|
|
-> candidate initial / operation / unknown
|
|
-> MathProblemGraph
|
|
-> deterministic solver
|
|
-> SolutionTrace
|
|
-> realizer
|
|
```
|
|
|
|
That is the correct direction, but it is not yet a full semantic-symbolic compiler. The next major architecture layer should make the intermediate representation explicit:
|
|
|
|
```text
|
|
natural language problem
|
|
-> semantic proposition graph
|
|
-> semantic-symbolic binding graph
|
|
-> equation / expression system
|
|
-> deterministic solver or typed refusal
|
|
-> proof trace linked back to source spans
|
|
```
|
|
|
|
The goal is to convert word problems into mathematical form **without losing the identity, unit, role, provenance, and context of each symbol**.
|
|
|
|
---
|
|
|
|
## Why this matters
|
|
|
|
The GSM8K arc showed that adding grammar shape after grammar shape is a treadmill. The deeper missing layer is not another regex. It is a typed compiler boundary between language and symbolic reasoning.
|
|
|
|
A sentence like:
|
|
|
|
```text
|
|
Tina makes $18 per hour and works 7 hours.
|
|
```
|
|
|
|
should not compile directly into anonymous arithmetic:
|
|
|
|
```text
|
|
18 * 7
|
|
```
|
|
|
|
It should compile into bound symbolic facts:
|
|
|
|
```text
|
|
rate(Tina, wage) = 18 dollars/hour
|
|
duration(Tina, work) = 7 hours
|
|
earnings(Tina, work) = rate(Tina, wage) * duration(Tina, work)
|
|
```
|
|
|
|
The solver may then reduce this to:
|
|
|
|
```text
|
|
earnings(Tina, work) = 126 dollars
|
|
```
|
|
|
|
But the trace must retain where each symbol came from, what it means, which units it carries, and why the equation is admissible.
|
|
|
|
---
|
|
|
|
## Problem statement
|
|
|
|
The current system has strong pieces:
|
|
|
|
- typed math problem graphs,
|
|
- deterministic solver traces,
|
|
- verifier discipline,
|
|
- realizer surfaces,
|
|
- candidate-graph parsing,
|
|
- symbolic-equivalence hardening under ADR-0131.
|
|
|
|
But there is not yet a first-class object that says:
|
|
|
|
> This symbol corresponds to this semantic entity, this unit, this source span, this variable role, this dependency, and this admissibility contract.
|
|
|
|
Without that layer, natural-language math will remain either:
|
|
|
|
1. too brittle, because parser patterns must solve every semantic problem directly; or
|
|
2. too unsafe, because collapsing to raw equations discards context.
|
|
|
|
---
|
|
|
|
## Proposed abstraction
|
|
|
|
Introduce a `SemanticSymbolicBindingGraph` as the explicit compiler boundary between language/semantic parsing and symbolic/equational solving.
|
|
|
|
### Core objects
|
|
|
|
```text
|
|
BindingGraph
|
|
symbols: tuple[SymbolBinding, ...]
|
|
facts: tuple[BoundFact, ...]
|
|
equations: tuple[BoundEquation, ...]
|
|
unknowns: tuple[BoundUnknown, ...]
|
|
constraints: tuple[BoundConstraint, ...]
|
|
provenance: tuple[SourceSpanLink, ...]
|
|
```
|
|
|
|
### SymbolBinding
|
|
|
|
```text
|
|
symbol_id: stable deterministic identifier
|
|
name: canonical symbolic name
|
|
semantic_role: entity | quantity | rate | duration | count | total | difference | ratio | unknown
|
|
entity: optional semantic entity id
|
|
unit: optional canonical unit id
|
|
source_span: original text span
|
|
introduced_by: parser/candidate id
|
|
```
|
|
|
|
Examples:
|
|
|
|
```text
|
|
symbol: q_sam_apples_t0
|
|
role: quantity
|
|
entity: Sam
|
|
unit: apples
|
|
source_span: "Sam has 5 apples"
|
|
```
|
|
|
|
```text
|
|
symbol: rate_tina_wage
|
|
role: rate
|
|
entity: Tina
|
|
unit: dollars/hour
|
|
source_span: "$18 per hour"
|
|
```
|
|
|
|
### BoundFact
|
|
|
|
A grounded fact from language:
|
|
|
|
```text
|
|
q_sam_apples_t0 = 5 apples
|
|
rate_tina_wage = 18 dollars/hour
|
|
```
|
|
|
|
### BoundEquation
|
|
|
|
A derived symbolic relation with provenance:
|
|
|
|
```text
|
|
earnings_tina_work = rate_tina_wage * duration_tina_work
|
|
```
|
|
|
|
Each equation must carry:
|
|
|
|
- source fact dependencies,
|
|
- operation kind,
|
|
- unit transformation proof,
|
|
- admissibility status,
|
|
- refusal reason if invalid.
|
|
|
|
### BoundUnknown
|
|
|
|
The target of the question:
|
|
|
|
```text
|
|
unknown: earnings_tina_work
|
|
question_span: "How much does she earn?"
|
|
expected_unit: dollars
|
|
```
|
|
|
|
---
|
|
|
|
## Compilation pipeline
|
|
|
|
### Phase 1 — Surface parse to semantic candidates
|
|
|
|
Input:
|
|
|
|
```text
|
|
Tina makes $18 per hour. She works 7 hours. How much does she earn?
|
|
```
|
|
|
|
Output:
|
|
|
|
```text
|
|
CandidateFact(rate, entity=Tina, value=18, unit=dollars/hour)
|
|
CandidateFact(duration, entity=Tina, value=7, unit=hours)
|
|
CandidateUnknown(earnings, entity=Tina, unit=dollars)
|
|
```
|
|
|
|
This phase should remain refusal-first. If entity resolution or unit parsing is ambiguous, emit multiple candidates or refuse.
|
|
|
|
### Phase 2 — Semantic candidates to SymbolBindings
|
|
|
|
Allocate deterministic symbols:
|
|
|
|
```text
|
|
rate_tina_wage
|
|
hours_tina_work
|
|
earnings_tina_work
|
|
```
|
|
|
|
Symbol IDs must be stable under replay and should include semantic role, entity, unit, and source-order disambiguation.
|
|
|
|
### Phase 3 — Bind equations
|
|
|
|
Apply typed operators:
|
|
|
|
```text
|
|
earnings = rate * duration
|
|
```
|
|
|
|
Only if the unit algebra validates:
|
|
|
|
```text
|
|
(dollars/hour) * hour = dollars
|
|
```
|
|
|
|
Otherwise refuse.
|
|
|
|
### Phase 4 — Solve / verify / realize
|
|
|
|
The existing deterministic solver and verifier concepts remain, but now operate over equations whose symbols retain semantic meaning.
|
|
|
|
Output trace should show:
|
|
|
|
```text
|
|
rate_tina_wage = 18 dollars/hour
|
|
hours_tina_work = 7 hours
|
|
earnings_tina_work = rate_tina_wage * hours_tina_work = 126 dollars
|
|
```
|
|
|
|
---
|
|
|
|
## Refusal discipline
|
|
|
|
This layer must refuse rather than guess when:
|
|
|
|
- a pronoun has multiple valid antecedents,
|
|
- a unit conversion is absent from the ratified unit pack,
|
|
- a symbol would combine incompatible dimensions,
|
|
- a relation is implied but not licensed by a known operator,
|
|
- an equation would require unratified common-sense knowledge,
|
|
- the question target is not bound to a known symbol,
|
|
- multiple admissible symbolic systems produce different answers.
|
|
|
|
This preserves the project doctrine:
|
|
|
|
```text
|
|
wrong == 0 is more important than coverage
|
|
```
|
|
|
|
---
|
|
|
|
## Relation to ADR-0131
|
|
|
|
ADR-0131's Benchmark 3, the bounded-grammar word-problem lane, would become much stronger if backed by this layer.
|
|
|
|
Instead of merely proving:
|
|
|
|
```text
|
|
parser pattern -> answer
|
|
```
|
|
|
|
it would prove:
|
|
|
|
```text
|
|
bounded language -> bound symbols -> equations -> verified answer
|
|
```
|
|
|
|
This gives the public proof corridor a stronger differentiator:
|
|
|
|
- deterministic,
|
|
- traceable,
|
|
- auditable,
|
|
- refusal-first,
|
|
- source-span-linked,
|
|
- unit-aware,
|
|
- symbolically inspectable.
|
|
|
|
---
|
|
|
|
## Relation to symbolic equivalence
|
|
|
|
ADR-0131.1.B hardens the symbolic substrate: multivariable polynomials, exact rational coefficients, deterministic canonicalization.
|
|
|
|
The binding graph is the bridge that lets natural-language tasks use that substrate without losing semantic context.
|
|
|
|
In other words:
|
|
|
|
```text
|
|
symbolic equivalence = exact algebra substrate
|
|
binding graph = semantic compiler into that substrate
|
|
```
|
|
|
|
Both are needed. They should remain separate implementation phases.
|
|
|
|
---
|
|
|
|
## Proposed implementation phases
|
|
|
|
### Phase SSBG-1 — Data model only
|
|
|
|
Add immutable dataclasses:
|
|
|
|
- `SymbolBinding`
|
|
- `BoundFact`
|
|
- `BoundEquation`
|
|
- `BoundUnknown`
|
|
- `BoundConstraint`
|
|
- `SourceSpanLink`
|
|
- `SemanticSymbolicBindingGraph`
|
|
|
|
Acceptance:
|
|
|
|
- deterministic serialization,
|
|
- stable graph hash,
|
|
- no runtime parser changes,
|
|
- unit tests for construction invariants.
|
|
|
|
### Phase SSBG-2 — Compiler from existing MathProblemGraph
|
|
|
|
Create an adapter from the existing bounded math graph into the new binding graph.
|
|
|
|
Purpose: prove the abstraction can represent current behavior before expanding scope.
|
|
|
|
Acceptance:
|
|
|
|
- existing simple arithmetic cases compile,
|
|
- source entity/unit context preserved,
|
|
- solver answer unchanged,
|
|
- trace hash stable.
|
|
|
|
### Phase SSBG-3 — Unit-aware equation binding
|
|
|
|
Add dimension/unit validation for rate, duration, count, and transfer patterns.
|
|
|
|
Acceptance:
|
|
|
|
- valid unit transforms admit,
|
|
- incompatible dimensions refuse,
|
|
- missing unit conversions refuse,
|
|
- provenance cites pack entry IDs where applicable.
|
|
|
|
### Phase SSBG-4 — Question target binding
|
|
|
|
Bind questions to symbolic unknowns.
|
|
|
|
Acceptance:
|
|
|
|
- question target points to a known symbol,
|
|
- unknown unit is explicit,
|
|
- ambiguous targets refuse,
|
|
- unbound questions refuse.
|
|
|
|
### Phase SSBG-5 — Bounded grammar integration
|
|
|
|
Integrate with ADR-0131 Benchmark 3.
|
|
|
|
Acceptance:
|
|
|
|
- each Benchmark 3 case includes expected binding graph shape,
|
|
- solver trace links every equation to source spans,
|
|
- adversarial out-of-grammar probes refuse.
|
|
|
|
---
|
|
|
|
## Non-goals
|
|
|
|
This proposal is not:
|
|
|
|
- a general natural-language understanding system,
|
|
- an LLM-style chain-of-thought generator,
|
|
- a replacement for symbolic equivalence,
|
|
- a reason to reopen arbitrary GSM8K parser expansion,
|
|
- a promotion gate by itself.
|
|
|
|
It is a compiler layer for bounded-domain verified reasoning.
|
|
|
|
---
|
|
|
|
## Risks
|
|
|
|
### Risk 1 — Overbuilding too early
|
|
|
|
Mitigation: start with data model and adapter from existing `MathProblemGraph`; do not attempt broad NL support first.
|
|
|
|
### Risk 2 — Symbol names become brittle
|
|
|
|
Mitigation: separate stable `symbol_id` from human-readable `name`; use canonical serialization for hashing.
|
|
|
|
### Risk 3 — Unit algebra becomes an unbounded project
|
|
|
|
Mitigation: begin only with dimensions already represented in ratified units work; refuse missing conversions.
|
|
|
|
### Risk 4 — Hidden claim inflation
|
|
|
|
Mitigation: keep this behind ADR-0131 Benchmark 3 and explicitly say it proves bounded grammar compilation, not arbitrary GSM8K competence.
|
|
|
|
---
|
|
|
|
## Recommended next step
|
|
|
|
Do not implement this inside ADR-0131.1.B.
|
|
|
|
After the symbolic-equivalence hardening branch stabilizes, open a dedicated implementation branch:
|
|
|
|
```text
|
|
feat/semantic-symbolic-binding-graph-model
|
|
```
|
|
|
|
First PR should be data-model only.
|
|
|
|
No parser behavior changes.
|
|
No solver behavior changes.
|
|
No promotion wiring.
|
|
|
|
That gives the lead engineer a reviewable seam and avoids repeating the GSM8K parser-expansion treadmill.
|