LSR 017 - 区间类型规范 ================================================================================ 基本信息 -------------------------------------------------------------------------------- - LSR 编号 017 - 标题 区间类型规范 - 作者 Ziyang-Bai - 状态 草案 - 类型 标准规范 - 创建日期 08-21-2026 - 归属项目 编译器、标准库、CAS 摘要 -------------------------------------------------------------------------------- 定义 Lamina 的 ``interval`` 类型、四个标准库构造函数、端点开闭性、类型统一、成员判断和符号表达式语义。区间通过普通函数调用构造,元组和数组继续使用各自的字面量语法。 技术规范 -------------------------------------------------------------------------------- 1. 区间类型 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ``interval`` 表示由下界、上界和两个端点的开闭标志组成的有界区间。 .. code-block:: text let unit interval = std.interval_closed(0, 1) let domain interval = std.interval_open_closed(0.0, 1.0) - ``T`` 提供区间成员判断所需的顺序比较 - 两个端点的类型统一为同一 ``T`` - 数值端点按核心数值塔规则统一 - 带量纲端点具有相同维度,并在比较前换算到统一尺度 - 区间值创建后保持端点值和开闭标志不变 2. 构造函数 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ``std`` 模块提供四个区间构造函数。 .. list-table:: :header-rows: 1 * - 函数 - 含义 * - ``std.interval_closed(a, b)`` - 闭区间,包含两个端点 * - ``std.interval_open(a, b)`` - 开区间,不包含两个端点 * - ``std.interval_closed_open(a, b)`` - 包含下界,不包含上界 * - ``std.interval_open_closed(a, b)`` - 不包含下界,包含上界 四个构造函数具有下列泛型签名: .. code-block:: text func interval_closed(lower T, upper T) -> interval func interval_open(lower T, upper T) -> interval func interval_closed_open(lower T, upper T) -> interval func interval_open_closed(lower T, upper T) -> interval 两个端点表达式按源码从左到右各求值一次。 3. 表面语法 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 区间构造采用普通的限定名函数调用语法 [1]_。 .. list-table:: :header-rows: 1 * - 源码 - 语法含义 * - ``(a, b)`` - 二元素元组 [2]_ * - ``[a, b]`` - 二元素数组 * - ``f(a, b)`` - 两实参函数调用 * - ``std.interval_open(a, b)`` - 开区间构造函数调用 ``interval_closed``、``interval_open``、``interval_closed_open`` 和 ``interval_open_closed`` 是 ``std`` 模块的标准导出名。通过 ``use std.{interval_closed, interval_open, interval_closed_open, interval_open_closed}`` 导入后可以省略 ``std.`` 前缀。 4. 边界与空区间 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - 下界小于上界时,区间按构造函数指定的开闭性确定成员 - 下界等于上界且由 ``interval_closed`` 构造时,区间只包含该端点 - 下界等于上界且至少一端开放时,区间为空 - 下界大于上界时产生 ``IntervalBoundsReversed`` 空区间保留构造时推导出的 ``interval`` 类型。 5. 成员判断 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ``in`` 和 ``not in`` 判断值是否位于区间内。 .. code-block:: text 0 in std.interval_closed(0, 1) # true 0 in std.interval_open_closed(0, 1) # false 1 not in std.interval_closed_open(0, 1) # true - 左操作数类型可赋给区间的元素类型 ``T`` - 闭端点使用包含相等的比较 - 开端点使用严格比较 - 普通值的成员判断返回 ``bool`` 6. 相等性与哈希 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 区间相等采用结构语义。 - 元素类型、下界、上界和两个开闭标志均相同时,两个区间相等 - 端点均可相等比较时,区间支持 ``==`` - 端点均可哈希时,区间支持哈希 7. 与序列和集合的关系 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. list-table:: :header-rows: 1 * - 类型或函数 - 语义 * - ``interval`` - 由两个端点限定的范围 * - ``range(start, end)`` [3]_ - 按标准库规则生成的序列 * - ``set`` [4]_ - 有限、已枚举、无序且去重的值集合 8. ``Expr`` 与符号区间 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 任一端点为 ``Expr``,或上下文显式期望 ``Expr`` 时,区间构造函数产生符号区间表达式 [5]_。 .. code-block:: text sym x let numeric = std.interval_closed(0, 1) # interval let symbolic = std.interval_closed_open(0, x) # Expr let forced Expr = std.interval_open(0, 1) # Expr - 可提升端点逐个提升为 ``Expr`` - 符号区间成员判断产生关系表达式 - 符号端点的顺序由 CAS 判定 9. 诊断 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 实现至少区分下列错误: - ``IntervalArityMismatch``:构造函数的端点数量错误 - ``IntervalBoundTypeMismatch``:端点类型无法统一 - ``IntervalBoundNotOrdered``:端点类型缺少所需顺序比较 - ``IntervalBoundsReversed``:可判定的下界大于上界 - ``IntervalMembershipTypeMismatch``:待判断值与端点类型不兼容 错误名称可以映射到实现的统一诊断系统。 10. 语法迁移 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. list-table:: :header-rows: 1 * - 原区间写法 - 标准构造函数 * - ``[a, b]`` - ``std.interval_closed(a, b)`` * - ``(a, b)`` - ``std.interval_open(a, b)`` * - ``[a, b)`` - ``std.interval_closed_open(a, b)`` * - ``(a, b]`` - ``std.interval_open_closed(a, b)`` 11. 引用 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. [1] :doc:`LSR-014 - 运算符规范 ` - 定义普通调用、元组、数组和保留 token .. [2] :doc:`LSR-012 - 元组类型规范 ` - 定义元组类型、字面量和位置访问 .. [3] :doc:`LSR-004 - 标准库 ` - 定义序列生成及其他标准库入口 .. [4] :doc:`LSR-013 - 集合类型规范 ` - 定义有限集合类型 .. [5] :doc:`LSR-016 - Expr 构造与提升规范 ` - 定义区间端点提升和符号表达式边界