符号表达式与符号运算
数值计算回答“给定输入后结果是多少”,符号运算保留未知量与关系,回答“结果由哪些输入、按照什么规则得到”。这层能力既服务优化建模,也可以服务指标计算和规则解释,不依赖 LLM。
1. 表达式不是文本公式
把公式保存成字符串会丢失类型、引用和作用域信息。抽象语法树(AST)用节点表达常量、引用、算术、比较与逻辑结构。以下是概念节点,不是 Kotlin/Rust API 名称:
LessEqual
├─ Add
│ ├─ Multiply(Constant(2), Reference(production[A]))
│ └─ Multiply(Constant(3), Reference(production[B]))
└─ Reference(labor.capacity)它表示
2. 三类容易混淆的对象
| 对象 | 职责 | 示例 |
|---|---|---|
| 业务规则 | 保存业务对象、单位、时间与来源 | 本班次工时不得超过 8 小时 |
| 符号表达式 | 保存数学结构与引用 | |
| 求解模型 | 指定变量域、约束、目标及可执行表示 | 非负整数产量的线性模型 |
数学 AST 能表示某个函数,不代表所选优化后端能够处理它。变量乘变量不能仅因为 AST 构造成功,就被放进只支持线性的路径。
3. 求值、绑定与部分求值
若
求值环境需要区分“未绑定”“无效值”和“值为零”。缺失产量不能默认为零;除数为零不能因化简而消失。布尔表达的未知值也不能自动当作 false,除非该语言明确采用并记录了这种语义。
当规则复用到另一个班次时,绑定的是新的
4. 规范化与等价性的条件
将
具名中间值可以使表达依赖形成有向无环图,而不必重复复制整棵树。共享节点不等于共享一个可变求值缓存;缓存与模型运行、输入及线程边界需要分离。循环定义如
5. 贯穿例子:工时指标的两种使用
概念、变量与中间值
产品集合
数据断言要求系数为正、预算非负。优化模型可以增加:
数值路径与建模路径
数值路径绑定已有方案
这也是把表达式做成可复用组件的价值:业务指标可以服务方案展示、约束构造和结果核对,而不需要分别维护三套公式。
6. 依赖、缓存与业务身份
依赖收集回答表达式引用了哪些字段或符号,可用于确定重新绑定范围。缓存键应包含表达结构、参数值或参数槽约定、数值语义、业务数据版本及转换策略。
表达式结构相同不等于输入相同,也不等于权限相同。缓存一份表达求值计划不是缓存最优解。原始规则身份应独立于规范化后的哈希,以便错误和结果回到业务规则。
继续阅读类编译器架构与模型转换了解表达怎样进入求解模型;LLM 技术路径说明受控业务输入如何使用这一层。