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