# 声明的分样与处理模型

本模型的任务是检测范围与处理历史能否同时成立。输入为单一 Ca–碳酸盐–Na–Cl–水源样，不包括未跟踪强离子或其他盐、络合剂、有机碱度。TA 为本体系总碱度；源样必须满足电中性所要求的 `2 Ca + Na - Cl - TA = 0`。这是已知守恒关系，不是新化学定律。

每个状态有已知体积 V 和物质量向量 n = [Ca, DIC, TA, Na, Cl]；前四种物质量中的 TA 使用当量，其余使用 mol。实现以 µL、nmol 和 neq 缩放。源样 n = c × V / 1,000,000；输出 c = n × 1,000,000 / V。体积固定为输入整数；不确定的是源样分析值和化学净转移的包含端点范围。

| 操作 | 体积 | 物质量变化 |
|---|---|---|
| `take` | 子样体积 v，0 < v ≤ V | 所有量乘 v/V；同一父样的分配总和不超过其体积。 |
| `dilute` | V + 加入纯水体积 | 物质量不变。 |
| `evaporate` | V − 失水体积，必须仍有液体 | 物质量不变；挥发或矿物转移必须单独声明。 |
| `co2` | 不变 | δ × [0,1,0,0,0]，正值进入水相。 |
| `calcite` | 不变 | δ × [1,1,2,0,0]，正值溶解、负值移出溶解态。 |
| `hcl` | V + 加酸液体积 | δ × [0,0,−1,0,1]，δ ≥ 0。 |
| `naoh` | V + 加碱液体积 | δ × [0,0,1,1,0]，δ ≥ 0。 |

纯水体积与加样体积被认为可直接相加。零体积试剂输入表示忽略加样体积的显式理想化；真实样例保留已知加样体积。未建模体积收缩、密度、未知蒸发量或未声明的气体交换。`calcite` 的符号只描述净计量，不能证明饱和、析出、速率或物理可能性。

一段处理可以只有一个后续步骤；有多个后续步骤时，每个后续必须是显式 `take`，表示真实液体分配。处理状态上的检测对应当时浓度；父节点检测视为不改变物质量的状态约束，破坏性取样需显式建 `take`。未分配剩余液体可以不追踪，不能再用父瓶创建重复全量样品。

每个不确定源样值只创建一个参数，每个不确定处理剂量也只创建一个参数。子节点继承同一个参数，不能为每个检测分别重选上游剂量。固定体积使各节点物质量与浓度都是这些参数的仿射式。

所有参数范围、源样电中性、各状态 Ca/DIC/Na/Cl 非负、每个实际样瓶的检测范围组成 `A x <= b`。TA 可以为负，不把酸性水错误拒绝。没有求物种质量作用、pH 或活度的迭代，也没有拟合目标。内部使用已知的精确分数与 Fourier–Motzkin 消元：

- 存在解时回代一个共同参数向量，重新核对每条输入约束，再输出所有节点的精确浓度。
- 不存在解时输出非负权重 w，满足 wA=0、wb<0。将这些原始约束相加即为矛盾；这是已有 Farkas 原理，不宣称新证明方法或最小冲突集。
- 超过 2,048 行、单次投影 20,000 对或 2,048-bit 分数预算时返回未决；输入另限 10 个不确定量、16 步、32 项检测。没有舍入容差把边界外的值变成可行。

`challenge_zero_transfer` 先检查基线。基线可行后，对请求的**全部**化学步骤附加 δ=0，再检查共同可行性。排除该解释只说明所选步骤至少一项需要非零净转移，并不说明每项都发生，更不说明真实因果；基线本就冲突时返回 BaseConflict。净零允许正逆过程相抵，不能解读成完全没有反应。

科学先例包括碳酸盐守恒和逆向地球化学物料衡算。PHREEQC 的 inverse modeling 也处理水样与反应转移；本项目没有把逆向地球化学称为新领域。可审查的增量限定为上述分样身份、共享上游量、反离子与零净转移解释的 MoonBit 任务实现。
