@rsconcept/rstool 1.7.0 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/README.md +5 -5
  2. package/dist/{agent-workflow-DY-hfAap.d.ts → agent-workflow-BqEC_Foh.d.ts} +5 -6
  3. package/dist/{analysis-ktWFu4BY.d.ts → analysis-C7GrmB17.d.ts} +3 -4
  4. package/dist/{common-D6TFl6l_.d.ts → common-oafVB-wX.d.ts} +1 -2
  5. package/dist/{constituenta-HTnFtmxt.d.ts → constituenta-CwJogNKY.d.ts} +4 -5
  6. package/dist/{diagnostic-CODFUU-Q.d.ts → diagnostic-CtxXifJY.d.ts} +4 -3
  7. package/dist/{diagnostic-assembly-B-6vIA5I.js → diagnostic-assembly-B-r0NyHL.js} +3 -2
  8. package/dist/diagnostic-assembly-B-r0NyHL.js.map +1 -0
  9. package/dist/{evaluation-6A7rK4t7.d.ts → evaluation-BHv2xNwf.d.ts} +3 -4
  10. package/dist/index.d.ts +11 -10
  11. package/dist/index.js +1 -1
  12. package/dist/mappers/model-adapter.d.ts +9 -4
  13. package/dist/mappers/model-adapter.js +29 -4
  14. package/dist/mappers/model-adapter.js.map +1 -1
  15. package/dist/mappers/schema-adapter.d.ts +5 -5
  16. package/dist/mappers/schema-adapter.js +1 -1
  17. package/dist/mappers/types.d.ts +5 -4
  18. package/dist/mappers/types.js +1 -1
  19. package/dist/mappers/types.js.map +1 -1
  20. package/dist/{model-value-BUhr2IjA.d.ts → model-value-C0QA-ji2.d.ts} +2 -3
  21. package/dist/models/agent-workflow.d.ts +1 -1
  22. package/dist/models/analysis.d.ts +1 -1
  23. package/dist/models/common.d.ts +1 -1
  24. package/dist/models/constituenta.d.ts +1 -1
  25. package/dist/models/diagnostic.d.ts +1 -1
  26. package/dist/models/diagnostic.js +1 -1
  27. package/dist/models/evaluation.d.ts +1 -1
  28. package/dist/models/index.d.ts +10 -10
  29. package/dist/models/index.js +1 -1
  30. package/dist/models/model-value.d.ts +1 -1
  31. package/dist/models/rstool-agent.d.ts +1 -1
  32. package/dist/models/rstool-agent.js +1 -1
  33. package/dist/models/session.d.ts +1 -1
  34. package/dist/models/tool-contract.d.ts +1 -1
  35. package/dist/models/tool-contract.js +1 -1
  36. package/dist/models/tool-contract.js.map +1 -1
  37. package/dist/{models-BKmWx92e.js → models-D06g8LId.js} +8 -7
  38. package/dist/{models-BKmWx92e.js.map → models-D06g8LId.js.map} +1 -1
  39. package/dist/{rsform-builder-DKwZfJvN.js → rsform-builder-BlXEe5Ow.js} +2 -2
  40. package/dist/{rsform-builder-DKwZfJvN.js.map → rsform-builder-BlXEe5Ow.js.map} +1 -1
  41. package/dist/{rstool-agent-D-w4DlEo.d.ts → rstool-agent-DLq0mtym.d.ts} +9 -10
  42. package/dist/session/session-store.d.ts +3 -2
  43. package/dist/session/session-store.js +1 -1
  44. package/dist/{session-Uc_vHrq9.d.ts → session-OaLqLq0H.d.ts} +3 -4
  45. package/dist/{tool-contract-i0v2gbWs.d.ts → tool-contract-ZVyh7hhp.d.ts} +10 -11
  46. package/dist/wrapper/client.d.ts +12 -5
  47. package/dist/wrapper/client.js +79 -12
  48. package/dist/wrapper/client.js.map +1 -1
  49. package/dist/wrapper/stdio-wrapper.d.ts +1 -1
  50. package/dist/wrapper/stdio-wrapper.js +18 -10
  51. package/dist/wrapper/stdio-wrapper.js.map +1 -1
  52. package/docs/CONCEPTUAL-SCHEMA.md +1 -1
  53. package/docs/CONSTRUCTIONS.md +372 -0
  54. package/docs/DIAGNOSTICS.md +70 -28
  55. package/docs/DOMAIN.md +7 -2
  56. package/docs/MODEL-TESTING.md +48 -0
  57. package/docs/README.md +1 -0
  58. package/docs/SYNTAX.md +1 -1
  59. package/docs/TYPIFICATION.md +11 -2
  60. package/examples/diagnostics-utils.ts +3 -4
  61. package/package.json +20 -19
  62. package/skills/README.md +1 -1
  63. package/skills/rstool-helper/EXAMPLES.md +24 -0
  64. package/skills/rstool-helper/GUIDE.md +49 -22
  65. package/skills/rstool-helper/REFERENCE.md +24 -5
  66. package/skills/rstool-helper/SKILL.md +7 -4
  67. package/src/mappers/diagnostic-assembly.ts +5 -2
  68. package/src/mappers/model-adapter.ts +34 -1
  69. package/src/mappers/types.ts +1 -0
  70. package/src/models/rstool-agent.test.ts +95 -0
  71. package/src/models/tool-contract.ts +1 -1
  72. package/src/wrapper/client.test.ts +43 -4
  73. package/src/wrapper/client.ts +95 -16
  74. package/src/wrapper/stdio-handler.test.ts +43 -0
  75. package/src/wrapper/stdio-handler.ts +19 -5
  76. package/dist/diagnostic-assembly-B-6vIA5I.js.map +0 -1
@@ -0,0 +1,372 @@
1
+ # Объяснение конструкций ЯРЭ
2
+
3
+ Читай, когда нужно **объяснить человеку** формулу или конструкцию языка. Написание и починка формул — [SYNTAX.md](SYNTAX.md); диагностики — [DIAGNOSTICS.md](DIAGNOSTICS.md); ступени как объект анализа — [TYPIFICATION.md](TYPIFICATION.md).
4
+
5
+ Не сыпь таблицы операторов из `SYNTAX.md` в чат. Этот файл — словарь фраз и сценарий разбора. Механика генераторов и приоритеты операторов при написании формулы — [SYNTAX.md](SYNTAX.md).
6
+
7
+ ## Карточка
8
+
9
+ У каждой конструкции:
10
+
11
+ | Поле | Зачем |
12
+ | :-------------- | :------------------------------------------------------------------------- |
13
+ | Запись | как выглядит в формуле |
14
+ | Что считается | одно предложение, значение или истинность |
15
+ | Ступень | результат |
16
+ | Не сосед | граница со смежной конструкцией |
17
+ | Как сказать | сначала обычная речь, сразу канонический термин |
18
+ | Пример | один посчитанный |
19
+ | Антипаттерн | типичная путаница |
20
+ | Справка | топик Portal; в чат — только по правилам [ниже](#ссылка-на-справку-portal) |
21
+
22
+ В разборе формулы термин называй в том шаге, где конструкция появляется, не на каждый вложенный узел.
23
+
24
+ ## Как объяснять формулу
25
+
26
+ Сценарий для конкретной конституенты. Карточки — словарь фраз, не оглавление ответа.
27
+
28
+ 1. Роль конституенты и термин.
29
+ 2. Формула как есть.
30
+ 3. Это ТМВ или ЛВ (преамбула ниже).
31
+ 4. Снаружи внутрь: что получается в целом, затем цепочка только теми карточками, которые есть в формуле.
32
+ 5. Ступень результата и на какие понятия опирается.
33
+ 6. Вычисление на данных (`evaluate`, маленькая КМ) — только если спросили «что получится на этих данных». Иначе не придумывай интерпретацию.
34
+
35
+ Не вставляй ссылку на справку Portal на каждый оператор в этом разборе.
36
+
37
+ ## ТМВ и ЛВ
38
+
39
+ Формула либо **считает значение**, либо **утверждает истинность**. С этого начинается любой разбор.
40
+
41
+ | Класс | Что возвращает | Где живёт в схеме |
42
+ | :---- | :------------- | :---------------- |
43
+ | Теоретико-множественное выражение (ТМВ) | элемент ступени: объект, кортеж, множество, целое | типизация `S#`, определение `D#` / `F#`, тело терм-функции |
44
+ | Логическое выражение (ЛВ) | истина или ложь | `A#`, `T#`, тело `P#`, условие в `D{}` / `I{}` / `R{}` / кванторе |
45
+
46
+ Не говори «формула возвращает TRUE/FALSE» про ТМВ и не называй множество «проверкой». `TRUE` и `FALSE` в экспликации КС не используют.
47
+
48
+ Каноническая рамка: «это теоретико-множественное выражение: считается множество / элемент» или «это логическое выражение: утверждается, что …».
49
+
50
+ Справка: [ЯРЭ](https://portal.acconcept.ru/manuals?topic=rslang). Типизация ступеней: [типизация](https://portal.acconcept.ru/manuals?topic=rslang-typification).
51
+
52
+ ## Малая проекция (`pr`)
53
+
54
+ **Запись.** `prk(кортеж)`. Мультииндекс: `pr1,3((a, b, c, d))`.
55
+
56
+ **Что считается.** Выбранная компонента **одного** кортежа (при мультииндексе — кортеж из выбранных компонент).
57
+
58
+ **Ступень.** Ступень k-й компоненты; при мультииндексе — кортеж этих ступеней.
59
+
60
+ **Не сосед.** [Большая проекция](#большая-проекция-pr) идёт по **множеству** кортежей и возвращает множество компонент. `pr` не глотает `ℬ(…)`.
61
+
62
+ **Как сказать.** «вторая компонента кортежа α» (малая проекция `pr2`).
63
+
64
+ **Пример.** `pr2((5, 4, 3, 2, 1)) = 4`.
65
+
66
+ **Антипаттерн.** `pr1(S1)` при `S1 : ℬ(X1×X1)`. Нужен `Pr1(S1)`.
67
+
68
+ **Справка.** [Структурные выражения](https://portal.acconcept.ru/manuals?topic=rslang-expression-structure).
69
+
70
+ ## Большая проекция (`Pr`)
71
+
72
+ **Запись.** `Prk(S)`. Мультииндекс: `Pr2,4(S1)`.
73
+
74
+ **Что считается.** Множество выбранных компонент **всех** кортежей из `S`.
75
+
76
+ **Ступень.** Если `S : ℬ(H1×…×Hn)`, то `Prk(S) : ℬ(Hk)`; мультииндекс даёт множество кортежей выбранных компонент.
77
+
78
+ **Не сосед.** [Малая проекция](#малая-проекция-pr) — один кортеж. [Фильтр](#фильтр-fi) оставляет целые кортежи, а не вынимает компоненты.
79
+
80
+ **Как сказать.** «множество вторых компонент всех кортежей из S1» (большая проекция `Pr2`).
81
+
82
+ **Пример.** `Pr3({(1, 2, 3), (4, 5, 6)}) = {3, 6}`.
83
+
84
+ **Антипаттерн.** `Pr1((a, b))` — аргумент не множество. Нужен `pr1((a, b))`.
85
+
86
+ **Справка.** [Структурные выражения](https://portal.acconcept.ru/manuals?topic=rslang-expression-structure).
87
+
88
+ ## Фильтр (`Fi`)
89
+
90
+ **Запись.** `Fi1[D](S)`. Индекс указывает, какую компоненту кортежей из `S` сверять с `D`.
91
+
92
+ **Что считается.** Подмножество `S`: те кортежи, у которых выбранная компонента принадлежит `D`.
93
+
94
+ **Ступень.** Та же, что у `S` (множество кортежей). `D` должен быть множеством ступени выбранной компоненты: для элемента `ξ` пиши `{ξ}` или `bool(ξ)`, не голое `ξ`.
95
+
96
+ **Не сосед.** [Отбор `D{}`](#отбор-d) — условие на элементах любого множества, не обязательно отношения. [Большая проекция](#большая-проекция-pr) вынимает компоненты, фильтр оставляет кортежи целиком. Несколько индексов — карточки [фильтра с мультииндексом](#фильтр-с-мультииндексом) и [мультифильтра](#мультифильтр).
97
+
98
+ **Как сказать.** «из отношения S1 оставляем только кортежи, чья первая компонента лежит в D» (фильтр `Fi1`).
99
+
100
+ **Пример.** `Fi2[{2, 4}]({(1, 2), (3, 4), (5, 6)}) = {(1, 2), (3, 4)}`.
101
+
102
+ **Антипаттерн.** `Fi1[ξ](S1)` при `ξ∈X1`. Параметр фильтра — множество, нужен синглетон: `Fi1[{ξ}](S1)`. Иначе `invalidFilterBooleanEchelon`.
103
+
104
+ **Справка.** [Структурные выражения](https://portal.acconcept.ru/manuals?topic=rslang-expression-structure).
105
+
106
+ ## Фильтр с мультииндексом
107
+
108
+ **Запись.** `Fi1,2[D1, D2](S)` — индексов столько же, сколько параметров.
109
+
110
+ **Что считается.** Подмножество `S`, где первая компонента лежит в `D1` **и** вторая в `D2` (условия независимы).
111
+
112
+ **Ступень.** Та же, что у `S`. Каждый `Di` — множество ступени соответствующей компоненты.
113
+
114
+ **Не сосед.** [Мультифильтр](#мультифильтр) принимает **один** параметр: в него должен входить кортеж выбранных компонент. `Fi1,2[Pr1(D), Pr2(D)](S)` — это эта карточка (декартово по проекциям), а не мультифильтр `Fi1,2[D](S)`.
115
+
116
+ **Как сказать.** «оставляем кортежи, у которых первая компонента из D1, а вторая из D2» (фильтр с мультииндексом).
117
+
118
+ **Пример.** `S1 = {(1, 10), (1, 20), (2, 10)}`. `Fi1,2[{1, 2}, {10}](S1) = {(1, 10), (2, 10)}`.
119
+
120
+ **Антипаттерн.** Один параметр при двух индексах, если имелись в виду независимые множества: это уже [мультифильтр](#мультифильтр), другой смысл.
121
+
122
+ **Справка.** [Структурные выражения](https://portal.acconcept.ru/manuals?topic=rslang-expression-structure).
123
+
124
+ ## Мультифильтр
125
+
126
+ **Запись.** `Fi1,2[D](S)` — несколько индексов, **один** параметр `D`.
127
+
128
+ **Что считается.** Подмножество `S`, где кортеж выбранных компонент **целиком** принадлежит `D`. `D` — множество таких кортежей, не два отдельных домена.
129
+
130
+ **Ступень.** Та же, что у `S`. Ступень `D` — множество кортежей выбранных компонент, например `ℬ(H1×H2)` для `Fi1,2`.
131
+
132
+ **Не сосед.** `Fi1,2[D1, D2](S)` — [фильтр с мультииндексом](#фильтр-с-мультииндексом). Для `D = {(1, 10), (2, 20)}` мультифильтр `Fi1,2[D](S)` не равен `Fi1,2[Pr1(D), Pr2(D)](S)`: второе пускает любую комбинацию проекций.
133
+
134
+ **Как сказать.** «оставляем те кортежи, чья пара выбранных компонент лежит в D» (мультифильтр).
135
+
136
+ **Пример.** `S1 = {(1, 10), (1, 20), (2, 10)}`, `D1 = {(1, 10), (2, 20)}`. `Fi1,2[D1](S1) = {(1, 10)}`. Тогда `Fi1,2[Pr1(D1), Pr2(D1)](S1) = Fi1,2[{1, 2}, {10, 20}](S1) = S1`.
137
+
138
+ **Антипаттерн.** Объяснять мультифильтр как «первая компонента в D и вторая в D». У `D` элементы — кортежи, не смешивай с двумя множествами.
139
+
140
+ **Справка.** [Структурные выражения](https://portal.acconcept.ru/manuals?topic=rslang-expression-structure).
141
+
142
+ ## Синглетон (`bool`)
143
+
144
+ **Запись.** `bool(a)`. В идиоме фильтра чаще пишут `{ξ}` — одноэлементное перечисление, тот же смысл.
145
+
146
+ **Что считается.** Множество из одного элемента `a`.
147
+
148
+ **Ступень.** Если `a : H`, то `bool(a) : ℬ(H)`.
149
+
150
+ **Не сосед.** [Десинглетон](#десинглетон-debool) — обратная операция, только если множество одноэлементное. Голое `ξ` в параметре [фильтра](#фильтр-fi) — не синглетон.
151
+
152
+ **Как сказать.** «множество, в котором только ξ» (синглетон / буль `bool(ξ)`, в формуле часто `{ξ}`).
153
+
154
+ **Пример.** `bool(1) = {1}`.
155
+
156
+ **Антипаттерн.** `bool(S)` когда `S` уже множество и нужно само `S`, а не `{{…}}` ещё на один `ℬ`.
157
+
158
+ **Справка.** [Структурные выражения](https://portal.acconcept.ru/manuals?topic=rslang-expression-structure).
159
+
160
+ ## Десинглетон (`debool`)
161
+
162
+ **Запись.** `debool(S)`.
163
+
164
+ **Что считается.** Единственный элемент одноэлементного множества `S`.
165
+
166
+ **Ступень.** Если `S : ℬ(H)` и в `S` ровно один элемент, результат ступени `H`. Иначе ошибка типизации или вычисления (`invalidDebool`, `calcInvalidDebool`).
167
+
168
+ **Не сосед.** [Синглетон](#синглетон-bool) упаковывает элемент во множество. `debool` не заменяет [малую проекцию](#малая-проекция-pr).
169
+
170
+ **Как сказать.** «единственный элемент множества S» (десинглетон / дебуль `debool`).
171
+
172
+ **Пример.** `debool({1}) = 1`.
173
+
174
+ **Антипаттерн.** `debool` без гарантии синглетона: «тот единственный», хотя элементов может быть несколько.
175
+
176
+ **Справка.** [Структурные выражения](https://portal.acconcept.ru/manuals?topic=rslang-expression-structure).
177
+
178
+ ## Отбор (`D{}`)
179
+
180
+ **Запись.** `D{ξ∈A | P(ξ)}`. Буква `D` — часть синтаксиса, не конституента. Слева от `|` — переменная и домен (`∈`, не `:∈`); справа — логическое условие.
181
+
182
+ Краткая форма без `D` — только одна переменная: `{ξ∈A | P(ξ)}`. Кортеж в объявлении требует префикса: `D{(ξ1, ξ2)∈S1 | P(ξ1, ξ2)}`.
183
+
184
+ **Что считается.** Подмножество домена: те элементы (или кортежи), для которых условие истинно (схема ограниченного выделения, родо-видовое определение).
185
+
186
+ **Ступень.** `ℬ(H)`, где `H` — ступень элементов домена.
187
+
188
+ **Не сосед.** [Фильтр](#фильтр-fi) режет отношение по компоненте кортежа. [Императивный перебор](#императивный-перебор-i) строит то же множество по шагам, когда нужны промежуточные присвоения. [Рекурсия](#рекурсия-r) возвращает одно значение, не множество.
189
+
190
+ **Как сказать.** «те ξ из A, для которых выполняется P» (декларативный отбор, схема ограниченного выделения).
191
+
192
+ **Пример.** `D{ξ∈{1, 2, 3, 4, 5, 6} | ∃σ∈{10, 11, 12} σ = 2 * ξ} = {5, 6}`.
193
+
194
+ **Антипаттерн.** Объяснять `Fi1[{ξ}](S1)` как декларативный отбор. Для среза отношения по компоненте каноничен фильтр. В `D{}` писать `:∈` — это синтаксис перебора в `I{}`.
195
+
196
+ **Справка.** [Декларативная конструкция](https://portal.acconcept.ru/manuals?topic=rslang-expression-declarative).
197
+
198
+ ## Императивный перебор (`I{}`)
199
+
200
+ **Запись.** `I{элемент | блок; блок; …}`. Префикс `I` обязателен. Слева от `|` — ТМВ элемента результата. Справа — блоки через `;`: перебор `ξ:∈STE`, присвоение `ξ:=STE`, проверка `LE`.
201
+
202
+ **Что считается.** Множество значений левой части по всем прохождениям блоков, где каждая проверка истинна. Эквивалентен декларативному отбору, но шаги могут зависеть друг от друга.
203
+
204
+ **Ступень.** `ℬ(H)`, где `H` — ступень выражения слева от `|`.
205
+
206
+ **Не сосед.** [Отбор `D{}`](#отбор-d) — когда достаточно «элементы A по условию», без промежуточных `:=`. Если `I{(ξ, σ) | ξ:∈A; σ:=E(ξ)}` задаёт однозначную зависимость, в схеме это обычно [терм-функция](#параметризованные-выражения-f-p), а не множество пар. [Рекурсия](#рекурсия-r) — одно значение, не множество.
207
+
208
+ **Как сказать.** «собираем множество, перебирая элементы и по ходу вычисляя промежуточные значения» (императивная конструкция).
209
+
210
+ **Пример.** `I{(ξ1, ξ2) | ξ1:∈{1, 2, 3}; ξ2:=ξ1+1; ∃σ∈{4, 5, 6} σ=2*ξ2} = {(1, 2), (2, 3)}`.
211
+
212
+ **Антипаттерн.** `∈` вместо `:∈` в переборе. Называть `I{}` «циклом, который что-то печатает»: результат — множество. Объяснять график `I{(ξ,σ)|…}` как единственный канон, если это функция: см. [CONCEPTUAL-SCHEMA.md](CONCEPTUAL-SCHEMA.md).
213
+
214
+ **Справка.** [Императивная конструкция](https://portal.acconcept.ru/manuals?topic=rslang-expression-imperative).
215
+
216
+ ## Рекурсия (`R{}`)
217
+
218
+ **Запись.** `R{ξ := база | условие | следующий}`. Короткая форма без условия: `R{ξ := база | следующий}` — выход, когда значение стабилизировалось. Префикс `R` обязателен; в базе — `:=`. Переменная может быть кортежем.
219
+
220
+ **Что считается.** **Одно** значение: последнее значение переменной рекурсии. Не множество пройденных шагов.
221
+
222
+ **Ступень.** Ступень переменной рекурсии; пересчёт той же ступени.
223
+
224
+ **Не сосед.** [Императивный перебор](#императивный-перебор-i) собирает множество. Буква `R` перед `{` — синтаксис рекурсии, не [радикал `R#`](#параметризованные-выражения-f-p) и не конституента.
225
+
226
+ **Как сказать.** «начинаем с базы и подставляем формулу следующего шага, пока условие истинно или пока значение не перестанет меняться; результат — последнее значение» (рекурсивная / циклическая конструкция).
227
+
228
+ **Пример.** `R{ξ := 1 | ξ < 32 | 2 * ξ} = 32`. Кортеж: `R{(ξ, σ) := (1, 0) | σ < 5 | (2 * ξ, σ + 1)}` удваивает `ξ` пять раз (`ξ` доходит до 32); значение конструкции — последняя пара.
229
+
230
+ **Антипаттерн.** Говорить, что `R{}` «возвращает множество всех итераций». Путать `R{…}` с радикалом `R1` в `[α∈R1]`.
231
+
232
+ **Справка.** [Циклическая конструкция](https://portal.acconcept.ru/manuals?topic=rslang-expression-recursive).
233
+
234
+ ## Кванторы
235
+
236
+ **Запись.** `∀ξ∈A (P(ξ))` — всеобщность; `∃ξ∈A (P(ξ))` — существование. Кортеж: `∀(ξ1, ξ2)∈S1 (P(ξ1, ξ2))`. Сокращение вложенных кванторов с одним доменом: `∀ξ1, ξ2∈A (P(ξ1, ξ2))`. Скобки вокруг тела можно опустить, только если тело — атомарное ЛВ.
237
+
238
+ **Что считается.** Истинность утверждения о всех или о некоторых элементах множества. Это логическое выражение, не множество.
239
+
240
+ **Ступень.** `Logic`.
241
+
242
+ **Не сосед.** [Отбор `D{}`](#отбор-d) строит множество «те, для кого P». Квантор утверждает «для всех / существует», не отбирает. Кортеж `∀(a, b)∈S` — не то же, что два имени через запятую `∀a, b∈A`.
243
+
244
+ **Как сказать.** «для каждого ξ из A верно P» (квантор всеобщности) или «есть хотя бы один ξ из A, для которого верно P» (квантор существования).
245
+
246
+ **Пример.** `∀x∈D1 ∃y∈D2 ((x, y)∈S1 & (x, x)∈S1)`.
247
+
248
+ **Антипаттерн.** `∀a∈S P(a) & Q(a)`: без скобок `Q(a)` вне области квантора (`localOutOfScopeParentheses`). Нужно `∀a∈S (P(a) & Q(a))`.
249
+
250
+ **Справка.** [Кванторные выражения](https://portal.acconcept.ru/manuals?topic=rslang-expression-quantor).
251
+
252
+ ## Параметризованные выражения (`F#` / `P#`)
253
+
254
+ **Запись.** Объявление: `F1 ::= [α∈A] E(α)` — терм-функция, тело ТМВ; `P1 ::= [α∈A] P(α)` — предикат-функция, тело ЛВ. Вызов: `F1[ξ]`, `P1[ξ1, ξ2]`. Аргументы позиционные, только квадратные скобки.
255
+
256
+ Радикалы `R1`, `R2`, … — шаблонные ступени **только** в доменах параметров `[α∈R1×R2]`. Это не конституенты: в схеме нет записи с именем `R1`. В теле после `]` радикалов быть не должно.
257
+
258
+ **Что считается.** Вызов `F#` считает значение при данных аргументах. Вызов `P#` утверждает истинность при данных аргументах.
259
+
260
+ **Ступень.** У `F#` — ступень тела; у `P#` — `Logic`. Ступень радикала выводится по аргументам в месте вызова; все вхождения одного `R#` в одном определении дают одну ступень.
261
+
262
+ **Не сосед.** Множество пар `I{(ξ, σ) | ξ:∈A; σ:=E(ξ)}` — график; однозначная зависимость — терм-функция с вызовом `F[ξ]`. Рекурсия `R{…}` и радикал `R#` — разные буквы `R`.
263
+
264
+ **Как сказать.** «F1 по аргументу ξ считает …» (терм-функция, вызов `F1[ξ]`). «P1 при аргументах … утверждает, что …» (предикат-функция). Если в доменах `R#`: «это шаблон: ступень подставляется по месту вызова» (радикал, не понятие схемы).
265
+
266
+ **Пример.** `[ξ∈X1] Pr2(Fi1[{ξ}](S1))` — исходящие соседи; вызов `F1[α]`. Шаблон: `[α1∈R1×R2, α2∈R1] α2 = pr1(α1)`.
267
+
268
+ **Антипаттерн.** `F1(ξ)` вместо `F1[ξ]`. Голое `F1` без `[…]`. «Пропущенная конституента `R1`» или добавление `R1` в схему. Радикал в теле формулы (`radicalUsage`).
269
+
270
+ **Справка.** [Параметризованные выражения](https://portal.acconcept.ru/manuals?topic=rslang-expression-parameter). Выбор `F#` против пар — [CONCEPTUAL-SCHEMA.md](CONCEPTUAL-SCHEMA.md).
271
+
272
+ ## Типичная цепочка
273
+
274
+ Это **не** отдельный оператор языка. Так в схемах читают связь «аргумент ξ → связанные объекты в отношении S».
275
+
276
+ ```text
277
+ Pr2(Fi1[{ξ}](S1))
278
+ ```
279
+
280
+ Снаружи: множество вторых компонент тех пар из `S1`, у которых первая компонента равна `ξ`. Если `S1` — ориентированные рёбра, это концы рёбер из `ξ`.
281
+
282
+ Разбор карточками, изнутри:
283
+
284
+ 1. `{ξ}` — синглетон, фильтру нужно множество допустимых первых компонент.
285
+ 2. `Fi1[{ξ}](S1)` — фильтр, рёбра (пары) с началом `ξ`.
286
+ 3. `Pr2(...)` — большая проекция, множество концов.
287
+
288
+ В определениях эту зависимость обычно оформляют [терм-функцией](#параметризованные-выражения-f-p) `[ξ∈X1] Pr2(Fi1[{ξ}](S1))`, а не множеством пар. Правило проектирования — [CONCEPTUAL-SCHEMA.md](CONCEPTUAL-SCHEMA.md), «Терм-функция вместо множества пар». При объяснении цепочку всё равно разбирай карточками `Fi` и `Pr`.
289
+
290
+ ## Образец разбора
291
+
292
+ Конституента: терм-функция `F1`, термин «исходящие соседи».
293
+ `S1 : ℬ(X1×X1)`, конвенция: ориентированные рёбра `(начало, конец)`.
294
+
295
+ Формула:
296
+
297
+ ```text
298
+ [ξ∈X1] Pr2(Fi1[{ξ}](S1))
299
+ ```
300
+
301
+ Это теоретико-множественное выражение: по узлу `ξ` считается множество, а не истинность.
302
+
303
+ Снаружи. Для элемента `ξ` базисного множества `X1` получается множество вторых компонент тех пар из `S1`, у которых первая компонента — `ξ`. По конвенции это множество концов рёбер, выходящих из `ξ`.
304
+
305
+ Цепочка:
306
+
307
+ - `{ξ}` — множество, в котором только `ξ` (синглетон): фильтру нужен набор допустимых первых компонент, не сам элемент.
308
+ - `Fi1[{ξ}](S1)` — из отношения `S1` оставляем кортежи с первой компонентой `ξ` (фильтр).
309
+ - `Pr2(...)` — множество вторых компонент этих кортежей (большая проекция).
310
+
311
+ Ступень. Параметр `ξ∈X1`, результат `ℬ(X1)`. Опоры: `X1`, `S1`.
312
+
313
+ Ссылок на справку Portal в таком разборе нет. Вычисление на данных — только по отдельному запросу.
314
+
315
+ ## Классические операции
316
+
317
+ Короткие строки. Не разворачивай их в отдельные главы и не читай `SYNTAX.md` целиком, чтобы объяснить объединение.
318
+
319
+ Справка по группам: [теоретико-множественные](https://portal.acconcept.ru/manuals?topic=rslang-expression-set), [структурные](https://portal.acconcept.ru/manuals?topic=rslang-expression-structure), [арифметика](https://portal.acconcept.ru/manuals?topic=rslang-expression-arithmetic).
320
+
321
+ ### Объединение, пересечение, разность
322
+
323
+ | Запись | Как сказать | Пример |
324
+ | :----- | :---------- | :----- |
325
+ | `A ∪ B` | элементы, которые есть в A или в B (объединение) | `{1, 2} ∪ {2, 3} = {1, 2, 3}` |
326
+ | `A ∩ B` | элементы, которые есть и в A, и в B (пересечение) | `{1, 2, 3} ∩ {2, 3, 4} = {2, 3}` |
327
+ | `A \ B` | элементы A, которых нет в B (разность) | `{1, 2, 3} \ {2} = {1, 3}` |
328
+ | `A ∆ B` | элементы ровно в одном из двух множеств (симметрическая разность) | `{1, 2} ∆ {2, 3} = {1, 3}` |
329
+
330
+ Операнды одной ступени-множества. Не сосед фильтра: `∪` не «добавляет колонку», а сливает два множества.
331
+
332
+ ### Булеан (`ℬ`)
333
+
334
+ **Как сказать.** «множество всех подмножеств A» (булеан `ℬ(A)`).
335
+
336
+ **Ступень.** Элементы результата сами являются подмножествами A. В типизации `S#` запись `ℬ(X1×X1)` — «множество пар из X1».
337
+
338
+ **Не сосед.** [Синглетон](#синглетон-bool) `bool(a)` — одно подмножество `{a}`, не все подмножества.
339
+
340
+ ### Декартово произведение (`×`)
341
+
342
+ **Как сказать.** «множество всех пар (кортежей) с первой компонентой из A и второй из B» (декартово произведение).
343
+
344
+ **Пример.** Элементы `X1×X2` — пары `(x1, x2)`.
345
+
346
+ **Не сосед.** Один кортеж `(a, b)` — значение, не множество всех пар. [Отбор](#отбор-d) / [фильтр](#фильтр-fi) выбирают из уже построенного произведения или отношения.
347
+
348
+ ### Суммарное множество (`red`)
349
+
350
+ **Как сказать.** «объединение всех множеств, которые являются элементами S» (множество-сумма `red`).
351
+
352
+ **Ступень.** Нужно `S : ℬ(ℬ(H))`. Результат `ℬ(H)`.
353
+
354
+ **Пример.** `red({{1, 2, 3}, {3, 4}}) = {1, 2, 3, 4}`.
355
+
356
+ **Антипаттерн.** `red` по множеству, элементы которого не множества (`invalidReduce`).
357
+
358
+ ### Мощность (`card`)
359
+
360
+ **Как сказать.** «сколько элементов в конечном множестве S» (мощность `card(S)`). Результат — целое (`Z`).
361
+
362
+ **Пример.** `card(X1) > 5` — логическое сравнение мощности.
363
+
364
+ **Не сосед.** `card` не заменяет [квантор](#кванторы) «для всех». Арифметика `+` `-` `*` и порядок `<` только на `Z` или `C#`, не на элементах `X#` ([BASE-SELECTION.md](BASE-SELECTION.md)).
365
+
366
+ ## Ссылка на справку Portal
367
+
368
+ Стабильный адрес: `https://portal.acconcept.ru/manuals?topic=<slug>`.
369
+
370
+ В чат ссылку давай, если пользователь разбирает **конструкцию в абстракции** («что такое фильтр») или явно просит подробнее. При разборе конкретной формулы ссылку на каждый оператор не повторяй.
371
+
372
+ Не читай TSX справки Portal как источник фраз: говори по карточкам этого файла.
@@ -1,8 +1,9 @@
1
1
  # Диагностика
2
2
 
3
3
  Читай, когда `analyzeExpression`, `applySchemaPatch`, `listDiagnostics` или `evaluate`
4
- вернули диагностику. Коды ошибок ЯРЭ — `RSErrorCode` в `@rsconcept/domain`; коды схемы
5
- и модели — `RSDiagnosticCode` в том же пакете (числовой формат совпадает).
4
+ вернули диагностику. Коды ошибок ЯРЭ — `RSErrorCode` в `@rsconcept/domain`; коды схемы,
5
+ модели и таблицы отождествлений — `RSDiagnosticCode` в том же пакете (числовой формат совпадает;
6
+ `SubstitutionErrorType` — алиасы кодов отождествлений).
6
7
 
7
8
  ## Формы диагностики
8
9
 
@@ -23,9 +24,30 @@
23
24
  | `alias?` | обозначение конституенты |
24
25
  | `expression` | текст формулы или затронутого поля |
25
26
  | `from`, `to` | полуинтервал `[from, to)` в `expression` |
27
+ | `stack?` | цепочка вызовов при ошибке внутри тела `F#`/`P#` (см. ниже) |
26
28
 
27
29
  Фильтры `listDiagnostics({ kind, constituentId, severity })`.
28
30
 
31
+ ### Стек вызовов (`stack`)
32
+
33
+ При вычислении ошибки внутри вызванной терм-/предикат-функции (`E81xx` и любые
34
+ runtime-ошибки в теле `F#`/`P#`) диагностика несёт `stack` — кадры от места сбоя
35
+ наружу. Если ошибки нет в вызове (сбой в самом корневом выражении) — `stack`
36
+ отсутствует:
37
+
38
+ | Поле | Смысл |
39
+ | ------------ | ---------------------------------------- |
40
+ | `alias` | конституента, в чьей формуле лежит span |
41
+ | `from`, `to` | полуинтервал в формуле этой конституенты |
42
+
43
+ Порядок: **сначала место ошибки**, затем call site во внешнем вызывающем, …
44
+ Корневое выражение в стек не входит: его call site — в `from`/`to` самой
45
+ диагностики (подсветка в редакторе). Пример `F7[X1]` → `F8[…]` → `debool`:
46
+ `stack[0] = { alias: 'F8', … }`, `stack[1] = { alias: 'F7', … }`, а
47
+ корневой `F7[X1]` — только в `from`/`to`.
48
+
49
+ Форматирование для людей: `formatEvalCallStack` из `@rsconcept/domain` → `F7 → F8`.
50
+
29
51
  ## Где лежит диагностика
30
52
 
31
53
  Три категории (`kind`), собранные в `listDiagnostics` после `applySchemaPatch`,
@@ -39,17 +61,36 @@
39
61
 
40
62
  ## Схема (Portal)
41
63
 
42
- | Код | Имя | `params` | Исправление |
43
- | -------- | ------------------------- | -------------------- | --------------------------------------------------------------------------------------- |
44
- | `0x8901` | `schemaHomonym` | `[aliases]` | Термин совпадает с другими конституентами (`aliases` через запятую). Переименуй термин. |
45
- | `0x8902` | `schemaFormalDuplicate` | `[aliases]` | Нормализованная формула совпадает с `aliases`. Объедини или различай определения. |
46
- | `0x8903` | `schemaMissingConvention` | — | У `basic`/`constant`/`structure` нужна конвенция. |
47
- | `0x8904` | `schemaMissingTerm` | — | У неопределяемого понятия нужен термин. |
48
- | `0x8905` | `schemaTypeMismatch` | `[manual, computed]` | расхождение ручной и вычисленной типизации. |
49
- | `0x8906` | `schemaDependencyCycle` | `[cycle]` | Круг в графе определений (`F3 → P1 → F3`). Разорви цикл: убери взаимные ссылки. |
64
+ | Код | Имя | `params` | Исправление |
65
+ | -------- | ------------------------- | -------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- |
66
+ | `0x8901` | `schemaHomonym` | `[aliases]` | Термин совпадает с другими конституентами (`aliases` через запятую). Переименуй термин. |
67
+ | `0x8902` | `schemaFormalDuplicate` | `[aliases]` | Нормализованная формула совпадает с `aliases`. Объедини или различай определения. |
68
+ | `0x8903` | `schemaMissingConvention` | — | У `basic`/`constant`/`structure` нужна конвенция. |
69
+ | `0x8904` | `schemaMissingTerm` | — | У неопределяемого понятия нужен термин. |
70
+ | `0x8905` | `schemaTypeMismatch` | `[manual, computed]` | расхождение ручной и вычисленной типизации. |
71
+ | `0x8906` | `schemaDependencyCycle` | `[cycle]` | Круг в графе определений (`F3 → P1 → F3`). Разорви цикл: убери взаимные ссылки. Тот же код — у таблицы отождествлений после применения подстановок. |
50
72
 
51
73
  Поле `params` для омонимов/дубликатов — `[aliases]` (строка с alias через запятую).
52
74
 
75
+ ## Таблица отождествлений
76
+
77
+ Коды в том же пространстве, что `RSDiagnosticCode` / `RSErrorCode`. Короткие имена `SubstitutionErrorType.*` — алиасы. Логический круг в определениях — **`schemaDependencyCycle` (`0x8906`)**, не отдельный код.
78
+
79
+ | Код | Имя | `params` | Исправление |
80
+ | -------- | --------------------------------- | -------------- | ------------------------------------------------------------------ |
81
+ | `0x8920` | `substitutionInvalidIDs` | — | Некорректные id схем/конституент в таблице. |
82
+ | `0x8921` | `substitutionIncorrectCst` | `[from, to]` | У одной из пары некорректное выражение. |
83
+ | `0x8922` | `substitutionInvalidClasses` | `[from, to]` | Классы конституент несовместимы для отождествления. |
84
+ | `0x8923` | `substitutionInvalidBasic` | `[from, to]` | Нельзя заменять структурное понятие базисным множеством. |
85
+ | `0x8924` | `substitutionInvalidConstant` | `[from, to]` | Константное множество только вместо другого константного. |
86
+ | `0x8925` | `substitutionTypificationCycle` | `[detail]` | Цикл подстановок в типизациях. |
87
+ | `0x8926` | `substitutionBaseNotSet` | `[from, type]` | Типизация замещающей не задаёт множество. |
88
+ | `0x8927` | `substitutionUnequalTypification` | `[from, to]` | Типизации операндов не совпадают с учётом таблицы. |
89
+ | `0x2928` | `substitutionUnequalExpressions` | `[from, to]` | Предупреждение: формальные определения различаются (не блокирует). |
90
+ | `0x8929` | `substitutionUnequalArgsCount` | `[from, to]` | Число аргументов параметризованных конституент не совпадает. |
91
+ | `0x892A` | `substitutionUnequalArgs` | `[from, to]` | Типизации аргументов не совпадают. |
92
+ | `0x892B` | `substitutionInvalidNominal` | `[from, to]` | Номиноид только вместо другого номиноида. |
93
+
53
94
  ## Модель (Portal)
54
95
 
55
96
  Статусы соответствуют фильтру «проблемы модели» в UI (`isModelIssue`).
@@ -77,7 +118,8 @@
77
118
 
78
119
  - Диапазоны: `0x84xx` — parser (синтаксис, скобки), `0x88xx` — semantic (типизация, область
79
120
  видимости, структура, схема, отсутствие значения), `0x81xx` — evaluation (вычисление КМ),
80
- - `0x2xxx` — предупреждения (не блокируют, `isCritical` возвращает `false`).
121
+ `0x89xx` — schema / model / substitution diagnostics (`RSDiagnosticCode`),
122
+ - `0x2xxx` — предупреждения (не блокируют, `isCritical` возвращает `false`; в т.ч. `0x2928` unequalExpressions).
81
123
 
82
124
  ## Parser
83
125
 
@@ -168,26 +210,26 @@
168
210
 
169
211
  ## Значение и схема
170
212
 
171
- | Код | Имя | `params` | Исправление |
172
- | -------- | ---------------------- | ------------------ | --------------------------------------------------------------------------------------------------------- |
173
- | `0x8840` | `globalNoValue` | `[name]` | Идентификатор `name` невычислим в модели. |
174
- | `0x8841` | `invalidPropertyUsage` | — | `Property` - множество использовано как вычислимое значение. |
175
- | `0x8861` | `cstEmptyDerived` | — | У выводимой конституенты пустая формула. |
176
- | `0x8862` | `definitionNotAllowed` | `[cstType, alias]` | У `basic`/`constant` формула должна быть пустой; `cstType` — роль конституенты, `alias` — её обозначение. |
213
+ | Код | Имя | `params` | Исправление |
214
+ | -------- | ---------------------- | ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
215
+ | `0x8840` | `globalNoValue` | `[name]` | Идентификатор `name` невычислим в модели. |
216
+ | `0x8841` | `invalidPropertyUsage` | — | `Property` - множество использовано как вычислимое значение (типично: квантор по `ℬ(S1)` / `ℬ(X1)`). Перепиши через вычислимые термы (`F#` достижимости, `card`, `Pr`) или оставь как декларативную формулировку и укажи это в ревью. |
217
+ | `0x8861` | `cstEmptyDerived` | — | У выводимой конституенты пустая формула. |
218
+ | `0x8862` | `definitionNotAllowed` | `[cstType, alias]` | У `basic`/`constant` формула должна быть пустой; `cstType` — роль конституенты, `alias` — её обозначение. |
177
219
 
178
220
  ## Вычисление КМ
179
221
 
180
- | Код | Имя | `params` | Исправление |
181
- | -------- | ------------------------- | ------------------ | ---------------------------------------------------------------------- |
182
- | `0x8100` | `calcUnknownError` | — | Непредвиденная ошибка вычисления. |
183
- | `0x8101` | `setOverflow` | `[limit]` | Превышен предел числа элементов `limit`: упрости выражение или данные. |
184
- | `0x8102` | `booleanBaseLimit` | `[limit]` | Превышен предел базы степенного множества `limit`. |
185
- | `0x8103` | `calcGlobalMissing` | `[name]` | Нет значения для `name`: задай через `setModelValues`. |
186
- | `0x8104` | `iterationsLimit` | `[limit]` | Превышен предел итераций `limit`. |
187
- | `0x8105` | `calcInvalidDebool` | — | `debool` получил не синглетон. |
188
- | `0x8106` | `iterateInfinity` | — | Итерация по бесконечному множеству. |
189
- | `0x8107` | `calculationNotSupported` | — | Объявление функции не подразумевает вычисления. |
190
- | `0x8108` | `calcInvalidData` | `[a, b, operator]` | Несовместимые значения `a` и `b` для `operator` в runtime. |
222
+ | Код | Имя | `params` | Исправление |
223
+ | -------- | ------------------------- | ------------------ | -------------------------------------------------------------------------------------- |
224
+ | `0x8100` | `calcUnknownError` | — | Непредвиденная ошибка вычисления. |
225
+ | `0x8101` | `setOverflow` | `[limit]` | Превышен предел числа элементов `limit`: упрости выражение или данные. |
226
+ | `0x8102` | `booleanBaseLimit` | `[limit]` | Превышен предел базы степенного множества `limit`. |
227
+ | `0x8103` | `calcGlobalMissing` | `[name]` | Нет значения для `name`: задай через `setModelValues`. |
228
+ | `0x8104` | `iterationsLimit` | `[limit]` | Превышен предел итераций `limit`. |
229
+ | `0x8105` | `calcInvalidDebool` | — | `debool` получил не синглетон. Смотри `stack`, если в исходном выражении нет `debool`. |
230
+ | `0x8106` | `iterateInfinity` | — | Итерация по бесконечному множеству. |
231
+ | `0x8107` | `calculationNotSupported` | — | Объявление функции не подразумевает вычисления. |
232
+ | `0x8108` | `calcInvalidData` | `[a, b, operator]` | Несовместимые значения `a` и `b` для `operator` в runtime. |
191
233
 
192
234
  ## Цикл исправления
193
235
 
package/docs/DOMAIN.md CHANGED
@@ -60,6 +60,7 @@
60
60
  - **Синтез** — общее название операций объединения концептуальных схем через таблицу отождествлений.
61
61
  - **Встраивание** — вставка конституент одной КС в другую (с опциональной таблицей отождествлений). В Portal UI — «Встраивание схемы»; в rstool — метод `synthesize`.
62
62
  - **Отождествление** — замена одной конституенты другой по таблице отождествлений.
63
+ - Валидация таблицы отождествлений (`SubstitutionValidator`) проверяет, среди прочего: совместимость классов/типизаций, **цикл подстановок в типизациях** (через **базисные** и **константные множества** в типизациях конституент, **отличных от** базисных/константных), и **логический круг в формальных определениях** после применения таблицы.
63
64
 
64
65
  ## ОСС
65
66
 
@@ -73,13 +74,17 @@
73
74
 
74
75
  ### Термины: не путать (для агентов)
75
76
 
76
- В ответах пользователю и в конвенциях КС используй только термины из этого файла. Не вводи собственные ярлыки («базис», «базисный слой», «каркас схемы») — они не закреплены в Portal и размывают различия ниже.
77
+ В ответах пользователю и в конвенциях КС используй только термины из этого файла. Не вводи собственные ярлыки («базис», «базисы», «базисный слой», «базовые понятия», «каркас схемы») — они не закреплены в Portal и размывают различия ниже.
78
+
79
+ Источник термина **«базисное множество»** — строка типа `X#` в таблице конституент ниже и в [CONSTITUENTA.md](CONSTITUENTA.md) / [BASE-SELECTION.md](BASE-SELECTION.md). Не сокращай до «базис» / «базисы».
77
80
 
78
81
  | Не используй | Используй | Почему |
79
82
  | :------------------------------------------------------ | :------------------------------------------------------------------------------------------ | :-------------------------------------------------------------------------- |
80
- | «базис», «базисный слой», «первый слой» (без уточнения) | **неопределяемые понятия** — `X#`, `C#`, `S#` | Общий термин для всего неопределяемого слоя |
83
+ | «базис», «базисы», «базисный слой», «первый слой» | **неопределяемые понятия** — `X#`, `C#`, `S#` | Общий термин для всего неопределяемого слоя |
84
+ | «базовые понятия» | **неопределяемые понятия** | «базовые» смешивается с базисными множествами |
81
85
  | «базис» / «базисное» про `C#` или `S#` | **константное множество** (`C#`), **родовая структура** (`S#`) | **Базисное множество** — только про `X#` |
82
86
  | «базисные множества» как синоним неопределяемых понятий | **базисные множества** — только несколько `X#`; для всего слоя — **неопределяемые понятия** | `C#` и `S#` базисными множествами не называются |
87
+ | «не базисные» без уточнения | **конституенты, отличные от базисных и константных множеств** (или тип: терм, `F#`, …) | Иначе путается с «не базисные множества» как классом vs отрицанием |
83
88
  | «ядро» = неопределяемые понятия» | **ядро КС** — неопределяемые понятия плюс аксиомы и производные, нужные для аксиом | Ядро шире, чем только `X#` / `C#` / `S#` |
84
89
  | теорема про `T#` | **высказывание** — производное логическое выражение `T#` | тип теорема на Portal отсутствует и вводит в заблуждение |
85
90
  | «пропущенная конституента `R1`» в списке схемы | **радикал** `R#` — параметр шаблона в домене `F#` / `P#` | `R#` не объявляется; при ревью КС отсутствие `R1` среди конституент — норма |