LSR 009 - 集合与多结果返回规范¶
基本信息¶
LSR 编号 009
标题 集合与多结果返回规范
作者 Ziyang-Bai
状态 草案
类型 标准规范
创建日期 07-28-2026
归属项目 编译器、标准库、CAS
摘要¶
定义 set<T> 的核心语义,并规定需要返回多个同类数学结果时使用集合返回值,而不是语言级多值返回。
技术规范¶
1. 设计目标¶
保持函数调用模型为单返回值
为方程解、根、集合运算等多结果场景提供标准表示
避免为当前语言核心引入 tuple、多返回和解构返回
使 CAS 结果能表达无解、有限多个解和未排序结果
2. 集合类型¶
set<T> 表示无序、去重、同构元素集合。
let a = {1, 2, 3}
let b set<int> = {}
规则:
集合元素类型必须可统一到同一
T集合不保证迭代顺序
集合去重使用该类型的相等性语义
空集合必须能由上下文推出元素类型,否则需要显式标注
3. 字面量与类型推导¶
let ints = {1, 2, 3}
let nums = {1, 1/2, 3}
let exprs = {x, x + 1}
let empty set<Expr> = {}
推导规则:
非空集合按元素类型统一推导
set<T>数值元素按 LSR-000 数值塔提升
Expr与非Expr混合时整体提升为Expr无法统一元素类型时报错
SetElementTypeMismatch
4. 集合运算¶
运算 |
说明 |
示例 |
|---|---|---|
|
元素从属 |
|
|
子集判断 |
|
|
并集 |
|
|
交集 |
|
|
差集 |
|
|
对称差 |
|
规则:
二元集合运算的两个操作数必须是集合
元素类型必须相同或可统一
运算结果类型为统一后的
set<T>
5. 多结果返回约定¶
Lamina 不定义语言级多值返回。函数仍然只有一个返回值;当结果是多个同类值时,返回 set<T>。
func roots(expr Expr, var Expr) -> set<Expr>
func solve(eq Expr, var Expr) -> set<Expr>
示例:
sym x
let rs = roots(x^2 - 1, x) # {-1, 1}
规则:
无解返回空集合
{},不是错误多个同类结果返回
set<T>集合不表达重数;需要重数时使用
table或专门结果类型需要多个命名分量的结果继续使用
table<text, V>或后续专门类型,不使用多值返回
6. CAS 结果集合¶
CAS 中的有限解集使用 set<Expr> 表示。
sym x
solve(x^2 + 1 == 0, x) # {-i, i}
solve(x^2 + 1 == 0, x) subset {C}
规则:
有限可枚举解集返回
set<Expr>无解返回空
set<Expr>无法在当前算法与预算内确定完整解集时,标准库函数必须返回诊断错误或专门的不确定结果,不得伪造空集合
若结果有定义域条件,条件表达由调用的具体标准库规范定义
7. 错误模型¶
SetElementTypeMismatch: 集合元素类型无法统一SetOperandTypeMismatch: 集合运算作用于非集合SetElementNotHashable: 元素类型不可哈希且未提供.hash()SetResultInconclusive: CAS 无法确认完整结果集合
8. 与其他 LSR 的关系¶
LSR-000:声明
set基础类型、集合运算符和数值塔提升LSR-004:标准库中返回多个同类结果的函数应使用
set<T>LSR-007:
Expr集合去重可使用结构相等;数学等价去重需由具体 CAS 函数显式声明LSR-010:复数根可作为
set<complex>或set<Expr>元素返回