consistency 设计

设计目标

luna-poly 承诺其两层及各种表示描述的是同一套数学。consistency 把这一承诺变成随 moon test 运行的测试,放在一个同时依赖两个门面包的包中,这样两层各自的测试都无需了解对方。

数学背景

每种表示 ρ\rho(dense、term、sparse、context;不可变或可变)都带有一个到多项式环的解释 [ ⁣[⋅] ⁣]ρ[\![\cdot]\!]_\rho。一致性是指每个操作都与解释可交换:

[ ⁣[ aopρb ] ⁣]ρ=[ ⁣[a] ⁣]ρop[ ⁣[b] ⁣]ρ,[\![\, a \mathbin{\mathrm{op}_\rho} b \,]\!]_\rho = [\![ a ]\!]_\rho \mathbin{\mathrm{op}} [\![ b ]\!]_\rho ,

并且表示之间的转换保持解释不变。测试在具体输入上检查这些等式的实例。

设计决策

独立的白盒包

这些检查同时需要 immut 和 mutable,而 mutable 已经依赖 immut;把它们放在任何一层都会反转或缠绕依赖关系。一个带白盒测试(core_wbtest.mbt)的专用包仅在测试中导入 Luna-Flow/arithmetic、immut 和 mutable,对公开 API 没有任何贡献。

检查内容

  • 稠密多项式的层间一致性:系数、乘积、复合和求值在 immut 与 mutable 中相等。
  • 自然数幂:PowNatChecked::pow_nat_checked(p, 0, ctx) 在两层中都是一,且 pow(5) 结果一致。
  • 隔离性:在 to_immut 之后修改可变多项式不会改变快照。
  • 多变量一致性:项存储与稀疏存储,无论不可变还是可变,求值结果相同,并产生相同的幂。
  • 能力接口:以 UnivariatePolynomial、MultivariatePolynomial、Zero、One 为约束的函数以及 ops() 记录在两个门面包中都能工作;形状报告预期的元数、项数和相容性。
  • 带检查的契约:*_checked 方法在负下标和过短的求值点上返回 None,而不是中止(abort)。
  • 可变上下文的委托:部分求值及其失败情形与不可变行为一致。

单一表示的代数定律(规范化的幂等性、加法单位元、Karatsuba 与教科书乘法的对照、最小系数界)位于 immut/laws_wbtest.mbt,紧挨着它们所检查的代码。

正确性 / 不变量

该包没有运行时代码。它的不变量是 moon test 通过:上面的每个等式在所测试的输入上都成立。

被否决的替代方案

  • 把测试放在 mutable 内部会让可变层的测试悄悄依赖不可变层的内部实现,而且无法复用于其他层。
  • 对所有表示两两组合做穷举性质测试会成倍增加测试时间;本包只检查有代表性的操作,性质测试仍留在各个定律中。

边界

  • 测试是有限的样本,而不是证明。
  • 没有公开 API;这里没有任何内容是供导入的。