🐛 fix(tsl_syntax): repair lookup engine and reconcile reference facts
lookup.py: exempt code-anchored ASCII identifiers from the mixed zh/en gate so exact hits are no longer dropped; dedup parent/child sections in results; validate write-prelude anchors in --check. references: correct interpreter-verified facts (case-as-expression, control-flow semicolons, __line__/__stack_frame, tslObjects order, destroy timing, ErrDefine, truncated outputs), fix headings, scope qualifiers and reversed quotes; strip dead preamble metadata from all 24 pages. packaging: exclude __pycache__/*.pyc from playbook and bundle copies; update build test file-count assertion to match. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,20 +1,15 @@
|
||||
# TSL 矩阵深水专题
|
||||
|
||||
文档类型:语法深水专题
|
||||
是否可直接用于生成代码:是
|
||||
是否含可直接照写示例:是
|
||||
是否含不可照写反例:是
|
||||
|
||||
这一篇只讲矩阵专用语法主干:矩阵初始化、数列构造、矩阵逆/广义逆、矩阵乘除乘方、矩阵转置、矩阵拼接、矩阵尺寸与索引、矩阵遍历、子矩阵和 `mfind` 查找。它和 [12_matrix_and_collections.md](12_matrix_and_collections.md) 的分工是:`12` 讲普通数组与集合关系,这一篇讲矩阵专用构造、运算、遍历、子矩阵和矩阵查找接口。
|
||||
|
||||
## 本篇职责
|
||||
|
||||
回答”怎样直接构造全零矩阵、全一矩阵、随机矩阵、单位矩阵、空矩阵和数列数组,怎样写矩阵逆/广义逆,怎样进行矩阵乘除乘方,怎样转置矩阵,怎样拼接矩阵,怎样拿到矩阵的行数、列数、行索引和列索引,怎样遍历矩阵、取/改子矩阵,以及怎样用 `mfind` 找到或替换符合条件的单元格”。
|
||||
回答“怎样直接构造全零矩阵、全一矩阵、随机矩阵、单位矩阵、空矩阵和数列数组,怎样写矩阵逆/广义逆,怎样进行矩阵乘除乘方,怎样转置矩阵,怎样拼接矩阵,怎样拿到矩阵的行数、列数、行索引和列索引,怎样遍历矩阵、取/改子矩阵,以及怎样用 `mfind` 找到或替换符合条件的单元格”。
|
||||
|
||||
## 智能体矩阵深水判断流程
|
||||
|
||||
1. 先判断要写矩阵初始化、数列构造、矩阵逆/广义逆、矩阵尺寸与索引读取、矩阵遍历、子矩阵,还是 `mfind` 查找/替换。
|
||||
2. 基础数组和矩阵样比较先回看 `12_matrix_and_collections.md`。
|
||||
2. 基础数组与矩阵样比较的事实在 [12_matrix_and_collections.md](12_matrix_and_collections.md)。
|
||||
3. `mrows` / `mcols` / `msize` 等函数只照文档返回形态写。
|
||||
4. 需要逐单元执行语句块时用 `matrix::begin ... end`;需要把表达式结果写回每个单元时用 `matrix ::= expression`。
|
||||
5. 需要遍历到嵌套数组最深层时用 `matrix:.begin ... end` 或 `matrix:.= expression`。
|
||||
@@ -25,8 +20,8 @@
|
||||
|
||||
## 核心规则
|
||||
|
||||
- 矩阵初始化函数的参数规格使用 `tsl-api-reference` skill 按名查询;本页只保留矩阵行为示例和返回形态边界。
|
||||
- `zeros(...)`、`ones(...)`、`rand(...)`、`nils(...)`、`eye(...)` 都可以直接用于矩阵初始化。
|
||||
- 矩阵初始化和基础函数的具体参数规格使用 `tsl-api-reference` skill 按名查询;本页只保留矩阵行为示例、返回形态边界和跨函数通用的广播 / `ErrDefine` / `ErrReplace` 机制。
|
||||
- `zeros(...)`、`ones(...)`、`rand(...)`、`nils(...)`、`eye(...)` 都可以直接用于矩阵初始化;全 `nil` 单元的“空矩阵”用 `nils(...)` 构造。
|
||||
- `zeros(3)`、`ones(3)`、`nils(2)` 这类单参数写法可以直接生成一维结果。
|
||||
- `zeros(2, 3)`、`rand(2, 3)` 这类双参数写法可以直接生成二维矩阵。
|
||||
- `zeros(2, array("A", "B"))` 这种写法可以直接生成带列名的二维结果。
|
||||
@@ -525,7 +520,7 @@ B
|
||||
0
|
||||
```
|
||||
|
||||
### 矩阵乘法、除法、乘方:`:*`、`:/`、`:^`
|
||||
### 矩阵乘法、除法、左除、乘方:`:*`、`:/`、`:\`、`:^`
|
||||
|
||||
`:*` 是矩阵乘法(区别于逐元素乘 `*`):
|
||||
|
||||
@@ -603,7 +598,7 @@ writeLn(result[1][0]);
|
||||
|
||||
说明:
|
||||
|
||||
- `:\` 左除用于解线性方程组 `A * X = B`,等价于 `X = A^(-1) * B`
|
||||
- `:\` 左除用于解线性方程组 AX = B(数学记法),等价于先求逆再矩阵乘:`!a :* b`
|
||||
- **右侧 `b` 必须是列向量**(用 `array((4), (8))` 而非 `array(4, 8)`)
|
||||
- `a :\ b` 返回 `array((2.0), (2.0))`,即 `X` 的列向量
|
||||
- 当 A 行数 > 列数时返回最小二乘解,行数 < 列数时返回一个可行解
|
||||
@@ -699,10 +694,34 @@ array(2.0,NAN,3.0)
|
||||
|
||||
说明:
|
||||
|
||||
- `sqrt(data, 1, -999)` 中,第二参数 `ErrDefine=1` 表示允许 NIL 值不允许错误值
|
||||
- `ErrReplace=-999` 是错误位置的替换值(本例中 `-1` 的平方根为错误,但 `ErrDefine=1` 保留为 NAN)
|
||||
- `ErrDefine` 取值:`0`=不允许错误和 NIL、`1`=允许 NIL 不允许错误、`2`=错误值保留为原值
|
||||
- `ErrReplace` 在 `ErrDefine=0` 或 `1` 时生效,用于替换错误/NIL 位置
|
||||
- `ErrDefine` 取值:`0`=不允许错误和 NIL(两者都替换为 `ErrReplace`)、`1`=允许 NIL 不允许错误(NIL 保留,错误替换为 `ErrReplace`)、`2`=错误和 NIL 都保留原值(`ErrReplace` 不生效)
|
||||
- 「错误」指输入无效(如 NIL、类型不符);数学定义域产生的 `NAN` 结果(如 `sqrt(-1)`)不属于错误位置,任何 `ErrDefine` 档位下都不会被 `ErrReplace` 替换,本例输出保留 `NAN` 即因如此
|
||||
- 不带 `ErrDefine` / `ErrReplace` 时,无效输入会直接运行报错
|
||||
|
||||
无效输入在不同 `ErrDefine` 档位下的替换差异:
|
||||
|
||||
代码块身份:可直接照写示例
|
||||
|
||||
```tsl
|
||||
data := array(4, nil, "AAA", 9);
|
||||
writeLn(tostn(sqrt(data, 0, -999)));
|
||||
writeLn(tostn(sqrt(data, 1, -999)));
|
||||
writeLn(tostn(sqrt(data, 2, -999)));
|
||||
```
|
||||
|
||||
代码块身份:输出片段
|
||||
|
||||
```text
|
||||
array(2.0,-999,-999,3.0)
|
||||
array(2.0,NIL,-999,3.0)
|
||||
array(2.0,NIL,"AAA",3.0)
|
||||
```
|
||||
|
||||
说明:
|
||||
|
||||
- `ErrDefine=0` 把 NIL 和错误值 `"AAA"` 都替换成 `-999`
|
||||
- `ErrDefine=1` 保留 NIL、只替换错误值
|
||||
- `ErrDefine=2` 全部保留原值
|
||||
|
||||
另一个例子:
|
||||
|
||||
@@ -871,7 +890,7 @@ writeLn("(1,3):", result[1][3]);
|
||||
(1,3): 8
|
||||
```
|
||||
|
||||
`:|` 对非完全矩阵补 `nil`,`|` 不补:
|
||||
普通 `array` 的非完全矩阵:`:|` 缺位补 `nil`,`|` 直接顺接不补位:
|
||||
|
||||
代码块身份:可直接照写示例
|
||||
|
||||
@@ -887,16 +906,17 @@ writeLn("bar 结果 (1,2):", bar_result[1][2]);
|
||||
代码块身份:输出片段
|
||||
|
||||
```text
|
||||
colon 结果列数: 6
|
||||
colon (1,2): nil
|
||||
bar 结果 (1,2): 1
|
||||
colon 结果列数:6
|
||||
colon (1,2):<NIL>
|
||||
bar 结果 (1,2):2
|
||||
```
|
||||
|
||||
说明:
|
||||
|
||||
- `union` / `&=` 用于行方向拼接
|
||||
- `|` / `:|` 用于列方向拼接
|
||||
- 非完全矩阵(行长度不一致)用 `:|` 会在缺位补 `nil`,而 `|` 不补
|
||||
- 普通 `array` 的非完全矩阵(行长度不一致):`:|` 按原列位置对齐、缺位补 `nil`;`|` 把两行元素直接顺接(本例第 1 行变成 `(2,3,2,3)`,所以 `[1][2]` 是 `2`)
|
||||
- 上述差异只适用于普通 `array`;`FMArray` 上 `|` 与 `:|` 行为一致且行数不齐时补 `0`,见 [23_fmarray.md](23_fmarray.md)
|
||||
- 对应的复合赋值形式:`&=`(行并)、`|=`(列并)、`:|=`(列并补 nil)
|
||||
|
||||
## 默认生成模板
|
||||
@@ -923,7 +943,7 @@ matrix_value := zeros(2, 3);
|
||||
- 用 `::` 期待遍历到任意深度;深度遍历使用 `:.`。
|
||||
- 子矩阵赋值时用形状不匹配的矩阵硬塞。
|
||||
- 把 `union` 的复合赋值写成 `union=`;正确写法是 `&=`。
|
||||
- 一维数组直接 `union` 期待得到二维结果;需要先双转置 ` `b `` 变成行向量。
|
||||
- 一维数组直接 `union` 期待得到二维结果;需要先对它连用两次转置前缀(双转置)变成行向量。
|
||||
- 在基础函数异常参数时用分号分隔;正确写法用逗号:`sqrt(data, 1, -999)`。
|
||||
|
||||
代码块身份:反例 / 不可照写
|
||||
|
||||
Reference in New Issue
Block a user