LSR 010 - 虚数单位与复数规范

基本信息

  • LSR 编号 010

  • 标题 虚数单位与复数规范

  • 作者 Ziyang-Bai

  • 状态 草案

  • 类型 标准规范

  • 创建日期 07-28-2026

  • 归属项目 编译器、标准库、CAS

摘要

定义虚数单位 I、复数字面量、num 上的 complex 值约束,以及复数主值、顺序和符号运算边界 [1] [2]。复数与精确数、符号表达式和近似值共用数学基本静态类型 num。

技术规范

1. 设计目标

  • 明确 3 + 4I 的语法含义

  • 避免虚数单位与普通变量或 sym 声明冲突

  • 在统一的 num 数学值语义中保留实数与复数的数域区别

  • 为标准库及 CAS 提供复数构造、主值函数和集合多结果的确定语义

2. 虚数单位

I 是预定义虚数单位,满足数学关系 I^2 == -1。

  • I 的基本静态类型是 num,其值满足 complex 约束

  • I 是预定义常量,不是普通变量;用户不得在同一作用域重新绑定它

  • sym I 非法,必须报错 ImaginaryUnitReserved

  • 小写 i 是普通标识符,可以作为变量名或通过 sym i 声明为符号

  • 标准库在 std.math 中以 I 导出同一常量;该导出不创建另一个虚数单位

3. 复数字面量

虚数字面量由数值字面量紧跟后缀 I 构成,中间不得有空白。

let a = 4I
let b = 3 + 4I
let c = -2.5I
let d = 1/2 + 3/4I
  • 4I 等价于 4 * I

  • 3 + 4I 等价于 std.math.complex(3, 4) 所构造的数学值

  • 3 + 4 * I 同样合法,按普通乘法解析

  • 4 I 非法,必须报错 ComplexLiteralSpacing

  • 虚数字面量及其组合的基本静态类型均为 num;有限小数字面量默认精确,不因虚数后缀进入近似计算

4. 复数值约束

complex 表示 num 上的复标量值约束,不是独立基本数学类型。real、int、frac 同样是数学值约束;在数域意义上实数属于复数,但不存在从一种基本静态数学类型到另一种类型的自动提升。

use std.math.{conj}

func conjugate(z complex) -> complex {
    return conj(z)
}

let a complex = 3 + 4I
let b num = a + 2

a、b 及函数参数、返回值的基本类型均为 num。z complex 与 -> complex 分别要求参数及返回值为复标量。vector<complex> 表示元素满足该约束的 vector<num>,不创建独立复数容器基本类型。

约束参与调用及返回校验:静态可证时提前检查,其余在运行期验证。确定违反约束报 DomainError 或 InvalidArgument,仍未决报 Inconclusive。具有相同基本签名及参数个数的函数不能仅凭 real、complex 等值约束静态分派,也不提供自动按值重载。

函数类型兼容还须保留参数值约束及量纲契约,不能仅因基本类型同为 num 就把受约束参数放宽。

复数可写为实部与虚部的数学组合 a + b*I,其中两部分满足 real 约束。实现可使用复数数值表示或符号节点,不强制固定存储布局;涉及 FFI 时由其显式 ABI 声明另行规定表示和范围检查。

5. 符号、精确值与近似值

sym 默认声明复数标量符号;实性、正性和整数性通过显式假设或约束提供 [3]。

use std.math.{conj}

sym x
let z num = x + 2I
let c num = conj(z)
  • I 始终表示虚数单位,不参与普通符号变量绑定

  • 精确实数与精确复数运算默认精确、保域;支持域内不能完成的数学调用可保留未求值式

  • 带未绑定数学符号的表达式仍是合法 num,不需要转换到另一种符号基本类型

  • 具体数值提取接口可要求所有必要符号已绑定;未满足时按该接口的错误契约诊断,不进行所谓类型降级

  • 只有显式 std.math.approximate(value, precision=100) 进入近似,精度为目标十进制有效位数 [2]

  • 有近似操作数时发生局部近似传播,采用参与近似值的最高工作精度,未知符号部分继续保留;提高工作精度不恢复输入已经丢失的精度

6. 主值与顺序

复平方根、复对数及复非整数幂是单值主值函数:

  • 对非零复数采用主辐角 Arg(z) ∈ (-π, π]

  • log(z) = ln(|z|) + I*Arg(z);log(0) 无定义

  • sqrt(z) 取实部非负的平方根;实部为零时取虚部非负者,且 sqrt(0) = 0

  • 非零底数的复非整数幂按 z^w = exp(w*log(z)) 的主值解释;整数幂遵循整数幂定义,零底数的有效指数域按核心数学规则处理

不得把单值主值函数的结果解释为全部根或全部分支。所有根或解由显式集合求解接口返回,元素基本类型为 num [4]。

复数不提供与实数顺序兼容的无条件 <、<=、>、>=。顺序关系及排序必须满足实数等已声明有序数域的条件:已知非实复数参与实序比较时报告 DomainError;数域尚未确定时可保留符号关系,不能任意选取按实部、模长或存储布局的次序。若普通控制流必须判真而仍未决,报告 Inconclusive [1]。

7. 关系、结构与等价

复数作为 num 遵循同一比较规则 [3] [5]:

  • ==、!= 构造 num 数学关系

  • std.cas.same_structure 返回结构查询的 bool;精确数字叶按数学数值比较,不依赖内部复数布局

  • === 与 std.cas.equivalent 返回固定三态 std.cas.Equivalence,证明未决是 cas.Unknown

  • 精确值与近似值无损比较各自现有存储数值,不预先舍入或加入容差;结论不追溯至近似前原式

import std.cas

let relation num = I * I == -1
let proof = (I * I) === -1
let proved bool = proof == cas.Equivalent

I^2 -> -1 属于 Core 基础规则,因此该例的 proof 为 cas.Equivalent。近似节点的结构比较还区分近似类别和工作精度,并与精确叶区别。

8. 标准库要求

std.math 必须暴露以下接口。签名中的 real、complex 均为 num 值约束,不是基本类型:

名称

声明

说明

I

num,满足 complex

虚数单位

complex

func complex(re real, im real) -> complex

以实部与虚部构造复标量

real

func real(z complex) -> real

实部

imag

func imag(z complex) -> real

虚部

conj

func conj(z complex) -> complex

共轭

abs

func abs(z complex) -> real

非负模长

函数名 complex、real 在调用位置分别表示构造或查询函数,在标注位置表示值约束。已声明数学函数可按其支持域返回未求值的 num 调用;不能因期望数学值而吞掉未绑定函数名。

9. 错误模型

  • ImaginaryUnitReserved:尝试绑定或声明 I

  • ComplexLiteralSpacing:虚数字面量后缀前存在非法空白

  • ComplexTypeMismatch:复数接口收到不兼容的基本类型

  • DomainError / InvalidArgument:确定违反复标量、实部或有序数域等要求

  • Inconclusive:必须验证的值约束或控制流条件仍未决

具体数值提取遇到未绑定符号时可报告 ComplexEvalUnboundSymbol,但普通符号数学运算不得因此报错。数学错误及运行时故障按 LSR-018 传播 [6]。

10. 引用