LSR 010 - 虚数单位与复数规范 ================================================================================ 基本信息 -------------------------------------------------------------------------------- - LSR 编号 010 - 标题 虚数单位与复数规范 - 作者 Ziyang-Bai - 状态 草案 - 类型 标准规范 - 创建日期 07-28-2026 - 归属项目 编译器、标准库、CAS 摘要 -------------------------------------------------------------------------------- 定义虚数单位 ``i``、复数字面量、复数类型提升和 ``Expr`` 中复数的表示边界。 技术规范 -------------------------------------------------------------------------------- 1. 设计目标 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - 明确 ``3 + 4i`` 的语法含义 - 避免虚数单位与普通变量或 ``sym`` 声明冲突 - 保持 ``Complex (C) ⊂ Expr`` 的数值塔规则 - 为 LMCAS 提供稳定的复数表达接口 2. 虚数单位 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ``i`` 是预定义虚数单位,满足: .. code-block:: text i^2 == -1 规则: - ``i`` 是预定义常量,不是普通变量 - 用户不得在同一作用域重新绑定 ``i`` - ``sym i`` 非法,必须报错 ``ImaginaryUnitReserved`` - 标准库可同时导出 ``std.math.i`` 与 ``std.math.I``,二者表示同一虚数单位 3. 复数字面量 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 虚数字面量由数值字面量紧跟后缀 ``i`` 构成,中间不得有空白。 .. code-block:: text let a = 4i let b = 3 + 4i let c = -2.5i let d = 1/2 + 3/4i 规则: - ``4i`` 等价于 ``4 * i`` - ``3 + 4i`` 等价于复数 ``complex(3, 4)`` - ``3 + 4 * i`` 同样合法,但按普通乘法解析 - ``4 i`` 非法,必须报错 ``ComplexLiteralSpacing`` 4. 复数类型 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ``complex`` 表示复数值,逻辑结构为实部与虚部: .. code-block:: text complex = real_part + imaginary_part * i 规则: - 实部和虚部均为数值类型 - 数值塔中 ``R ⊂ C`` - 实数与复数二元运算时,实数自动提升为复数 - 复数参与 ``Expr`` 运算时整体提升为 ``Expr`` 5. 与 ``Expr`` 的关系 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 当复数进入 ``Expr``,它必须作为明确的复数表达式保留,不得拆成普通变量 ``i``。 .. code-block:: text sym x let z = x + 2i # Expr 规则: - ``i`` 在 ``Expr`` 中仍表示虚数单位 - CAS 后端应提供虚数单位节点或复数节点 - ``i`` 不参与普通符号变量绑定 - ``Expr`` 降级为 ``complex`` 必须显式求值,且表达式中不得有未绑定符号 6. 相等性 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 结构相等 ``==`` 与数学等价 ``===`` 分别遵循 LSR-000 和 LSR-007。 .. code-block:: text (i * i) === -1 # true,若当前等价 profile 支持复数基础规则 规则: - ``i^2 -> -1`` 属于复数基础规则 - 复数结构相等比较实部与虚部 - ``Expr`` 中复数等价判定仍受预算限制 7. 标准库要求 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ``std.math`` 必须暴露: .. list-table:: :header-rows: 1 * - 名称 - 类型 - 说明 * - ``i`` - ``complex`` - 虚数单位 * - ``I`` - ``complex`` - ``i`` 的别名 * - ``complex`` - ``func complex(re num, im num) -> complex`` - 构造复数 * - ``real`` - ``func real(z complex) -> num`` - 实部 * - ``imag`` - ``func imag(z complex) -> num`` - 虚部 * - ``conj`` - ``func conj(z complex) -> complex`` - 共轭 * - ``abs`` - ``func abs(z complex) -> num`` - 模长 8. 错误模型 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - ``ImaginaryUnitReserved``: 尝试绑定或声明 ``i`` - ``ComplexLiteralSpacing``: 虚数字面量后缀前存在非法空白 - ``ComplexTypeMismatch``: 复数操作收到不兼容类型 - ``ComplexEvalUnboundSymbol``: ``Expr`` 降级为 ``complex`` 时存在未绑定符号 9. 与其他 LSR 的关系 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - LSR-000:声明 ``complex`` 类型、数值塔和 ``3 + 4i`` 示例 - LSR-004:``std.math`` 应暴露复数相关常量与函数 - LSR-007:``Expr`` 上复数等价判定由有限规则和预算约束 - LSR-009:复数结果可出现在 ``set`` 或 ``set`` 中