Structural Causation Tests #
@cite{nadathur-lauer-2020} @cite{pearl-2000}
Verification that Core.StructuralEquationModel correctly models classic causal
structures from the philosophy and linguistics literature. Each section
sets up a concrete CausalDynamics, states the expected causal profile,
and proves the predictions match via native_decide.
Scenarios #
| Scenario | Structure | Key prediction |
|---|---|---|
| Preemption | A→C, B→C, A fires first | A sufficient+necessary, B sufficient but not necessary |
| Prevention | A→C, B blocks A | B necessary for ¬C |
| Enabling | A background, B→(A∧B→C) | B sufficient given A, not without A |
| Double prevention | A prevents B, B prevents C | A enables C indirectly |
| Symmetric overdetermination | A→C, B→C, both present | Neither necessary |
1. Early preemption #
Billy and Suzy both throw rocks at a bottle. Suzy's rock arrives first and shatters the bottle. Billy's rock would have shattered it otherwise.
Model: two independent laws, both causes present. This is structurally identical to overdetermination in the Causation API (both sufficient, neither necessary). The API does not distinguish temporal preemption from symmetric overdetermination — both reduce to disjunctive causation.
Equations
Instances For
Equations
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Suzy's throw is sufficient for shattering.
Billy's throw is also sufficient (backup cause).
Neither is necessary when both are present (overdetermination).
"Suzy made the bottle shatter" is true; "Suzy caused the bottle to shatter" is false — matching Nadathur & Lauer's prediction for overdetermination.
When Suzy is the sole thrower, she both "made" and "caused" the shattering. Under @cite{nadathur-2024} Def 10b, the background encodes Billy's absence rather than Suzy's presence.
2. Prevention #
A surgeon operates (S), which prevents the patient from dying (D). Without surgery the disease (B) would kill the patient.
Model: B → D (disease causes death), S ∧ B → ¬D is modeled by making surgery block the disease law. We model this as: B → D is the only law, and surgery removes B from the situation (counterfactual intervention).
Without surgery: disease → death.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Background: disease present, no surgery (no_surgery = true).
Equations
- One or more equations did not get rendered due to their size.
Instances For
Disease is sufficient for death when surgery is absent.
Disease is NOT sufficient for death in an empty background (needs the no_surgery enabling condition).
3. Enabling conditions #
Oxygen is present (background). Striking a match (M) causes fire (F) only when oxygen (O) is present: O ∧ M → F.
The match is an agent cause; oxygen is an enabling condition. Nadathur & Lauer predict "make" is appropriate for the match (sufficient given oxygen) while "cause" requires necessity.
Equations
Instances For
Equations
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
Match is sufficient for fire given oxygen.
Match is NOT sufficient without oxygen.
Match is necessary for fire given oxygen.
Oxygen is also necessary for fire given match.
Both "make" and "cause" are true for the match (given oxygen).
4. Causal chain with bypass #
A → B → C, but also A → C directly. B is an intermediate that is not necessary because A has a direct path to C.
Model: two laws: A → B, A → C.
Equations
- One or more equations did not get rendered due to their size.
Instances For
A is sufficient for C (direct law).
A is necessary for C (only cause).
B is NOT sufficient for C (no law B → C).
5. Causal profiles summary #
Verify the full CausalProfile for each scenario.
Preemption (both present): sufficient, not necessary, direct.
Enabling: match is sufficient, necessary, direct (given oxygen). Under @cite{nadathur-2024} Def 10b, bg excludes the cause.
Chain bypass: A is sufficient, necessary, direct for C.
Chain bypass: B has no causal power over C. B is not sufficient (no B→C law), but IS necessary under Def 10b: the only way to achieve C is through A→C, which also fires A→B, so every path to C entails B.
6. Intervention (Pearl's do-operator) #
Verify that intervene correctly cuts incoming laws and that
manipulates detects interventionist causation.
Intervening on the effect of a simple law cuts the law. do(bottleShatters = false) in preemption removes both laws targeting bottleShatters.
After do(bottleShatters = false), the bottle doesn't shatter even with Suzy throwing — the intervention overrides the dynamics.
Suzy's throw manipulates the bottle: do(throw=T) vs do(throw=F) yield different outcomes.
In enabling, the match manipulates the flame (given oxygen).
In chain bypass, B does NOT manipulate C (no B → C law).
A manipulates C in the bypass model (direct law A → C).
7. Actual causation #
Retrospective causal judgments: "did X actually cause Y in this situation?"
actuallyCaused tests whether the cause occurred AND was causally necessary
(under @cite{nadathur-2024} Def 10b).
In preemption (both throwers), Suzy did NOT actually cause the shattering — Billy's backup blocks necessity.
When Suzy is the sole thrower, she actually caused the shattering.
In the enabling scenario, the match actually caused the flame (given oxygen as background).