Show HN:Wyrm – 通过触摸解代数,基于开源健全性引擎构建

Hacker News Top 工具

摘要

Wyrm 是一个用 TypeScript 编写的开源符号代数引擎,为 iOS 和 Android 上基于手势的代数应用提供支持。它通过条件重写规则在构建时保证健全性,允许用户通过触摸来解方程。

有一个名为 DragonBox 的手机游戏。它通过让你从非常抽象的谜题操作开始(必须遵循规则)来巧妙地引导你学习代数……逐渐地,游戏教会你越来越多的规则,同时去除更抽象的元素,直到最后几个关卡,你终于能够解真正的方程。我很喜欢它,它教会了我的孩子代数……而且它确实很有趣。<p>多年来,我经常想应该有一款这样的代数计算器……你可以通过手势拖动项、约分和分配,但最重要的是可以输入自己的问题。它还应能处理比 DragonBox 允许的更多类型的问题。所以我最终决定构建它。<p><a href="https:&#x2F;&#x2F;dicroce.github.io&#x2F;wyrm&#x2F;home.html" rel="nofollow">https:&#x2F;&#x2F;dicroce.github.io&#x2F;wyrm&#x2F;home.html</a><p>这是一个展示视频:<a href="https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=_STbS4zvIlU" rel="nofollow">https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=_STbS4zvIlU</a>。如果你更想直接试用,在主页上有一个有限的浏览器内演示(真实引擎,几个示例方程,无需下载)—— <a href="https:&#x2F;&#x2F;dicroce.github.io&#x2F;wyrm&#x2F;home.html" rel="nofollow">https:&#x2F;&#x2F;dicroce.github.io&#x2F;wyrm&#x2F;home.html</a>。<p>该应用可在 iOS(<a href="https:&#x2F;&#x2F;apps.apple.com&#x2F;us&#x2F;app&#x2F;wyrm-math&#x2F;id6782342042">https:&#x2F;&#x2F;apps.apple.com&#x2F;us&#x2F;app&#x2F;wyrm-math&#x2F;id6782342042</a>)和本周起在 Google Play(<a href="https:&#x2F;&#x2F;play.google.com&#x2F;store&#x2F;apps&#x2F;details?id=com.dicroce.wyrm">https:&#x2F;&#x2F;play.google.com&#x2F;store&#x2F;apps&#x2F;details?id=com.dicroce.wy...</a>)上找到。<p>我还决定将底层的数学引擎开源,以便其他人可以基于它构建:<a href="https:&#x2F;&#x2F;github.com&#x2F;dicroce&#x2F;wyrm_math" rel="nofollow">https:&#x2F;&#x2F;github.com&#x2F;dicroce&#x2F;wyrm_math</a>。顺便说一下,我对这个引擎的目标是要一直构建到微积分。<p>盈利模式刻意保持简单:引擎是免费的(MIT 许可证),精良的手势应用一次性收费 4.99 美元。没有订阅、广告、账户或分析。<p>我非常希望得到关于引擎设计的反馈——尤其是来自那些从事过 CAS 或证明助手相关工作的朋友。如果你小时候玩过 DragonBox 并希望它更进一步,那么这就是为你准备的!
查看原文
查看缓存全文

缓存时间: 2026/07/10 21:13

dicroce/wyrm_math

来源:https://github.com/dicroce/wyrm_math

wyrm-math

一个精确的、条件性完备的符号代数引擎,用于构建操作型数学界面——用户通过拖拽项越过等号、点击幂次进行展开,或从两项中提取公因式等方式求解方程。

核心不变式:合法操作可行,非法操作不可行。 方程从不会被验证——它们仅通过重写规则进行变换,因此每个可达状态在构造上都是完备的。而完备性是条件性的:仅在特定条件下有效(如除以 b 要求 b ≠ 0)或可能引入增根的操作(如两边同时乘方、平方)并不会被禁止——其条件会成为一等公民、可见的假设(Assumption),并随方程一同传播。

纯 TypeScript,零依赖,零 DOM——可在 Node、浏览器、Web Worker、原生 WebView 等任何环境中运行。

wyrm-math 是 Wyrm Math 的底层引擎,这是一款面向 iOS 和 Android 的手势代数应用——请尝试在线演示或获取应用 (https://dicroce.github.io/wyrm/home.html)。引擎采用 MIT 许可证;应用是项目自我维持的方式。

import {
  parseEquation, Derivation,
  enumerateMoves, ruleById, layoutNode, exprToString,
} from "wyrm-math";

const d = new Derivation(parseEquation("2x + 3 = 11"));

// 用户当前可以合法执行哪些操作?
const moves = enumerateMoves(d.current);

// 将 3 拖过等号(UI 选择一个 Move;引擎保证该操作合法——枚举时已进行前置条件检查):
const move = moves.find((m) => m.ruleId === "move-term-across")!;
d.apply(ruleById(move.ruleId), move.location, move.params);

console.log(exprToString(d.current.equation)); // 2x = 11 + -3

// 以任意方式渲染:layoutNode 从静态度量表中返回带有位置、id 键的框和字形(无需测量字体)。
const layout = layoutNode(d.current.equation);

内部模块

公共 API 位于 src/index.ts,组织为十个文档化的分组——读起来就像目录:

分组功能
表达式树具有稳定节点 ID 的不可变 AST。N 元 Sum/Product;无减法或除法节点(a − b 表示为 Sum(a, Neg(b));除法是一个带有分子/分母列表的 Fraction)。智能构造函数维护结构不变性。
精确算术基于 bigintRational。任何地方都不使用浮点数——√2未定义点,而非 1.4142。
求值truthValue(equation, env) 在采样点上精确判定任意关系(= < ≤ > ≥),若一侧未定义则返回 undefined
解析与打印parseEquation("2x + 3 = 11")exprToString——通过属性测试保证往返一致性。支持隐式乘法、分数、幂、根式;拒绝小数(引擎是精确的)。
判定与假设状态的基本单位是 { assumptions, equation }限制(Restrictions)(可能丢失解的操作:如 b ≠ 0),扩展(Extensions)(可能增加解的操作:携带原方程作为义务,通过 checkSolution 解决),固定(Pinned)(用户假设场景)。被解除的假设会被记录,但永不删除。
规则与推导Rule.apply 是方程发生变化的唯一方式。推导日志是仅追加的:撤销操作移动指针,废弃分支仍保持活跃,情况分支和析取分支会分叉为活跃的兄弟节点。
内置规则约 25 条规则,涵盖线性方程、合并同类项、分配律、分数、指数法则、不等式(符号感知、关系翻转)和二次方程(x² = 9 分支为 x = ±3;零积性质)。每条规则都附带属性测试,验证其在假设下保持解集不变。
操作枚举enumerateMoves(judgment) 返回每个合法的操作,并附带手势锚点(handledropTarget)。对所有规则都是完备的(有限规则集)。固定 x = 0 后,所有除以 x 的操作会自动消失。
布局几何layoutNode 将树映射为带有位置、id 键的框和字形(分数堆叠、上标、根号),使用静态度量表。hitTest 是几何查询。子树的几何布局在平移+缩放意义下与上下文无关——这正是基于 id 键的动画成为可能的原因。
规则编写工具包保留 ID 的重建、修复不变量的拼接操作、差异簿记以及假设生命周期查询,用于编写新规则。

ARCHITECTURE.md 深入解释了不变量和契约。

设计承诺

  • 精确性。 所有算术都是基于 bigint 的有理数。表达式未定义的点(除以零、无理根)被视为未定义,绝不近似。引擎级完备性契约是在两侧都定义时判断真值
  • 稳定 ID。 每个节点都有一个 ID;操作会保留未改动子树的 ID。这是命中测试和动画的基础:渲染器可以跨重写匹配节点,并刚性移动它们。
  • 条件性完备。 对于常规规则和产生限制的规则,属性测试在满足结果判定假设的替换上拒绝采样,并断言真值保持不变。对于产生扩展的规则,检查弱化为一个方向(解不会丢失),通过 checkSolution 覆盖增加解的义务。
  • 析取。 分支规则返回多个结果,这些结果的解集合集等于原解集(x² = 9x = 3 x = −3);推导树将所有分支作为活跃、可导航的状态保存。

开发

pnpm install
pnpm test        # vitest + fast-check(属性测试是此项目的灵魂)
pnpm typecheck
pnpm build       # 输出 dist/(ESM + d.ts)

引擎必须保持无 DOM:tsconfig.json 不包含 DOM lib,且 test/boundary.test.ts 会扫描源码中是否有浏览器全局变量。

许可证

MIT

相似文章

Show HN: 我用Swift构建了LangGraph

Hacker News Top

Swarm是一个用于构建代理工作流和多智能体系统的Swift框架,具备类型安全的工具调用、持久化检查点以及对多种LLM提供商的支持。

Show HN: Starglyphs - 基于欧拉路径的星座谜题游戏

Hacker News Top

一位独立开发者制作了 Starglyphs,这是一款基于欧拉路径的程序化生成星座谜题游戏,灵感来自《龙腾世纪:审判》的星象仪小游戏。网页版已上线,Steam 和移动版本正在开发中。

Scheme 是一个 Hoot

Lobsters Hottest

作者分享了学习 Scheme 并使用 Hoot 将其编译为 WebAssembly 的经验,虽然遇到了稳定性问题,但成功在浏览器中运行了物理模拟。