LSR 004 - 标准库¶
基本信息¶
LSR 编号 004
标题 标准库
作者 Ziyang-Bai
状态 草案
类型 标准规范
创建日期 02-04-2026
归属项目 通用
摘要¶
定义 Lamina 标准库(std )的模块结构、导入与调用规则、数学核心 API 和错误模型;扩展模块可补充标准库实现 [3]。
技术规范¶
1. 设计目标¶
统一、稳定、可组合的标准 API
对齐 LSR-000 [1] 的静态强类型与单位系统
覆盖数学核心能力(数值、线代、统计、随机、单位)
同名函数跨平台语义一致
2. 命名空间与模块结构¶
标准库顶级命名空间固定为 std。
模块 |
作用域 |
说明 |
|---|---|---|
|
通用数学 |
初等函数、三角函数、指数对数、舍入、数值辅助 |
|
符号数学 |
数学等价、结构查询、保域化简、符号代入与重写,接口见 LSR-016 [7] |
|
线性代数 |
矩阵分解、求解、逆、行列式、特征值 |
|
统计 |
描述统计、分位数、协方差、相关系数 |
|
随机数 |
伪随机引擎、分布采样、种子控制 |
|
单位工具 |
单位转换辅助与量纲工具函数 |
|
常量集 |
统一暴露 LSR-002 [2] 常量 |
|
基础 I/O |
文本输入输出与格式化 |
|
数学错误 |
固定内建 |
规则:
模块名称与路径大小写敏感
std根命名空间保留;用户模块定义在非std命名空间
3. 导入与库调用约定¶
3.1 导入语法¶
import std.math
import std.linalg as la
use std.math.{sin, cos, pi}
use std.constants.{G as GRAVITY}
规则:
import a.b绑定模块对象到当前作用域(默认名为末段标识符)import a.b as x使用别名绑定模块对象use a.b.{x, y as z}导入符号;若与当前作用域重名则编译报错
3.2 调用约定¶
let y = math.sin(math.pi / 2)
let detA = la.det(A)
规则:
模块函数调用统一使用
module.func(args...)对
use导入的符号可直接调用标准库函数以纯函数语义为默认,参数只读
参数绑定、具名实参与源码顺序求值遵循 LSR-000 [1];绑定完成后检查值约束
容器保持值语义;参数只读不代表返回值与输入具有可观察的共享身份
3.3 . 规则¶
. 用于命名空间路径与成员访问;import/use 中路径与符号选择均使用 .。
import std.math
use std.math.{sin, cos, pi}
let a = math.sin(pi / 2) # '.' 成员访问
let b = sin(pi / 2) # 通过 use 导入后可直接访问
规则:
import a.b/use a.b.{...}中的.表示命名空间路径运行期表达式的
a.b表示成员访问(模块对象、表、对象)
4. 数学系统¶
数学基本静态类型统一为 num,包括精确数、符号表达式、关系与近似值;
vector、matrix、set 保留结构类型,数学元素均为 num。
int、frac、real、complex 是整数、有理数、实标量、复标量值约束,
并非独立基本数学类型。-> int、vector<int> 分别约束结果或各元素,
其基本类型仍为 num、vector<num>。这些约束参与调用/返回检查,
不能使基本签名和参数个数相同的函数仅按值约束静态分派。
静态可证明时提前检查;确定违反约束报告 DomainError 或 InvalidArgument,
仍无法确定报告 Inconclusive。整数索引、尺寸、随机种子等还必须可具体求值,
不能只凭底层小整数表示或符号整数性决定可用性。
函数值的参数和值返回仍检查完整约束及量纲契约;不能因底层 num 相同而放宽受约束参数。
数学 API 默认精确、保域,支持的数学运算可返回未求值式,不自动把精确输入改成浮点数。
在已声明数学调用的支持域内,精确算法尚不能完成或成立条件未决时保留调用;
确定无定义的运算报告错误。普通副作用函数、未绑定名称及参数错误不得借此自动延迟。
sym 默认复数标量,实性、正性和整数性由假设或约束提供。
复数平方根、对数和非整数幂采用单值主值;全部根和解由集合求解接口表达。
复数没有无条件的实数顺序;取整、排序、分位数和区间判定须满足相应实数域及顺序条件。
默认化简保留原定义域。x/x、0*(1/x) 的消去须有局部非零及定义性前提;
显式形式代数入口见 std.cas.simplify_formal [7],不得把它当成普通数学调用的默认策略。
4.1 std.math¶
std.math 的复数常量与复数函数语义见 LSR-010 [6]。pi、e、phi
是精确数学常量,不是隐藏的机器浮点近似。
函数 |
签名 |
说明 |
|---|---|---|
|
|
绝对值 |
|
|
平方根 |
|
|
幂 |
|
|
指数函数 |
|
|
自然对数 |
|
|
常用对数 |
|
|
正弦 |
|
|
余弦 |
|
|
正切 |
|
|
反正弦 |
|
|
反余弦 |
|
|
反正切 |
|
|
向下取整 |
|
|
向上取整 |
|
|
舍入到最近整数,同距时远离零 |
|
|
截断到有序实区间,要求 |
|
|
显式请求目标十进制有效位数;两个参数均必需 |
approximate 是精确数学进入近似计算的显式入口;通过 use 导入后可直接调用。
precision 必须是可具体求值的正整数,表示目标十进制有效位数,
不是字节数、二进制位数、显示小数位数或量纲。不提供省略精度的一参形式;
下例的 100 是显式实参,不是默认参数。具名实参采用普通调用规则:
use std.math.{approximate}
let third = approximate(1/3, precision=100)
成功时按请求工作精度计算支持的可求值部分,保留近似标记和目标工作精度; 未知符号部分仍保留,不用默认值补齐。不能在所请求精度下完成时必须报告错误, 不得以机器双精度冒充高精度成功。不保证正确舍入或认证误差界, 误差估计与认证接口是可选扩展。已有近似输入提高工作精度不会恢复已丢失的信息。
包含近似操作数的该次数学运算采用参与近似值中的最高工作精度, 其可求值的精确子项按需要数值化;尚未绑定或暂不可求值的符号部分保留。 其他未参与该次运算的精确值保持原值。精确/近似比较无损比较现有存储数值, 不先舍入,也不引入容差;结论仅关于表示值,不把显示小数重新解析成原式的精确值。
use std.math.{approximate, sqrt}
let a = approximate(sqrt(2), precision=100)
let mixed = a + sqrt(3)
在支持的可求值域内,mixed 按 100 位十进制工作精度近似求值;
表达式中的 sqrt(3) 按需要参与该次计算,既有精确值不被原地改写。
approximate 对数学向量/矩阵按相同规则逐元素作用,保留形状及静态量纲;
它不把数学容器变为普通数组,也不改变单位。其对应重载的参数和结果基本类型均保持
vector<num> 或 matrix<num>。
func approximate(value vector<num>, precision int) -> vector<num>
func approximate(value matrix<num>, precision int) -> matrix<num>
4.2 std.linalg¶
函数 |
签名 |
说明 |
|---|---|---|
|
|
返回维度 |
|
|
非共轭转置 |
|
|
共轭转置 |
|
|
行列式(方阵) |
|
|
矩阵逆(方阵) |
|
|
矩阵秩 |
|
|
迹 |
|
|
解 |
|
|
解 |
|
|
按顺序返回(特征向量矩阵,特征值对角矩阵) |
|
|
按顺序返回 |
语义对齐:
solve_left(A, B)与运算符A \ B等价solve_right(B, A)与运算符B / A(矩阵语义)等价eig与svd的各分量按固定位置组成单个元组 [9]精确输入默认走精确数学语义,不能因选用数值后端而隐式调用
approximate; 只能近似求解的接口须明确要求近似输入或显式近似请求,不能静默降精度奇异性或分支条件未决时保留所支持的数学调用;已证明奇异时报告
SingularMatrix
import std.linalg
let (eigenvectors, eigenvalues) = linalg.eig(A)
let (U, S, V) = linalg.svd(A)
4.3 std.stats¶
函数 |
签名 |
说明 |
|---|---|---|
|
|
均值 |
|
|
中位数 |
|
|
方差 |
|
|
标准差 |
|
|
分位数 |
|
|
协方差 |
|
|
相关系数 |
4.4 std.random¶
函数 |
签名 |
说明 |
|---|---|---|
|
|
设置随机种子 |
|
|
|
|
|
区间整数采样 |
|
|
正态采样 |
|
|
离散采样 |
随机引擎是有状态的例外,不适用纯函数默认规则。种子和 randint 端点须为可具体求值的整数;
要求 lo <= hi,整数采样结果是精确整数。rand 与 normal 是显式分布采样入口,
返回有限精度样本时须保留近似标记及工作精度,并公布采样精度;
它们不隐式求值或近似符号参数。normal 要求可求值实参数且 sigma > 0。
4.5 std.units¶
函数 |
签名 |
说明 |
|---|---|---|
|
|
核心静态单位转换语法,不是接收运行期单位文本的函数 |
|
|
等价于 |
|
|
是否无量纲 |
核心单位转换由 as <unit> 静态检查源和目标量纲,只允许同量纲转换;
换算因子是精确值时保持精确。strip 是 as num 的函数入口,
先转换为 SI 基准量值再移除单位签名,语义以 LSR-008 [4] 为准。is_dimensionless 查询静态量纲,
不根据运行期裸数猜测原单位;已剥离的裸数无需也不能恢复原量纲信息。
运行期单位文本解析和异量纲动态包装属于可选扩展,不是核心 convert(x, text) 契约。
扩展须显式携带单位元数据、声明检查与错误规则,不能把同一个静态 num 容器
解释为任意量纲的集合。核心异量纲组合使用静态元组 [9]。
4.6 std.cas¶
std.cas 的数学输入与结果使用 num,不另设表达式基本类型。
substitute、match_expr、rewrite、固定内建 rule、
保域 simplify 和显式 simplify_formal 由 LSR-016 [7] 定义。
未解释符号函数必须显式通过 symbolic_function(name text, arity int) -> func
构造,返回固定参数个数、参数和结果均为 num 的函数;
普通未绑定函数名仍是名称错误。
num 和数学容器的 ==/!= 构造数学关系;逐元素比较生成关系值元素。
布尔结构查询使用 std.cas.same_structure,内部集合去重、哈希和匹配也使用结构规则,
不调用构造关系的相等运算或有限证明。
数学等价 === 和 std.cas.equivalent 返回固定状态 std.cas.Equivalence:
cas.Equivalent、cas.Different、cas.Unknown;这些状态的 == 返回 bool。
Unknown 表示证明未决,不能作为 Different;预算/规则通过显式查询参数配置,
不得依赖无作用域的可变全局设置。取消和运行时故障仍以错误传播。
4.7 区间与整数范围¶
数学区间默认为实数集合,整数端点不把它改为整数集合,构造与成员语义见 LSR-017 [10]。
端点倒置时区间为空;端点相等时仅双闭区间为单点,其余为空。
端点顺序未知时保留符号区间,代入后继续按同一规则判定。
普通端点和符号端点没有不同的成员域或值语义。
端点必须满足实数值约束;实性未决报告 Inconclusive,而不是猜测成员域。
区间整体 ==/!= 构造数学关系,布尔结构查询使用 same_structure。
整数 range 与实区间独立,其步进和取值须可具体计算;
不得从端点的内部表示推断 interval<int>。
5. 常量系统¶
std.constants暴露 LSR-002 [2] 定义的常量集合常量以只读绑定导出
常量单位必须与 LSR-000 [1] 量纲系统一致
精确、测量和参考常量按 LSR-002 [2] 分类;有限测量/参考数据不得标为物理精确值
5.1 用户自定义常量¶
用户可在 user/constants.lm 中定义模型采用的常量:
use std.math.{pi}
const G_MARS = 3.72076<m/s^2>
const TAU = 2 * pi
规则:
const必须在声明时初始化初始化表达式必须可在编译期求值
常量为只读绑定;编译期校验覆盖重定义与写入
5.2 用户自定义单位¶
用户可在 user/units.lm 中定义单位:
unit score
unit token
unit km = 1000<m>
unit min = 60<s>
unit knot = (1852/3600)<m/s>
unit level = 100<score>
规则:
unit声明进入当前命名空间允许定义抽象基单位(不归约到 SI)
派生单位必须可归约到已知单位(SI 或抽象基单位)
可通过
import/use跨模块复用
示例:
use std.constants.{G, C, EARTH_GRAVITY}
let v = EARTH_GRAVITY * 2<s>
6. 错误模型¶
标准库错误采用可诊断错误码,至少覆盖:
DomainError:输入确定超出所用运算的定义域(如1/0;复主值log(-1)不属此例)DimensionMismatch:线代/广播维度不匹配SingularMatrix:矩阵奇异或线性系统奇异EmptyInput:统计函数输入为空InvalidArgument:参数类型或取值非法Inconclusive:必要的数域、值约束或控制流判定仍未决NumericalFailure:近似计算或机器转换无法满足精度/范围契约ResourceLimit、Cancelled:计算资源耗尽或取消
普通数学函数直接返回签名声明的结果值。计算失败通过 LSR-018 [8] 的 raise
与故障传播机制报告;错误类别、操作和消息必须保留,不以零、空结果或低精度结果冒充成功。
if/while 接受布尔值或数学关系,关系自动判真,未知报告 Inconclusive;
数字不能作真假转换。普通布尔逻辑短路,关系上的逻辑运算构造表达式,
程序控制流仅执行已确定分支,不把副作用隐式符号化。
求解接口在证明解集为空时返回空集合,在完整解集待定时遵循 LSR-013 [5],
不得把算法未完成伪装为无解。可保留的未求值数学结果与错误、三态证明未决是不同契约。
7. 性能与确定性约束¶
同版本标准库在同一输入下必须给出可重现结果(随机模块除外)
std.random在固定种子下必须可重放线性代数可选择不同后端,但不得改变默认精确语义;显式近似结果须满足声明的工作精度, 不以误差容差改写数学
==、===或结构查询
8. 版本与稳定性¶
9. 示例¶
import std.math
import std.linalg as la
use std.stats.{mean, std}
use std.units.{strip}
let A = mat[2,1;1,3]
let B = mat[1;2]
let X = A \ B
let angle = math.pi / 4
let s = math.sin(angle)
let speed = 36<km/h>
let raw_si = strip(speed as <m/s>)
let xs = vec[1,2,3,4,5]
let m = mean(xs)
let sd = std(xs)