LSR 013 - 集合类型规范¶
基本信息¶
LSR 编号 013
标题 集合类型规范
作者 Ziyang-Bai
状态 草案
类型 标准规范
创建日期 08-09-2026
归属项目 编译器、标准库、CAS
摘要¶
定义 Lamina 集合类型。集合表示有限、无序、去重、同构的值集合;可用于数学表达、CAS 多结果返回和标准库容器。
技术规范¶
1. 范围¶
本规范定义有限集合 set<T>。实区间使用 interval<num> [5];无限集合、条件集、全集和带重数集合由对应的 CAS 或标准库规范定义专门表示。
集合用于无序、去重的同构结果;元组按固定位置区分多个结果,支持同构与异构的元素组合 [4]。需要顺序或重数的结果使用向量,或由具体接口定义包含值与重数的组合。
2. 集合类型¶
集合类型写作 set<T> [1]。
sym x
let a set<int> = {1, 2, 3}
let b set<num> = {x, x + 1}
set<T>表示元素类型为T的集合集合元素必须具有确定的结构相等语义,不要求其
==返回bool集合不保证迭代顺序
集合中不存在重复元素
集合值默认不可变
set<int>中的int是元素值约束,基本类型为set<num>;set<frac>、set<real>、set<complex>同理,不建立按数域分裂的基本集合类型约束参与赋值、调用和返回校验;静态可证时提前检查,其余运行期验证。确定违反时报
DomainError或InvalidArgument,未决时报Inconclusive;不能仅凭约束选择同基本签名的重载集合采用值语义;仅可通过允许修改的
var根路径更新集合,其他绑定、元组元素和只读捕获保留旧值。共享、复制和唯一所有权优化不影响该语义,is不用于观察集合存储身份
3. 集合字面量¶
集合字面量使用花括号。
let ints = {1, 2, 3}
let nums = {1, 1/2, 3}
let empty set<num> = {}
非空集合按元素类型统一推导
set<T>空集合必须由上下文推出元素类型,否则需要显式类型标注
无法统一元素类型时报错
集合字面量中的结构重复元素只保留一个;表达式按源码顺序各求值一次,去重不省略副作用求值
4. 元素类型统一¶
集合元素必须统一为单一元素类型。
精确数、符号表达式、关系和近似值的基本类型均为
num,混合后得到set<num>,不发生整数到有理数或符号专用类型的提升int、frac、real、complex约束只限制元素值;不得按内部小整数、大整数、有理数或 AST 表示分裂集合类型text、bool、rule、元组和其他结构类型仍保留自身类型;不能与num无条件统一不具备确定结构相等语义的类型不得作为集合元素;若不能统一元素类型或没有所需结构比较规则,必须报错
5. 集合运算¶
运算 |
说明 |
示例 |
|---|---|---|
|
元素从属 |
|
|
子集判断 |
|
|
并集 |
|
|
交集 |
|
|
差集 |
|
|
对称差 |
|
|、&、-、xor的两个操作数必须是集合,元素类型必须相同或可统一,结果为统一后的set<T>in/not in的右侧必须是集合,左侧元素类型必须可与右侧集合元素类型统一,结果为boolsubset的两个操作数必须是集合,元素类型必须相同或可统一,结果为bool本规范有限集合的从属、子集、交并差和去重均按第 6 节的结构规则识别元素;不隐式进行数学等价证明。数学上等价但结构不同的元素可以同时存在
6. 集合相等¶
集合的数学相等关系与容器结构查询是不同操作。
let relation = {1, 2, 3} == {3, 2, 1}
let identical = std.cas.same_structure({1, 2, 3}, {3, 2, 1})
集合的整体
==和!=构造基本类型为num的数学关系,不返回容器去重所需的布尔比较结果;已知数字集合的关系可判真,但关系类型仍为num关系的两个集合元素类型必须相同或可统一;数学相等忽略元素顺序。条件位置自动判真,证明未决时报
Inconclusivestd.cas.same_structure对集合的重载返回bool,忽略迭代顺序,要求包含相同的结构元素;示例中identical为true内部去重、哈希键、从属及匹配直接递归使用同一结构规则,不调用构造关系的
==,不调用===、std.cas.equivalent或有限预算证明num的精确数字叶按数值比较,不依赖内部整数或有理数表示;符号表达式按语义结构比较,不能因尚未证明不同就归并近似节点按当前表示值、近似类别、目标工作精度等语义结构区分,并与精确叶区别;不得把显示小数精确化后作为原元素的结构键,全局证明预算不参与结构键
rule按 LSR-016 [7] 定义的左右num结构比较;元组按 LSR-012 [4] 逐位置递归比较,内部数学值不使用关系构造操作基于哈希的实现必须使哈希与上述结构相等一致,不能由存储地址或遍历顺序决定去重
某一 CAS 操作若明确承诺按数学等价归并,须自行使用 LSR-007 [6] 的固定三态结果处理;只有
cas.Equivalent可作为已证明等价,cas.Unknown不表示不同,也不改变本集合类型的结构去重规则
7. 集合推导式¶
集合推导式产生集合值。
let squares = { x^2 for x in {1, 2, 3} }
推导式结果元素按表达式类型统一
推导式输入必须可迭代
集合推导式结果按第 6 节的结构规则自动去重
集合推导式不得产生无限集合
8. 多结果返回¶
Lamina 函数返回单个值。多个同类数学结果按无序、去重的集合语义组织时,返回类型为 set<T> [2]。
func roots(expr num, var num) -> set<num>
func solve(eq num, var num) -> set<num>
按固定位置区分的结果使用元组,支持同构与异构的元素组合
需要排序或保留重复值的结果使用向量;需要显式重数时,由接口定义值与重数的组合
普通数学函数直接返回结果值;类型冲突、操作超出支持域及求值失败沿 LSR-018 [3] 的错误传播规则处理
CAS 中有限可枚举的解集使用 set<num>,复数根遵循 LSR-010 [8];两个接口还须检查各自要求的表达式、关系和求解变量等支持域,不是所有 num 都是合法输入。
sym x
let rs = roots(x^2 - 1, x) # {-1, 1}
求解接口证明解集为空时,返回空
set<num>作为正常结果求解接口必须在当前算法与预算内确认完整解集后返回结果;完整性处于待定状态时,诊断
SetResultInconclusive并沿错误路径传播若结果有定义域条件,条件表达由调用的具体标准库规范定义
9. 有限性¶
set<T> 表示有限集合;可结构比较的元组可作为集合元素 [4]。
实区间使用
interval<num>,整数端点不使区间成为有限整数枚举;条件集和全集等数学对象应由 CAS 或标准库定义专门表示 [5]CAS 在确认结果有限且枚举完整后返回
set<T>;未决求解状态沿错误路径传播,不返回伪装为完整解集的部分集合
10. 诊断¶
SetElementTypeMismatch:集合元素类型统一失败SetOperandTypeMismatch:集合运算的操作数类型校验失败元素类型必须具备结构相等语义,校验失败时必须诊断;基于哈希的实现还须满足该类型的结构哈希契约
SetResultInconclusive:完整解集判定处于待定状态
错误名称可映射到 LSR-018 [3] 的统一诊断与故障传播机制。