18元序干预语义与反事实推演
元序 WorldScript 干预语义与反事实推演
将元序的因果机制从「观察性规则匹配」推进到「干预性因果建模」,完整定义 do-算子、因果图、反事实查询的形式化语义。
本文档是《14形式化语义》第八章的扩展与深化,将干预语义从「M3 规划占位」推进为完整理论。
前置阅读:《14形式化语义》《04元序规则》《16验证与确认体系》。
一、为什么需要干预语义
1.1 观察性因果的局限
元序当前的 When 规则是观察性的:
When 环境.温度 < 目标温度:
提升 加热器.功率 +0.1
这条规则的语义是「当观察到温度低于目标时,触发功率提升」。它回答的是:在当前状态下,哪些规则的条件被满足?
但这不是真正的因果。真正的因果问题是:
- 干预问题:如果我强制把温度设为 0.5(而不是等它自然变化),系统会怎样?
- 反事实问题:如果刚才没有触发加热规则,温度现在会是多少?
- 归因问题:温度上升了 0.2,其中多少归因于加热器功率,多少归因于自然散热?
观察性规则无法区分「相关」和「因果」。两个状态同时变化,可能是因果关系,也可能是共同原因的结果(混杂)。
1.2 Pearl 的结构因果模型
Judea Pearl 的因果关系阶梯(Causal Hierarchy)分三层:
| 层级 | 名称 | 典型问题 | 元序对应 |
|---|---|---|---|
| L1 | 关联(Association) | X 变化时 Y 如何变化? | 当前 When 规则 |
| L2 | 干预(Intervention) | 如果强制 X=x,Y 会怎样? | 本文档定义的 do |
| L3 | 反事实(Counterfactual) | 如果当时 X=x,结果会不同吗? | 本文档定义的反事实查询 |
元序当前处于 L1。本文档将其推进到 L2 和 L3。
1.3 干预语义与元序公理的关系
| 公理 | 与干预语义的关系 |
|---|---|
| A1 容错存续 | 干预不崩溃系统,干预后偏差被观测和收敛 |
| A2 因果涌现 | 干预切断入边,剩余因果链仍按涌现规则执行 |
| A3 尺度嵌套 | 干预可施加在任意层级域,效果跨层级传播 |
| A4 自演化 | 干预可作为演化的实验手段(影子验证本质是干预) |
| A5 状态连续 | 干预值是连续的,干预后状态平滑过渡 |
二、因果图的形式化
2.1 因果图定义
定义 2.1(因果图):元序程序 P 的因果图是一个有向无环图(DAG):
G_P = (V, E)
其中:
- V 是节点集,每个节点是一个状态维度
状态场.字段 - E 是有向边集,边
X → Y表示 X 是 Y 的直接原因
边的来源:
- When 规则:规则条件中的状态访问 → 规则动作修改的状态
- Link 联动:源状态 → 目标状态(聚合或约束)
- Track 预判:被跟踪状态 → 预判动作修改的状态
- Evolve 演化:偏差源 → 被调整的参数
定义 2.2(因果路径):从 X 到 Y 的因果路径是因果图中从 X 到 Y 的有向路径。
path(X, Y) = [X = v₀, v₁, ..., vₙ = Y] 其中 (vᵢ, vᵢ₊₁) ∈ E
定义 2.3(直接原因集):Y 的直接原因集是所有指向 Y 的边的起点:
PA(Y) = { X | (X → Y) ∈ E }
2.2 因果图的构建
元序程序加载后,运行时自动构建因果图:
// 示例程序
State 环境 [温度, 目标温度]
State 加热器 [功率]
When 环境.温度 < 环境.目标温度:
提升 加热器.功率 +0.1
When 加热器.功率 > 0.3:
提升 环境.温度 +0.03
对应的因果图:
环境.目标温度 ──┐
▼
环境.温度 ◄──── 加热器.功率
│ ▲
└──────────────┘
注意:环境.温度 → 加热器.功率(第一条规则)和 加热器.功率 → 环境.温度(第二条规则)形成反馈回路。因果图严格来说是有向图(允许环),而非严格 DAG。反馈回路是元序的核心特性。
2.3 因果图的层级标注
每个节点携带层级域标注(微/中/宏),边可跨层级:
微域.单车.车速 ──聚合→ 中域.路段.平均车速 ──约束→ 宏域.城市.拥堵指数
跨层级边的干预效果会自动沿层级传播。
三、do-算子的形式化语义
3.1 干预操作的定义
定义 3.1(do-算子):干预 do(X = x) 表示强制将状态维度 X 设为值 x,并切断所有指向 X 的因果边(X 的入边被冻结,X 不再受其原因影响)。
do(X = x, σ, G) = (σ[X ← x], G[X 的入边被移除])
其中:
σ[X ← x]:状态 σ 中 X 的值设为 xG[X 的入边被移除]:因果图中所有指向 X 的边被临时移除
关键性质:干预不是赋值。赋值 X = x 只是改变 X 的值;干预 do(X = x) 同时改变 X 的值并切断其入边,意味着 X 的值不再由其上游原因决定。
3.2 干预后的转移函数
定义 3.2(干预后转移):在干预 do(X=x) 下,单 Tick 转移函数为:
⟦P⟧_{do(X=x)}(σ) = ⟦P[PA(X) 被冻结]⟧(σ[X ← x])
即:
- X 的值固定为 x,不被任何规则修改
- 所有读取 X 的规则仍正常评估(X 作为原因影响其他维度)
- 所有修改 X 的规则被跳过(X 的入边已切断)
3.3 多变量干预
定义 3.3(联合干预):同时干预多个变量:
do(X₁=x₁, X₂=x₂, ..., Xₖ=xₖ)
所有被干预变量的入边同时被切断,值同时固定。
3.4 干预的语法
元序中干预通过 do() 表达式声明:
// 单变量干预
do(环境.温度 = 0.5)
// 联合干预
do(环境.温度 = 0.5, 加热器.功率 = 0.0)
// 干预后推演
推演 do(环境.温度 = 0.5) 后 10 个Tick的 环境.温度 轨迹
3.5 干预与观察的区别
| 维度 | 观察 X = x |
干预 do(X = x) |
|---|---|---|
| X 的值 | x | x |
| X 的入边 | 保留 | 切断 |
| X 受上游影响 | 是 | 否 |
| 混杂因素 | 可能影响结果 | 被阻断 |
| 回答的问题 | "X 为 x 时,Y 是多少?" | "如果强制 X=x,Y 会是多少?" |
示例:观察到「冰淇淋销量高时溺水死亡多」,这是相关(混杂因素是夏天)。干预 do(冰淇淋销量=高) 不会增加溺水死亡,因为干预切断了「夏天→冰淇淋销量」的边,夏天不再同时影响两者。
四、反事实推演的形式化
4.1 反事实的定义
定义 4.1(反事实查询):给定实际运行轨迹 σ₀, σ₁, ..., σ_t,反事实查询「如果在 Tick k 时 do(X=x),系统会怎样?」的回答为:
CF(X=x, k, horizon=H) = ⟦P⟧_{do(X=x)}^H(σ_k)
即:
- 取 Tick k 的实际状态 σ_k(不是初始状态)
- 在 σ_k 上施加干预 do(X=x)
- 从干预后的状态出发,重新推演 H 个 Tick
- 输出干预后的轨迹,与实际轨迹对比
4.2 反事实的三步法
反事实推演遵循 Pearl 的三步法:
第一步:溯因(Abduction)
- 用实际数据更新背景变量(确定 σ_k 的完整状态,包括未观测变量的最可能值)
第二步:干预(Action)
- 在 σ_k 上施加 do(X=x),切断 X 的入边
第三步:预测(Prediction)
- 从干预后的状态出发,用修改后的模型推演未来
4.3 反事实的语法
// 基本反事实查询
反事实: 在 Tick 50 时 do(信号灯.配时 = 0.7), 推演 30 个Tick, 对比 路段.平均车速
// 多变量反事实
反事实: 在 Tick 50 时 do(信号灯.配时 = 0.7, 天气.降雨 = 0.0), 推演 30 个Tick
// 归因查询
归因: Tick 50 到 Tick 80 的 路段.平均车速 变化中, 多少归因于 信号灯.配时?
4.4 反事实与实际轨迹的对比
反事实推演的输出包含两条轨迹:
实际轨迹: σ₀, σ₁, ..., σ_k, σ_{k+1}, ..., σ_{k+H}
反事实轨迹: σ₀, σ₁, ..., σ_k, σ'_{k+1}, ..., σ'_{k+H}
↑
干预点(分叉)
两条轨迹在干预点之前完全一致,之后分叉。差异即为干预的因果效应。
4.5 因果效应的度量
定义 4.2(平均干预效应 ATE):
ATE(X, Y) = E[Y | do(X=x₁)] - E[Y | do(X=x₀)]
即干预 X 从 x₀ 到 x₁ 时,Y 的期望变化。
定义 4.3(个体因果效应 ITE):
ITE(X, Y, σ) = Y(do(X=x₁), σ) - Y(do(X=x₀), σ)
即在特定状态 σ 下,干预对 Y 的效应。
定义 4.4(自然直接效应 NDE):
干预 X 后,沿特定因果路径传播的效应,其他路径保持不变。需要更精细的路径特定干预。
五、干预语义的操作语义
5.1 干预的执行流程
1. 接收干预请求 do(X=x, tick=k, horizon=H)
2. 加载 Tick k 的状态快照 σ_k
3. 构建干预后的因果图 G' = G[X 的入边被移除]
4. 构建干预后的程序 P' = P[修改 X 的规则被禁用]
5. 设置初始状态 σ' = σ_k[X ← x]
6. 从 σ' 出发,用 P' 运行 H 个 Tick
7. 记录干预轨迹 σ'_{k+1}, ..., σ'_{k+H}
8. 与实际轨迹对比,输出因果效应
5.2 干预与演化的关系
Evolve 的影子验证本质上就是一种干预:
影子验证 = do(参数=新值) 后重放历史 N 个 Tick,对比偏差率
干预语义为影子验证提供了形式化基础:影子验证不是「模拟一下」,而是严格的干预实验。
5.3 干预与偏差的关系
干预可能产生新的偏差:
do(环境.温度 = 0.9) // 强制高温
→ 加热器.功率规则的条件不再满足
→ 温度持续高位
→ 产生「过热偏差」
偏差流在干预后正常工作,干预产生的偏差被观测和收敛。这符合 A1 容错存续公理。
六、干预语义的应用场景
6.1 政策推演
// 如果提高公交发车频率,拥堵会缓解吗?
反事实: 在 Tick 100 时 do(公交.发车频率 = 0.8), 推演 200 个Tick, 对比 城市.拥堵指数
6.2 故障归因
// 温度失控是加热器故障还是传感器故障?
归因: Tick 50 到 Tick 80 的 环境.温度 异常中,
多少归因于 加热器.功率? 多少归因于 传感器.读数偏差?
6.3 策略对比
// 方案A: 提高限速 vs 方案B: 增加车道
对比 do(道路.限速 = 0.8) vs do(道路.车道数 = 0.7),
推演 100 个Tick后的 路段.平均车速 和 事故率
6.4 「如果当时」分析
// 如果当时没有启动应急响应,损失会更大吗?
反事实: 在 Tick 30 时 do(应急响应.启动 = 0.0), 推演 50 个Tick, 对比 灾害.损失指数
七、干预语义的计算复杂度
| 操作 | 复杂度 | 说明 |
|---|---|---|
| 单变量干预 | O(R × C × H) | R=规则数, C=条件数, H=推演长度 |
| 多变量干预 | O(R × C × H) | 与单变量相同(入边批量移除) |
| 反事实查询 | O(R × C × H) | 需先加载快照 |
| 因果效应估计 | O(K × R × C × H) | K=干预值采样数 |
| 路径特定效应 | O(P × R × C × H) | P=路径数(可能指数级) |
干预推演的成本与正常运行相同数量级,因为干预只是禁用部分规则,不增加计算量。
八、与现有语言特性的整合
8.1 与 When 的关系
When是观察性的(L1),回答「条件满足时做什么」do是干预性的(L2),回答「强制改变后会怎样」- 两者互补:When 定义系统规则,do 用于实验和分析
8.2 与 Track 的关系
Track 的趋势预测是观察性预测(基于历史趋势外推)。干预后的预测需要用 do-语义重新推演,不能直接用 Track 的预测结果。
8.3 与 Evolve 的关系
Evolve 的影子验证是干预的特例(干预参数)。干预语义为 Evolve 提供了更通用的实验框架。
8.4 与 VVUQ 的关系
干预和反事实是 VVUQ 中「模型确认」的核心工具:
- 干预实验可用于验证模型的因果机制是否符合领域知识
- 反事实预测可用于 out-of-sample 检验
- 因果效应的不确定性可通过 ensemble 干预量化
九、未解决问题与研究方向
- 反馈回路中的干预:因果图存在环时,do-算子的标准 DAG 理论不直接适用,需扩展到循环因果模型
- 路径特定效应的计算:在反馈回路中,特定路径的效应如何隔离和度量
- 干预的不确定性:干预值本身可能有不确定性,如何传播到反事实结果
- 多主体干预:微域大量个体同时干预时,宏观效应的聚合方法
- 干预的伦理边界:政策推演中的干预可能涉及敏感决策,需要声明干预的假设和局限
十、总结
元序的因果机制从 L1(观察性关联)推进到 L2(干预)和 L3(反事实):
- L1:
When规则,观察条件满足度,触发动作(已实现) - L2:
do(X=x),强制赋值并切断入边,推演干预效应(本文档定义) - L3:
反事实,从历史快照出发施加干预,对比实际轨迹(本文档定义)
干预语义不是对 When 的替代,而是补充:When 定义系统如何运行,do 和反事实让用户能够对系统进行实验和归因。这是元序从「规则建模语言」到「因果推演语言」的关键一步。
文档版本: WorldScript Intervention Semantics v1.0
创建日期: 2026-09-03
关联文档: 《14形式化语义》第八章、《04元序规则》、《16验证与确认体系》
实现状态: 理论定义完成,M3 阶段实现
哲学基础: Pearl 结构因果模型、因果关系阶梯

浙公网安备 33010602011771号