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. 集合运算

运算

说明

示例

in / not in

元素从属

2 in {1,2,3}

subset

子集判断

{1,2} subset {1,2,3}

|

并集

{1,2} | {2,3}

&

交集

{1,2} & {2,3}

-

差集

{1,2} - {2}

xor

对称差

{1,2} xor {2,3}

规则:

  • 二元集合运算的两个操作数必须是集合

  • 元素类型必须相同或可统一

  • 运算结果类型为统一后的 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> 元素返回