wyrm-math: 一个条件健全的符号代数引擎

wyrm-math: 一个条件健全的符号代数引擎

wyrm-math 支持健全的可操作数学接口

wyrm-math 是一个条件健全的符号代数引擎,旨在构建交互式数学接口,用户可以通过操作项(例如将项移过等号或展开幂)来求解方程。与验证最终答案的传统求解器不同,wyrm-math 通过构造确保每个可达状态都是健全的,这意味着非法操作在设计上就是不可能的。

核心架构:通过构造实现健全性

该引擎的工作原理是方程永远不会被验证;它们仅通过重写规则进行转换。这确保了用户到达的任何状态在数学上都是有效的。

条件健全性与假设

由于某些代数操作仅在特定条件下有效,wyrm-math 将这些条件视为一等公民的 Assumptions(假设)。这些假设随方程一起移动,以维护数学完整性:

  • Restrictions(限制):可能导致丢失解的操作(例如,除以变量 b 需要假设 b ≠ 0)。
  • Extensions(扩展):可能引入增根的操作(例如,两边平方),这些操作带有必须通过 checkSolution 过程来解决的义务。
  • Pinned Assumptions(固定假设):用户定义的“如果...会怎样”场景(例如,固定 x = 0)。

精确算术

为了避免与浮点数运算相关的精度误差,wyrm-math 对所有算术运算使用 bigint 有理数。无理数根(如 √2)被视为未定义点而非近似值,遵循引擎范围内严格的“在两者定义处为真”的健全性契约。

技术实现

该引擎使用纯 TypeScript 构建,零依赖且无需 DOM,旨在在任何环境中运行,包括 Node.js、浏览器、web workers 和原生 webviews。

表达式树与 AST

该引擎使用具有稳定节点 ID 的不可变抽象语法树 (AST)。它采用 N 叉 SumProduct 节点,将减法表示为负数与加法的和,并通过智能构造函数来处理,以维护结构不变性。

操作枚举与布局

该引擎的主要功能之一是 enumerateMoves(judgment),它能够识别当前状态下所有合法的代数功能。这允许 UI 开发人员在可以执行合法操作的准确位置放置手势锚点(句柄和投放目标)。

为了实现平滑动画,引擎提供了 layoutNode,它使用静态度量表将树映射到带位置、以 ID 为键的框和字形。由于子树几何结构与上下文无关,渲染器可以在重写过程中匹配节点并进行刚性动画处理。

功能集与规则库

wyrm-math 包含大约 25 个内置规则,涵盖了广泛的代数运算:

  • Linear Equations(线性方程):基础项移动和同类项简化。
  • Distribution and Fractions(分配律与分数):展开括号和处理分数表达式。
  • Exponent Laws(幂律):关于幂和根号的规则。
  • Inequalities(不等式):感知符号的规则,在乘以或除以负数时翻转关系。
  • Quadratics(二次方程):处理零乘积性质和分支(例如,x² = 9 分支为 x = 3x = -3)。

社区观点与用例

社区讨论强调了 wyrm-math 将代数教育范式从“待解决的问题”转变为“待操作的谜题”的潜力。

"I appreciate how this frames algebra as a puzzle instead of a problem :)"

其他开发者建议将引擎的效用扩展到定理证明和函数式编程中的等式推理,并指出,规则应用的视觉界面可以弥合手动方程与形式化定理证明器之间的鸿沟。此外,一些目前通过 Pyodide 使用基于 Python 的工具(如 SymPy)的开发者也指出了浏览器端 Python 的局限性,以及像 wyrm-math 这样原生 TypeScript 实现的潜在价值。

Sources