Developing an observation through a causal model #
An observation s : ∀ v, Flat (α v) settles some variables and leaves the context unknown. Two
local procedures propagate what it settles through the equations, each deciding a variable from
what has been decided about its parents alone.
- In the strict development of Schulz and of Nadathur, a variable is settled once all its parents
are, and its equation then gives the same value in every context (
CausalModel.CausallyEntails). - In the Kleene development used by Baglini and Bar-Asher Siegal, a variable is forced to a value
when every completion of what is known about its parents gives that value in every context,
so a turned handle on an unlocked door forces the door open while other inputs are unknown
(
CausalModel.Forced).
Both are fixed points of maps that compute each variable from its parents
(WellFounded.fixedPoint). The strict development settles less than the Kleene one
(CausalModel.Forced.of_causallyEntails), and the Kleene one is sound: what it forces holds in
every context when the observation is imposed as an intervention
(CausalModel.Forced.solve_eq_of_intervene), and in every context where the observation holds
(CausalModel.Forced.solve_bot_eq).
Main definitions #
CausalModel.Forced: the Kleene development of an observationCausalModel.CausallyEntails: the strict development of an observation
Main results #
CausalModel.forced_iff,CausalModel.causallyEntails_iff: the defining equationsCausalModel.Forced.of_causallyEntails: the strict development settles lessCausalModel.Forced.solve_eq_of_intervene,CausalModel.Forced.solve_bot_eq: soundness for the observation imposed as an intervention and for the observation holdingCausalModel.causallyEntails_congr: the strict development of a variable reads the observation only at its ancestorsCausalModel.CausallyEntails.parent_eq: a settled variable settles each parent to the value its equation needsCausalModel.causallyEntails_solve_bot: when only the roots read the context, an observation whose development settles every root develops to the actual world of its contextsCausalModel.causallyEntails_iff_develop: the strict development computed one value per variable (CausalModel.develop), so thatdecideevaluates it in a finite model
Implementation notes #
Uncertainty about exogenous variables is uncertainty about the context, so a variable whose
equation reads the context is settled only when the equation gives the same value in every
context. A model whose root variables read the context therefore leaves them unsettled unless the
observation settles them, as the strict development of Schulz leaves undetermined background
variables. Both developments are families of predicates ∀ v, α v → Prop, which spares choosing
the value a variable is settled to.
Soundness has no converse. With b := ¬ a and v := a ∧ b, v is false in every context, but
neither development settles it while a is unknown, since each looks only at what is settled
about v's parents.
References #
M.forcedStep s P is one round of Kleene development from the observation s, given what
P has settled. A variable is settled to x when s settles it so, or when s leaves it open
and its equation gives x in every context and on every assignment agreeing with what P
settles about its parents.
Equations
- M.forcedStep s P v x = (s v = ↑x ∨ s v = ⊥ ∧ ∀ (u : U) (y : (w : V) → α w), (∀ (w : V), M.graph.Adj w v → ∀ (z : α w), P w z → y w = z) → M.eqn v u y = x)
Instances For
M.entailsStep s P is one round of strict development from the observation s. It is
forcedStep, except that a variable s leaves open is settled only once all its parents are.
Equations
- One or more equations did not get rendered due to their size.
Instances For
A strict round settles no more than a Kleene round given more.
M.Forced s v x says that the Kleene development of the observation s forces v to x.
Equations
- M.Forced s v x = WellFounded.fixedPoint hM (M.forcedStep s) v x
Instances For
M.CausallyEntails s v x says that the strict development of s settles v to x.
Equations
- M.CausallyEntails s v x = WellFounded.fixedPoint hM (M.entailsStep s) v x
Instances For
A root the observation leaves unobserved is settled exactly when its equation is constant.
The strict development settles less than the Kleene one.
A variable the strict development settles, unobserved, has every parent settled.
Observations that agree on a variable and all its ancestors settle it alike.
Settling c leaves what the strict development settles about a variable c does not reach
unchanged.
In a finite model, the Kleene development is reached by iterating its rounds once per variable.
In a finite model, the strict development is reached by iterating its rounds once per variable.
The Kleene development is sound. What it forces from s holds in every context when s is
imposed as an intervention.
The strict development is sound for the interventional reading.
The Kleene development is sound for the observational reading. What it forces from s holds
in every context where s holds.
The strict development is sound for the observational reading.
When the context reaches the model only at its roots, an observation whose development settles every root develops, in a context where it holds, to that context's actual world.
The strict development settles a variable to at most one value.
A variable the strict development settles, unobserved, takes its equation's value at the values the development settles for its parents, in every context.
A variable the strict development settles, unobserved, settles each parent to the value its equation needs for the result.
Computing the strict development #
A variable the strict development settles has settled parents, so its value is its equation at
their values, the same in every context. develop computes the development this way, one value
per variable, and in a finite model decide evaluates it by iteration.
M.developStep s p is one round of the strict development as values. A variable s settles
keeps its value; one s leaves open is settled once p settles all its parents and its equation,
at their values, gives the same value in every context.
Equations
- One or more equations did not get rendered due to their size.
Instances For
The strict development of the observation s, as values.
Equations
- M.develop s = WellFounded.fixedPoint hM (M.developStep s)
Instances For
The strict development settles v to x exactly when its computation does.
In a finite model, causal entailment is decided by computing the strict development.
Equations
- CausalModel.instDecidableCausallyEntails = decidable_of_iff ((M.developStep s)^[Fintype.card V] ⊥ v = ↑x) ⋯
Computing the Kleene development #
A variable the Kleene development forces takes the value its equation gives at any completion of
what is known about its parents, in any context. developKleene computes it by testing the value
at one completion against every completion and context, one value per variable.
M.developKleeneStep s p is one round of the Kleene development as values. A variable s
settles keeps its value; one s leaves open is settled when its equation gives the same value in
every context on every assignment extending what p settles about its parents.
Equations
- One or more equations did not get rendered due to their size.
Instances For
The Kleene development of the observation s, as values.
Equations
- M.developKleene s = WellFounded.fixedPoint hM (M.developKleeneStep s)
Instances For
The Kleene development forces v to x exactly when its computation settles it so.
In a finite model, being forced is decided by computing the Kleene development.
Equations
- CausalModel.instDecidableForced s v x = decidable_of_iff ((M.developKleeneStep s)^[Fintype.card V] ⊥ v = ↑x) ⋯