@rsconcept/rstool 1.7.1 → 2.0.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 (126) hide show
  1. package/README.md +7 -7
  2. package/dist/index.js +1 -1
  3. package/dist/mappers/model-adapter.d.ts +6 -2
  4. package/dist/mappers/model-adapter.js +28 -3
  5. package/dist/mappers/model-adapter.js.map +1 -1
  6. package/dist/mappers/schema-adapter.d.ts +1 -2
  7. package/dist/mappers/schema-adapter.js +1 -1
  8. package/dist/mappers/types.d.ts +4 -5
  9. package/dist/models/index.js +1 -1
  10. package/dist/models/rstool-agent.js +1 -2
  11. package/dist/{models-DG2uTaV_.js → models-D06g8LId.js} +6 -5
  12. package/dist/{models-DG2uTaV_.js.map → models-D06g8LId.js.map} +1 -1
  13. package/dist/{rsform-builder-DKwZfJvN.js → rsform-builder-BlXEe5Ow.js} +2 -2
  14. package/dist/{rsform-builder-DKwZfJvN.js.map → rsform-builder-BlXEe5Ow.js.map} +1 -1
  15. package/dist/session/session-store.d.ts +3 -3
  16. package/dist/session/session-store.js +1 -2
  17. package/dist/wrapper/client.d.ts +15 -9
  18. package/dist/wrapper/client.js +79 -12
  19. package/dist/wrapper/client.js.map +1 -1
  20. package/dist/wrapper/stdio-wrapper.d.ts +1 -1
  21. package/dist/wrapper/stdio-wrapper.js +18 -10
  22. package/dist/wrapper/stdio-wrapper.js.map +1 -1
  23. package/docs/BRIEF.md +93 -0
  24. package/docs/CONCEPTUAL-SCHEMA.md +17 -2
  25. package/docs/CONSTRUCTIONS.md +384 -0
  26. package/docs/DIAGNOSTICS.md +9 -8
  27. package/docs/DOMAIN.md +12 -0
  28. package/docs/METHOD.md +208 -0
  29. package/docs/MODEL-TESTING.md +48 -0
  30. package/docs/PORTAL-API.md +38 -285
  31. package/docs/PORTAL-MODELS.md +24 -0
  32. package/docs/PORTAL-OSS.md +56 -0
  33. package/docs/PORTAL-PUBLISH.md +39 -0
  34. package/docs/PORTAL-READ.md +301 -0
  35. package/docs/README.md +8 -4
  36. package/docs/REQUIREMENTS.md +61 -0
  37. package/docs/SYNTAX.md +5 -4
  38. package/docs/TYPIFICATION.md +12 -3
  39. package/docs/brief.schema.json +173 -0
  40. package/examples/README.md +16 -2
  41. package/examples/access-control/NOTES.md +23 -0
  42. package/examples/access-control/anti/collapsed.json +439 -0
  43. package/examples/access-control/anti/weakened.json +439 -0
  44. package/examples/access-control/brief-v1.json +231 -0
  45. package/examples/access-control/brief.json +310 -0
  46. package/examples/access-control/build-rsform.ts +151 -0
  47. package/examples/access-control/requirements-v1.md +9 -0
  48. package/examples/access-control/requirements-v2.md +4 -0
  49. package/examples/access-control/rsform-session-v1.json +439 -0
  50. package/examples/access-control/rsform-session.json +523 -0
  51. package/examples/audit-diagnostics.ts +9 -1
  52. package/examples/briefs.test.ts +126 -0
  53. package/examples/clinic-booking/NOTES.md +24 -0
  54. package/examples/clinic-booking/anti/collapsed.json +615 -0
  55. package/examples/clinic-booking/anti/species-as-genus.json +568 -0
  56. package/examples/clinic-booking/brief-v1.json +332 -0
  57. package/examples/clinic-booking/brief.json +405 -0
  58. package/examples/clinic-booking/build-rsform.ts +174 -0
  59. package/examples/clinic-booking/requirements-v1.md +9 -0
  60. package/examples/clinic-booking/requirements-v2.md +4 -0
  61. package/examples/clinic-booking/rsform-session-v1.json +615 -0
  62. package/examples/clinic-booking/rsform-session.json +700 -0
  63. package/examples/diagnostics-utils.ts +26 -0
  64. package/examples/kinship/brief.json +337 -0
  65. package/examples/kinship/build-rsform.ts +7 -4
  66. package/examples/kinship/rsform-session.json +20 -63
  67. package/examples/kinship/rsmodel-session.json +14 -14
  68. package/examples/kinship-subordination/NOTES.md +49 -0
  69. package/examples/kinship-subordination/brief.json +161 -0
  70. package/examples/kinship-subordination/build-rsform.ts +100 -0
  71. package/examples/kinship-subordination/rsform-session.json +795 -0
  72. package/examples/library-loans/NOTES.md +46 -0
  73. package/examples/library-loans/anti/collapsed.json +481 -0
  74. package/examples/library-loans/anti/species-as-genus.json +334 -0
  75. package/examples/library-loans/anti/uncovered.json +406 -0
  76. package/examples/library-loans/anti/weakened.json +464 -0
  77. package/examples/library-loans/brief-v1.json +340 -0
  78. package/examples/library-loans/brief.json +502 -0
  79. package/examples/library-loans/build-rsform.ts +239 -0
  80. package/examples/library-loans/requirements-v1.md +11 -0
  81. package/examples/library-loans/requirements-v2.md +5 -0
  82. package/examples/library-loans/rsform-session-v1.json +481 -0
  83. package/examples/library-loans/rsform-session.json +652 -0
  84. package/examples/library-loans/source-markup.md +18 -0
  85. package/examples/movd/brief.json +220 -0
  86. package/examples/movd/build-rsform.ts +5 -2
  87. package/examples/movd/rsform-session.json +14 -46
  88. package/examples/subordination/NOTES.md +59 -0
  89. package/examples/subordination/anti/collapsed.json +556 -0
  90. package/examples/subordination/anti/single-relation.json +125 -0
  91. package/examples/subordination/anti/transitive.json +573 -0
  92. package/examples/subordination/anti/weakened.json +539 -0
  93. package/examples/subordination/brief.json +386 -0
  94. package/examples/subordination/build-rsform.ts +63 -0
  95. package/examples/subordination/constants.ts +115 -0
  96. package/examples/subordination/rsform-session.json +556 -0
  97. package/examples/subordination/source-markup.md +19 -0
  98. package/examples/subordination/source.md +40 -0
  99. package/package.json +29 -20
  100. package/skills/INSTALL.md +28 -29
  101. package/skills/README.md +25 -10
  102. package/skills/rs-core/SKILL.md +56 -0
  103. package/skills/rs-explain/SKILL.md +28 -0
  104. package/skills/rs-explicate/SKILL.md +71 -0
  105. package/skills/rs-interpret/SKILL.md +67 -0
  106. package/skills/rs-portal/SKILL.md +51 -0
  107. package/skills/rs-review/SKILL.md +79 -0
  108. package/skills/rs-scope/SKILL.md +67 -0
  109. package/skills/rs-synthesis/SKILL.md +52 -0
  110. package/skills/rstool/SKILL.md +70 -0
  111. package/skills/rstool-helper/GUIDE.md +18 -272
  112. package/skills/rstool-helper/SKILL.md +8 -55
  113. package/skills/{rstool-helper → rstool-runtime}/EXAMPLES.md +40 -12
  114. package/skills/{rstool-helper → rstool-runtime}/REFERENCE.md +28 -7
  115. package/skills/rstool-runtime/SKILL.md +96 -0
  116. package/skills/scripts/brief-check.test.ts +165 -0
  117. package/skills/scripts/brief-check.ts +826 -0
  118. package/skills/scripts/check-brief.ts +94 -0
  119. package/skills/scripts/rstool-skills.mjs +119 -0
  120. package/skills/scripts/skill-stubs.test.ts +48 -0
  121. package/src/mappers/model-adapter.ts +34 -1
  122. package/src/models/rstool-agent.test.ts +95 -0
  123. package/src/wrapper/client.test.ts +43 -4
  124. package/src/wrapper/client.ts +95 -16
  125. package/src/wrapper/stdio-handler.test.ts +43 -0
  126. package/src/wrapper/stdio-handler.ts +19 -5
@@ -0,0 +1,384 @@
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
+ ### Пустое множество (`∅`)
359
+
360
+ **Запись.** `∅`. Сравнение: `S = ∅`, `S ≠ ∅`.
361
+
362
+ **Что считается.** Пустое множество. В равенстве и неравенстве типизация `ℬ(R0)` подстраивается под сравниваемое множество.
363
+
364
+ **Как сказать.** «S пусто» / «S непусто».
365
+
366
+ **Пример.** `F1[a] ∩ F1[b] ≠ ∅` — пересечение непусто.
367
+
368
+ **Антипаттерн.** `card(S) > 0` или `card(S) = 0` вместо сравнения с `∅`. `X1 ∪ ∅` — бессмысленная операция (`invalidEmptySetUsage`).
369
+
370
+ ### Мощность (`card`)
371
+
372
+ **Как сказать.** «сколько элементов в конечном множестве S» (мощность `card(S)`). Результат — целое (`Z`).
373
+
374
+ **Пример.** `card(X1) > 5` — логическое сравнение мощности. `card(S) = 1` — ровно один элемент.
375
+
376
+ **Не сосед.** (Не)пустота — карточка «Пустое множество» выше. `card` не заменяет [квантор](#кванторы) «для всех». Арифметика `+` `-` `*` и порядок `<` только на `Z` или `C#`, не на элементах `X#` ([BASE-SELECTION.md](BASE-SELECTION.md)).
377
+
378
+ ## Ссылка на справку Portal
379
+
380
+ Стабильный адрес: `https://portal.acconcept.ru/manuals?topic=<slug>`.
381
+
382
+ В чат ссылку давай, если пользователь разбирает **конструкцию в абстракции** («что такое фильтр») или явно просит подробнее. При разборе конкретной формулы ссылку на каждый оператор не повторяй.
383
+
384
+ Не читай TSX справки Portal как источник фраз: говори по карточкам этого файла.
@@ -178,6 +178,7 @@ runtime-ошибки в теле `F#`/`P#`) диагностика несёт `s
178
178
  | `0x8808` | `invalidCard` | `[arg]` | `card(arg)` только над множеством. |
179
179
  | `0x8809` | `invalidDebool` | `[arg]` | `debool(arg)` требует ступень-множество с гарантией синглетона. |
180
180
  | `0x880B` | `globalFuncWithoutArgs` | `[name]` | Терм-/предикат-функция `name` вызвана без аргументов: нужен `F#[…]` / `P#[…]`. |
181
+ | `0x880C` | `globalDeleted` | `[name]` | Ссылка на удаленную конституенту: при удалении в формулах зависимых конституент обозначение заменяется на `DEL`. Подставь действующее обозначение или перепиши формулу. Синтаксические ошибки в такой формуле не сообщаются. |
181
182
  | `0x8830` | `projectionSetArgumentNotSet` | `[operator, actual]` | `Pr*` применяется к множеству; аргумент не типизирован как `ℬ(H)`. |
182
183
  | `0x8831` | `projectionSetArgumentNotTupleSet` | `[operator, actual]` | `Pr*` требует множество кортежей `ℬ(H1×…×Hn)`; аргумент — множество не-кортежей, напр. `ℬ(X1)`. |
183
184
  | `0x8832` | `projectionSetIndexOutOfRange` | `[operator, index, arity, actual]` | Индекс проекции `index` превышает размерность `arity` кортежа аргумента `actual`. |
@@ -186,7 +187,7 @@ runtime-ошибки в теле `F#`/`P#`) диагностика несёт `s
186
187
  | `0x8813` | `invalidEnumeration` | `[a, b]` | Элементы перечисления разной типизации (`a` ≠ `b`). |
187
188
  | `0x8814` | `invalidCortegeDeclare` | — | Число переменных кортежа ≠ размерности `×` (напр. `∀(a,b)∈X1`). |
188
189
  | `0x8816` | `invalidElementPredicate` | `[a, operator, c]` | `a operator c` (`ξ∈S`) с несовместимыми ступенями: `a` — тип элемента, `c` — тип множества. |
189
- | `0x8817` | `invalidEmptySetUsage` | — | Бессмысленное использование `∅` (напр. `X1∪∅`). |
190
+ | `0x8817` | `invalidEmptySetUsage` | — | Бессмысленное использование `∅` как нейтрального элемента операций (напр. `X1∪∅`). Сравнение `S=∅` / `S≠∅` допустимо. |
190
191
  | `0x8818` | `invalidArgsArity` | `[expected, actual]` | Неверное число аргументов функции (`expected` ≠ `actual`). |
191
192
  | `0x8819` | `invalidArgumentType` | `[expected, actual]` | Тип аргумента не соответствует объявлению: ожидалось `expected`, получено `actual`. |
192
193
  | `0x881C` | `globalStructure` | — | Некорректный домен родовой структуры (`cstType` STRUCTURED): нужна ступень-структура вроде `ℬ(X1×D2)`, а не, напр., `X1∩X1`. |
@@ -210,12 +211,12 @@ runtime-ошибки в теле `F#`/`P#`) диагностика несёт `s
210
211
 
211
212
  ## Значение и схема
212
213
 
213
- | Код | Имя | `params` | Исправление |
214
- | -------- | ---------------------- | ------------------ | --------------------------------------------------------------------------------------------------------- |
215
- | `0x8840` | `globalNoValue` | `[name]` | Идентификатор `name` невычислим в модели. |
216
- | `0x8841` | `invalidPropertyUsage` | — | `Property` - множество использовано как вычислимое значение. |
217
- | `0x8861` | `cstEmptyDerived` | — | У выводимой конституенты пустая формула. |
218
- | `0x8862` | `definitionNotAllowed` | `[cstType, alias]` | У `basic`/`constant` формула должна быть пустой; `cstType` — роль конституенты, `alias` — её обозначение. |
214
+ | Код | Имя | `params` | Исправление |
215
+ | -------- | ---------------------- | ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
216
+ | `0x8840` | `globalNoValue` | `[name]` | Идентификатор `name` невычислим в модели. |
217
+ | `0x8841` | `invalidPropertyUsage` | — | `Property` - множество использовано как вычислимое значение (типично: квантор по `ℬ(S1)` / `ℬ(X1)`). Перепиши через вычислимые термы (`F#` достижимости, `card`, `Pr`) или оставь как декларативную формулировку и укажи это в ревью. |
218
+ | `0x8861` | `cstEmptyDerived` | — | У выводимой конституенты пустая формула. |
219
+ | `0x8862` | `definitionNotAllowed` | `[cstType, alias]` | У `basic`/`constant` формула должна быть пустой; `cstType` — роль конституенты, `alias` — её обозначение. |
219
220
 
220
221
  ## Вычисление КМ
221
222
 
@@ -233,4 +234,4 @@ runtime-ошибки в теле `F#`/`P#`) диагностика несёт `s
233
234
 
234
235
  ## Цикл исправления
235
236
 
236
- Пошаговый цикл — в `../skills/rstool-helper/GUIDE.md`, раздел «Цикл диагностик». Здесь — справочник кодов.
237
+ Пошаговый цикл — в `../skills/rs-explicate/SKILL.md`, раздел «Цикл диагностик». Здесь — справочник кодов.
package/docs/DOMAIN.md CHANGED
@@ -22,6 +22,18 @@
22
22
  - **Интерпретация** — соотнесение понятий КС с сущностями предметной области. В концептуальной модели задаётся значениями неопределяемых конституент и вычислением производных.
23
23
  - **Биективная переносимость** — независимость значения формального определения от биективной замены интерпретаций неопределяемых понятий. Для `X#` опирается на несравнимость элементов; анализатор ЯРЭ отсекает формулы, нарушающие переносимость.
24
24
 
25
+ ## Термины метода
26
+
27
+ Процесс концептуализации — [METHOD.md](METHOD.md); бриф — [BRIEF.md](BRIEF.md).
28
+
29
+ - **Требования к выразительным средствам** — понятия, которые КС обязана выразить: то, ради чего её строят. В брифе — `expressiveness`.
30
+ - **Ограничения предметной области** — что сознательно исключено из рассмотрения (время, история, процедуры…) вместе с перечнем понятий, которые из-за этого **невыразимы**. В брифе — `restrictions`.
31
+ - **Различение** — пара понятий, которые схема должна развести, хотя в источнике они смешаны или легко склеиваются.
32
+ - **Журнал решений** — записанные решения о ядре: альтернативы, выбор, обоснование; отсутствие аксиомы — тоже решение. Изменить решение можно только новым решением (`supersedes`).
33
+ - **Сценарий** — маленькая интерпретация неопределяемых понятий подписями элементов с ожидаемыми значениями производных понятий и истинностью аксиом: пример или контрпример.
34
+ - **Микротеория** — небольшая КС одного аспекта (3–6 отношений, 2–4 уровня конкретизации); сложная предметная область собирается из микротеорий синтезом.
35
+ - **Ранг терма** — глубина терма в графе термов от ядра: термы первого ранга строятся непосредственно из неопределяемых понятий.
36
+
25
37
  ## Конституенты
26
38
 
27
39
  **Конституента** — часть КС. Поля и правила валидации см. в [CONSTITUENTA.md](CONSTITUENTA.md); здесь только предметные роли.