LSR 017 - 区间类型规范

基本信息

  • LSR 编号 017

  • 标题 区间类型规范

  • 作者 Ziyang-Bai

  • 状态 草案

  • 类型 标准规范

  • 创建日期 08-21-2026

  • 归属项目 编译器、标准库、CAS

摘要

定义 Lamina 的 interval<T> 类型、四个标准库构造函数、端点开闭性、类型统一、成员判断和符号表达式语义。区间通过普通函数调用构造,元组和数组继续使用各自的字面量语法。

技术规范

1. 区间类型

interval<T> 表示由下界、上界和两个端点的开闭标志组成的有界区间。

let unit interval<int> = std.interval_closed(0, 1)
let domain interval<real> = std.interval_open_closed(0.0, 1.0)
  • T 提供区间成员判断所需的顺序比较

  • 两个端点的类型统一为同一 T

  • 数值端点按核心数值塔规则统一

  • 带量纲端点具有相同维度,并在比较前换算到统一尺度

  • 区间值创建后保持端点值和开闭标志不变

2. 构造函数

std 模块提供四个区间构造函数。

函数

含义

std.interval_closed(a, b)

闭区间,包含两个端点

std.interval_open(a, b)

开区间,不包含两个端点

std.interval_closed_open(a, b)

包含下界,不包含上界

std.interval_open_closed(a, b)

不包含下界,包含上界

四个构造函数具有下列泛型签名:

func interval_closed<T>(lower T, upper T) -> interval<T>
func interval_open<T>(lower T, upper T) -> interval<T>
func interval_closed_open<T>(lower T, upper T) -> interval<T>
func interval_open_closed<T>(lower T, upper T) -> interval<T>

两个端点表达式按源码从左到右各求值一次。

3. 表面语法

区间构造采用普通的限定名函数调用语法 [1]

源码

语法含义

(a, b)

二元素元组 [2]

[a, b]

二元素数组

f(a, b)

两实参函数调用

std.interval_open(a, b)

开区间构造函数调用

interval_closedinterval_openinterval_closed_openinterval_open_closedstd 模块的标准导出名。通过 use std.{interval_closed, interval_open, interval_closed_open, interval_open_closed} 导入后可以省略 std. 前缀。

4. 边界与空区间

  • 下界小于上界时,区间按构造函数指定的开闭性确定成员

  • 下界等于上界且由 interval_closed 构造时,区间只包含该端点

  • 下界等于上界且至少一端开放时,区间为空

  • 下界大于上界时产生 IntervalBoundsReversed

空区间保留构造时推导出的 interval<T> 类型。

5. 成员判断

innot in 判断值是否位于区间内。

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. 与序列和集合的关系

类型或函数

语义

interval<T>

由两个端点限定的范围

range(start, end) [3]

按标准库规则生成的序列

set<T> [4]

有限、已枚举、无序且去重的值集合

8. Expr 与符号区间

任一端点为 Expr,或上下文显式期望 Expr 时,区间构造函数产生符号区间表达式 [5]

sym x
let numeric = std.interval_closed(0, 1)       # interval<int>
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. 语法迁移

原区间写法

标准构造函数

[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. 引用