@rsconcept/rstool 1.0.2 → 1.1.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.
- package/README.md +2 -15
- package/dist/wrapper/stdio-wrapper.js +0 -0
- package/docs/CONCEPTUAL-SCHEMA.md +12 -31
- package/docs/CONSTITUENTA.md +3 -17
- package/docs/DIAGNOSTICS.md +6 -6
- package/docs/DOMAIN.md +1 -0
- package/docs/MODEL-TESTING.md +1 -2
- package/docs/PORTAL-API.md +1 -18
- package/docs/README.md +1 -2
- package/docs/SYNTAX.md +106 -4
- package/examples/README.md +2 -10
- package/package.json +18 -18
- package/skills/rstool-helper/EXAMPLES.md +1 -3
- package/skills/rstool-helper/GUIDE.md +17 -18
- package/skills/rstool-helper/SKILL.md +2 -2
- package/docs/GRAMMAR-REF.md +0 -47
package/README.md
CHANGED
|
@@ -52,9 +52,7 @@ Or run it as a child process from your own code:
|
|
|
52
52
|
```ts
|
|
53
53
|
import { RSToolWrapperClient } from '@rsconcept/rstool/wrapper';
|
|
54
54
|
|
|
55
|
-
|
|
56
|
-
// For an installed package, pass { command: 'npx', args: ['rstool-wrapper'] }.
|
|
57
|
-
const client = new RSToolWrapperClient();
|
|
55
|
+
const client = new RSToolWrapperClient({ command: 'npx', args: ['rstool-wrapper'] });
|
|
58
56
|
await client.waitUntilReady();
|
|
59
57
|
const session = await client.call<{ sessionId: string }>('createSession');
|
|
60
58
|
await client.close();
|
|
@@ -71,17 +69,6 @@ await client.close();
|
|
|
71
69
|
|
|
72
70
|
Maintainers: see [PUBLISHING.md](./PUBLISHING.md) for npm release steps.
|
|
73
71
|
|
|
74
|
-
## Repo scripts
|
|
75
|
-
|
|
76
|
-
From `rsconcept/rstool` (or run `powershell -File scripts/dev/LocalDevSetup.ps1` from the repo root on Windows):
|
|
77
|
-
|
|
78
|
-
- `npm install` / `npm ci`
|
|
79
|
-
- `npm run typecheck`
|
|
80
|
-
- `npm test`
|
|
81
|
-
- `npm run build` — produce `dist/` via tsdown
|
|
82
|
-
- `npm run wrapper` — dev stdio wrapper via `tsx`
|
|
83
|
-
- `npm run example:client`, `npm run example:build-schema`, `npm run example:build-rsmodel` — полный список `example:*` и `kinship:cli` в [`examples/README.md`](examples/README.md)
|
|
84
|
-
|
|
85
72
|
## Stdio protocol
|
|
86
73
|
|
|
87
74
|
- Input: one JSON request per line.
|
|
@@ -164,7 +151,7 @@ Response:
|
|
|
164
151
|
Run:
|
|
165
152
|
|
|
166
153
|
```bash
|
|
167
|
-
|
|
154
|
+
npx tsx node_modules/@rsconcept/rstool/examples/agent-client.ts
|
|
168
155
|
```
|
|
169
156
|
|
|
170
157
|
File: [`examples/agent-client.ts`](examples/agent-client.ts)
|
|
File without changes
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
- Добавляй конституенту, если есть новый критерий выбора, роль, отношение, инвариант или правило.
|
|
10
10
|
- Если одно различие постоянно переформулируется, выдели отдельную конституенту.
|
|
11
11
|
- Не копируй источник дословно. Строй предметную модель.
|
|
12
|
-
- Разработка КС ведется итеративно - вводи понятия,
|
|
12
|
+
- Разработка КС ведется итеративно - вводи понятия, эксплицируй определения, формируй новый понтия, исследуй предметную область.
|
|
13
13
|
|
|
14
14
|
## Предметная редукция
|
|
15
15
|
|
|
@@ -34,10 +34,11 @@
|
|
|
34
34
|
Если такое возникает — значит есть скрытое отношение, его нужно явно оформить отдельной производной конституентой.
|
|
35
35
|
Если базисные множества пересекаются по интерпретации или набор констант показывает какой-то атрибут — отсутствует нужное отношение, его надо ввести.
|
|
36
36
|
|
|
37
|
+
Не вводи `S#` для отношения, которое предметно зависит от уже заданных структур и должно вычисляться из них. Такое отношение оформляй как `D#`, `F#` или `P#`. Если нужная операция не выражается текущим синтаксисом, фиксируй это как ограничение языка или модели, а не подменяй производное отношение новой независимой структурой.
|
|
38
|
+
|
|
37
39
|
## Родовые структуры
|
|
38
40
|
|
|
39
41
|
`S#` — родовая структура. `definitionFormal` задает типизацию; смысл задают `convention`, интерпретация, аксиомы.
|
|
40
|
-
|
|
41
42
|
Паттерн отношения:
|
|
42
43
|
|
|
43
44
|
1. `X1` — базисное множество.
|
|
@@ -47,36 +48,15 @@
|
|
|
47
48
|
|
|
48
49
|
Повторяется `Pr2(Fi1[...](...))` или похожая цепочка -> введи промежуточный `D#` или `F#`.
|
|
49
50
|
|
|
50
|
-
##
|
|
51
|
-
|
|
52
|
-
Используй, когда нужно объединить несколько КС или в термах повторяются длинные цепочки `∃d1…∃dn`.
|
|
53
|
-
|
|
54
|
-
Строй слоями; слой ссылается только на предыдущие:
|
|
55
|
-
|
|
56
|
-
| Слой | Роль | Ввод |
|
|
57
|
-
| :--- | :-------------------- | :----------------------------------------------------------------------------- |
|
|
58
|
-
| 1 | Базисные множества | `X#`, `C#`; пустой `definitionFormal`, смысл в `convention` / `definitionText` |
|
|
59
|
-
| 2 | Структуры | `S#`; типизация `ℬ(…×…)`, конвенция кортежа |
|
|
60
|
-
| 3 | Инварианты | `A#`; короткие ограничения, чаще через `card` |
|
|
61
|
-
| 4 | Доступ | `F#`; локальный API вида `[α∈…] Pr*(Fi*[…](S#))` |
|
|
62
|
-
| 5 | Центральное отношение | один `D#` или `S#`, задающий полную траекторию синтеза |
|
|
63
|
-
| 6 | Витрина | `D#` через `Pr*`, `Fi*`, `card`, `red`; узкие `F#` для аналитики |
|
|
51
|
+
## Разворачивание понятий
|
|
64
52
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
Единый сценарий фиксируй одним объектом:
|
|
68
|
-
|
|
69
|
-
```text
|
|
70
|
-
D13 ::= I{(α, ξ1, τ, ξ2, β1, β2, ρ, ξ3) |
|
|
71
|
-
α∈S6; ξ1∈X2; τ∈F7[α,ξ1]; …; ξ3∈S3
|
|
72
|
-
}
|
|
73
|
-
```
|
|
53
|
+
При концептуализации вводи понятия по зависимостям: базовые (`X#`, `C#`, независимые `S#`), аксиомы `A#`, затем производные `D#` / `P#` / `A#`. Каждый шаг опирается только на уже введённые конституенты.
|
|
74
54
|
|
|
75
|
-
|
|
55
|
+
Не обязательно сводить схему к одному «центральному» отношению. Зачастую нужны разные понятия на пересечении нескольких аспектов — структур, ролей, ограничений, сценариев. Каждый аспект может дать свои `S#` и `F#`; производные термы выражают их сочетания.
|
|
76
56
|
|
|
77
|
-
|
|
57
|
+
Если один сценарий естественно задаётся кортежем с ограничениями через уже введённые `F#` и `S#`, оформи его как `D#` или независимый `S#`; части кортежа именуй через `D# := Pr#(…)`.
|
|
78
58
|
|
|
79
|
-
##
|
|
59
|
+
## Формулировки аксиом
|
|
80
60
|
|
|
81
61
|
Для функциональности отношения предпочитай `card`:
|
|
82
62
|
|
|
@@ -84,11 +64,12 @@ D13 ::= I{(α, ξ1, τ, ξ2, β1, β2, ρ, ξ3) |
|
|
|
84
64
|
card(S1) = card(Pr1,2(S1))
|
|
85
65
|
```
|
|
86
66
|
|
|
87
|
-
Это заменяет длинные `∀d1,d2∈S1 ...`.
|
|
67
|
+
Это заменяет длинные `∀d1,d2∈S1 ...`.
|
|
68
|
+
Оставляй `∀` / `∃`, только если выражение нельзя задать через множества, проекции, фильтры, `card`.
|
|
88
69
|
|
|
89
|
-
## Производные
|
|
70
|
+
## Производные понятия
|
|
90
71
|
|
|
91
|
-
Если условие уже задано на `S#` или
|
|
72
|
+
Если условие уже задано на `S#` или составном `D#`, производный терм обычно:
|
|
92
73
|
|
|
93
74
|
- `Prk(…)` / `Pri,j(…)`;
|
|
94
75
|
- `Fi*k[{…}](…)`;
|
package/docs/CONSTITUENTA.md
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
- `id` — стабильный id внутри сессии.
|
|
8
8
|
- `alias` — имя вида `X1`, `D5`, `F2`; префикс должен совпадать с `cstType`.
|
|
9
9
|
- `cstType` — роль конституенты.
|
|
10
|
-
- `definitionFormal` — формальное определение; для `basic` и `constant` строго `''
|
|
10
|
+
- `definitionFormal` — формальное определение; для `basic` и `constant` строго `''`; для `structure` — область определения.
|
|
11
11
|
- `term` — термин в естественном языке, используется в текстовых определениях. Если обозначаются элементы множества, то пишется с маленькой буквы во множественном числе. Иначе с большой буквы в единственном.
|
|
12
12
|
- `definitionText` — текстовое определение, соответствующее формальному определению. Для простых выражений не указывается если совпадает с термином. Каждый используемый термин должен быть введен в схеме.
|
|
13
13
|
- `convention` — соглашение для неопределяемого понятия. Может использовать термины, не определенные в схеме.
|
|
@@ -21,8 +21,8 @@
|
|
|
21
21
|
- `nominal` / `N#` — номиноид. В родоструктурной экспликации и формальных определениях не используется.
|
|
22
22
|
- `basic` / `X#` — базисное множество; формула пустая.
|
|
23
23
|
- `constant` / `C#` — константное множество; формула пустая.
|
|
24
|
-
- `structure` / `S#` — родовая структура;
|
|
25
|
-
- `term` / `D#` — терм;
|
|
24
|
+
- `structure` / `S#` — родовая структура; `definitionFormal` задает область определения (типизацию).
|
|
25
|
+
- `term` / `D#` — терм; формальное определение задает вычисляемое значение.
|
|
26
26
|
- `function` / `F#` — терм-функция.
|
|
27
27
|
- `predicate` / `P#` — предикат-функция.
|
|
28
28
|
- `axiom` / `A#` — аксиома; нужна типизация `Logic`.
|
|
@@ -30,20 +30,6 @@
|
|
|
30
30
|
|
|
31
31
|
В модели `basic`, `constant`, `structure` можно интерпретировать через `setModelValues`. `term`, `function`, `predicate`, `axiom`, `statement` вычисляются и напрямую не задаются.
|
|
32
32
|
|
|
33
|
-
## Различие родовой структуры и терма
|
|
34
|
-
|
|
35
|
-
`S#` — неопределяемое понятие - родовая структура. Пример: `definitionFormal: 'ℬ(X1×X1)'` описывает ступень элемента: множество пар над `X1`.
|
|
36
|
-
|
|
37
|
-
`D#` — производное понятие - терм. Пример: `definitionFormal: 'X1×X1'` строит полный декартов продукт.
|
|
38
|
-
|
|
39
|
-
Для бинарного отношения обычно нужно:
|
|
40
|
-
|
|
41
|
-
1. `X1` — базисное множество.
|
|
42
|
-
2. `S1` — `definitionFormal: 'ℬ(X1×X1)'`; конвенция объясняет порядок пары.
|
|
43
|
-
3. `D#` — проекции и фильтры: `Pr1(S1)`, `Pr2(S1)`, `Fi1[D1](S1)`.
|
|
44
|
-
|
|
45
|
-
Пример: `examples/kinship/build-rsform.ts`.
|
|
46
|
-
|
|
47
33
|
## Валидация
|
|
48
34
|
|
|
49
35
|
1. Префикс `alias` соответствует `cstType`.
|
package/docs/DIAGNOSTICS.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Диагностика
|
|
2
2
|
|
|
3
3
|
Читай, когда `analyzeExpression`, `applySchemaPatch`, `listDiagnostics` или `evaluate`
|
|
4
|
-
вернули диагностику.
|
|
4
|
+
вернули диагностику. Коды ошибок определяются анализатором `@rsconcept/domain`; полный перечень — в таблице ниже.
|
|
5
5
|
|
|
6
6
|
## Где лежит диагностика
|
|
7
7
|
|
|
@@ -63,10 +63,9 @@
|
|
|
63
63
|
|
|
64
64
|
## Предупреждения
|
|
65
65
|
|
|
66
|
-
| Код | Имя
|
|
67
|
-
| :------- |
|
|
68
|
-
| `
|
|
69
|
-
| `0x2802` | `localNotUsed` | `[name]` | Переменная `name` не используется. |
|
|
66
|
+
| Код | Имя | `params` | Исправление |
|
|
67
|
+
| :------- | :------------- | :------- | :--------------------------------- |
|
|
68
|
+
| `0x2802` | `localNotUsed` | `[name]` | Переменная `name` не используется. |
|
|
70
69
|
|
|
71
70
|
## Локальные переменные и область видимости
|
|
72
71
|
|
|
@@ -74,6 +73,7 @@
|
|
|
74
73
|
| :------- | :--------------------------- | :--------------- | :-------------------------------------------------------------------------------------------- |
|
|
75
74
|
| `0x8801` | `localUndeclared` | `[name]` | Свяжи `name` квантором или объяви параметром. |
|
|
76
75
|
| `0x8802` | `localShadowing` | `[name]` | Переименуй внутреннюю переменную `name`. |
|
|
76
|
+
| `0x8803` | `localDoubleDeclare` | `[name]` | Идентификатор `name` уже объявлен в выражении — переименуй одну из переменных. |
|
|
77
77
|
| `0x8815` | `localOutOfScope` | `[name]` | Перенеси использование `name` внутрь её области видимости. |
|
|
78
78
|
| `0x882E` | `localOutOfScopeParentheses` | `[name]` | Переменная `name` вне области квантора: возьми тело квантора в скобки (напр. `∀a∈S (… & …)`). |
|
|
79
79
|
| `0x882F` | `localUndeclaredInSubexpr` | `[name, domain]` | В подвыражении нет квантора для `name`; ожидается `∀(∃) name∈domain`. |
|
|
@@ -82,7 +82,7 @@
|
|
|
82
82
|
|
|
83
83
|
| Код | Имя | `params` | Исправление |
|
|
84
84
|
| :------- | :--------------------------------- | :--------------------------------- | :--------------------------------------------------------------------------------------------------------------------------- |
|
|
85
|
-
| `
|
|
85
|
+
| `0x880A` | `typesNotEqual` | `[a, b, operator]` | Операнды `operator` должны иметь равный тип (`a` ≠ `b`). |
|
|
86
86
|
| `0x8825` | `typesNotCompatible` | `[a, b, operator]` | Типы `a` и `b` несовместимы для `operator`. |
|
|
87
87
|
| `0x8804` | `globalNotTyped` | `[name]` | Поставщик `name` не типизирован: добавь и проанализируй его раньше. |
|
|
88
88
|
| `0x8805` | `invalidDecart` | `[arg]` | Аргумент `arg` оператора `×` неподходящей ступени. |
|
package/docs/DOMAIN.md
CHANGED
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
- **Производное понятие** — конституента с формальным определением на RSLang: `D#`, `F#`, `P#` и связанные выводимые конструкции. Значение получают из определения при заданной интерпретации базовых понятий.
|
|
19
19
|
- **Ядро КС** — базовые понятия, аксиомы и производные понятия, необходимые для их формулировки.
|
|
20
20
|
- **Тело КС** — остальные конституенты схемы, не входящие в ядро.
|
|
21
|
+
- **Конвенция** — текстовое соглашение о том, как неопределяемое понятие соотносится с сущностями предметной области. В данных схемы хранится в поле `convention` конституенты. Конвенция не заменяет формальное определение и не проходит формальную проверку RSLang. Она фиксирует предметный смысл, который нельзя вывести из формулы: что именно считается элементом множества, как читать компоненты кортежа, какой порядок в паре отношения, какие константы или операции подразумеваются. В конвенции используется предметный язык и термины, которые могут быть не выражены в концептуальной схеме.
|
|
21
22
|
- **Интерпретация** — соотнесение понятий КС с сущностями предметной области. В концептуальной модели задаётся значениями неопределяемых конституент и вычислением производных.
|
|
22
23
|
|
|
23
24
|
## Конституенты
|
package/docs/MODEL-TESTING.md
CHANGED
|
@@ -4,14 +4,13 @@
|
|
|
4
4
|
|
|
5
5
|
## Когда использовать
|
|
6
6
|
|
|
7
|
-
- Неочевидны `S#` против `D#`, проекции `Pr*` / `pr*`, фильтры `Fi*`, `red`, `bool`, `debool`.
|
|
8
7
|
- Формула синтаксически корректна, но есть сомнение в семантике результата.
|
|
9
8
|
- Нужно проверить, что аксиома действительно ловит ошибочные данные.
|
|
10
9
|
- Пользователь просит надежно изменить важное определение, а пример данных можно сделать маленьким.
|
|
11
10
|
|
|
12
11
|
Для простой проверки типизации сначала используй `analyzeExpression`. КМ нужна, когда вопрос зависит от интерпретации данных и вычисленного значения.
|
|
13
12
|
|
|
14
|
-
##
|
|
13
|
+
## Правила интерпретации
|
|
15
14
|
|
|
16
15
|
`basic`, `constant`, `structure` можно интерпретировать напрямую. `term`, `function`, `predicate`, `axiom`, `statement` должны вычисляться из формулы, поэтому их напрямую не задавай.
|
|
17
16
|
|
package/docs/PORTAL-API.md
CHANGED
|
@@ -4,23 +4,6 @@
|
|
|
4
4
|
`rstool` сам не ходит в REST API: он работает с in-memory сессиями.
|
|
5
5
|
Агент получает JSON Portal отдельно, затем переносит конституенты через контракт `rstool`.
|
|
6
6
|
|
|
7
|
-
## Репозиторий Portal
|
|
8
|
-
|
|
9
|
-
Исходники приложения: [github.com/IRBorisov/ConceptPortal](https://github.com/IRBorisov/ConceptPortal)
|
|
10
|
-
|
|
11
|
-
Для работы с продакшен API клон не обязателен — достаточно этого файла и OpenAPI (`/schema`).
|
|
12
|
-
Если нужен исходный контекст, подгружай файлы из репозитория (Read в checkout, `git clone`, или просмотр на GitHub):
|
|
13
|
-
|
|
14
|
-
| Нужно | Путь в репозитории |
|
|
15
|
-
| ---------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
|
|
16
|
-
| Правила монорепо, UI→API | [`AGENTS.md`](https://github.com/IRBorisov/ConceptPortal/blob/main/AGENTS.md) |
|
|
17
|
-
| Обзор, локальная разработка | [`README.md`](https://github.com/IRBorisov/ConceptPortal/blob/main/README.md) |
|
|
18
|
-
| Библиотека, context-search, by-ids | [`rsconcept/backend/apps/library/`](https://github.com/IRBorisov/ConceptPortal/tree/main/rsconcept/backend/apps/library) |
|
|
19
|
-
| Правила и команды бэкенда | [`rsconcept/backend/AGENTS.md`](https://github.com/IRBorisov/ConceptPortal/blob/main/rsconcept/backend/AGENTS.md) |
|
|
20
|
-
| RSForm / КС API | [`rsconcept/backend/apps/rsform/`](https://github.com/IRBorisov/ConceptPortal/tree/main/rsconcept/backend/apps/rsform) |
|
|
21
|
-
| Хосты UI и API в проде | [`nginx/production.conf`](https://github.com/IRBorisov/ConceptPortal/blob/main/nginx/production.conf) |
|
|
22
|
-
| Справка rstool (этот файл в npm) | [`rsconcept/rstool/docs/PORTAL-API.md`](https://github.com/IRBorisov/ConceptPortal/blob/main/rsconcept/rstool/docs/PORTAL-API.md) |
|
|
23
|
-
|
|
24
7
|
## Хосты
|
|
25
8
|
|
|
26
9
|
- UI: `https://portal.acconcept.ru/`
|
|
@@ -66,7 +49,7 @@ GET https://api.portal.acconcept.ru/api/rsforms/856/details
|
|
|
66
49
|
|
|
67
50
|
1. Пользователь временно делает схему публичной (`access_policy: public`).
|
|
68
51
|
2. Пользователь экспортирует JSON (`GET /api/rsforms/:id/details` из своей сессии в UI
|
|
69
|
-
или экспорт из Portal) и передаёт
|
|
52
|
+
или экспорт из Portal) и передаёт JSON в чат или файл — агент переносит в `rstool`.
|
|
70
53
|
3. Работа с личной библиотекой остаётся в UI Portal; агент помогает с публичными схемами
|
|
71
54
|
и с JSON, который пользователь явно предоставил.
|
|
72
55
|
|
package/docs/README.md
CHANGED
|
@@ -9,11 +9,10 @@
|
|
|
9
9
|
- **DOMAIN.md** — термины Portal: конституента, базовые и производные понятия, ядро/тело КС, интерпретация, ОСС, синтез.
|
|
10
10
|
- **CONCEPTUAL-SCHEMA.md** — проектирование и ревью концептуальных схем.
|
|
11
11
|
- **CONSTITUENTA.md** — структура и правила конституент.
|
|
12
|
-
- **SYNTAX.md** — операторы,
|
|
12
|
+
- **SYNTAX.md** — синтаксис RSLang: операторы, генераторы `D{}`/`I{}`/`R{}`, кванторы, `F#`/`P#`.
|
|
13
13
|
- **TYPIFICATION.md** — типизация (`AnalysisResult.type`, `valueClass`).
|
|
14
14
|
- **MODEL-TESTING.md** — проверка семантики определений на маленьких концептуальных моделях.
|
|
15
15
|
- **DIAGNOSTICS.md** — диагностики анализа и способы исправления ошибок.
|
|
16
16
|
- **PORTAL-API.md** — объекты REST API Portal.
|
|
17
|
-
- **GRAMMAR-REF.md** — краткая карта токенов и приоритетов.
|
|
18
17
|
|
|
19
18
|
Контракт агента `rstool` и примеры — `../skills/rstool-helper/REFERENCE.md`, `EXAMPLES.md` (на русском, вместе с `GUIDE.md`).
|
package/docs/SYNTAX.md
CHANGED
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
# Синтаксис RSLang
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Единая справка для агента: читай при построении или исправлении `definitionFormal`. Типизация — `TYPIFICATION.md`; ошибки — `DIAGNOSTICS.md`.
|
|
4
4
|
|
|
5
5
|
## Имена и литералы
|
|
6
6
|
|
|
7
|
-
- Глобальные алиасы: `X1`, `C2`, `S3`, `D11`, `F7`, `P4`, `A6`, `T9`; буква совпадает с
|
|
8
|
-
- Радикалы: `R1`, `R2` — шаблонные ступени в параметрах.
|
|
7
|
+
- Глобальные алиасы: `X1`, `C2`, `S3`, `D11`, `F7`, `P4`, `A6`, `T9`; буква совпадает с ролью конституенты.
|
|
8
|
+
- Радикалы: `R1`, `R2` — шаблонные ступени в параметрах. Не путать с префиксом рекурсии `R{…}`.
|
|
9
9
|
- Локальные переменные: `x`, `ξ`, `μ2`, `y1`.
|
|
10
10
|
- Целые: `0`, `42`; отрицательного литерала нет, пиши `0 - 5`.
|
|
11
11
|
- `Z` — множество целых, `∅` — пустое множество с типизацией `ℬ(R0)`.
|
|
12
|
+
- Скобки и разделители: `()`, `[]`, `{}`, `,`, `;`, `|`.
|
|
13
|
+
- Комментариев в формальных выражениях нет.
|
|
12
14
|
|
|
13
15
|
## Теоретико-множественные выражения (STE)
|
|
14
16
|
|
|
@@ -25,6 +27,79 @@
|
|
|
25
27
|
|
|
26
28
|
Мультииндексы разрешены: `pr1,3(...)`, `Pr2,4(S1)`, `Fi1,2[D1](S1)`.
|
|
27
29
|
|
|
30
|
+
## Генераторы: `D{}`, `I{}`, `R{}`
|
|
31
|
+
|
|
32
|
+
Три конструкции строят STE. Буквы `D`, `I`, `R` перед `{` — **часть синтаксиса**, не алиасы конституент.
|
|
33
|
+
|
|
34
|
+
| Конструкция | Результат | Когда использовать |
|
|
35
|
+
| :---------- | :------------------------ | :---------------------------------------------------------------------------- |
|
|
36
|
+
| `D{…}` | множество `ℬ(H)` | отбор по условию из уже заданного множества (родо-видовое определение) |
|
|
37
|
+
| `I{…}` | множество `ℬ(H)` | то же множество, но через последовательность переборов, присвоений и проверок |
|
|
38
|
+
| `R{…}` | одно значение ступени `H` | итеративный пересчёт до выхода или стабилизации |
|
|
39
|
+
|
|
40
|
+
### Декларативная `D{переменная ∈ домен | условие}`
|
|
41
|
+
|
|
42
|
+
Схема ограниченного выделения: перебирает `домен`, включает в результат каждый элемент (или кортеж), для которого `условие` истинно.
|
|
43
|
+
|
|
44
|
+
```text
|
|
45
|
+
D{ξ∈D1 | LE(ξ)}
|
|
46
|
+
D{(ξ1, ξ2)∈S1 | LE(ξ1, ξ2)}
|
|
47
|
+
{ξ∈D1 | LE(ξ)} — краткая форма без префикса D, только одна переменная
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
- Слева от `|` — объявление переменной и домен (`∈`, не `:∈`).
|
|
51
|
+
- Справа — логическое выражение (`LE`).
|
|
52
|
+
- Типизация результата: `ℬ(H)`, где `H` — ступень элементов домена.
|
|
53
|
+
- Кортеж в объявлении требует префикса `D`: `D{(a, b)∈X1 | …}`.
|
|
54
|
+
- Пример: `D{ξ∈{1, 2, 3, 4, 5, 6} | ∃σ∈{10, 11, 12} σ = 2 * ξ}` → `{5, 6}`.
|
|
55
|
+
|
|
56
|
+
### Императивная `I{элемент | блоки через ;}`
|
|
57
|
+
|
|
58
|
+
Строит множество перебором и присвоениями. Эквивалентна декларативной, но удобна, когда значения зависят от предыдущих шагов.
|
|
59
|
+
|
|
60
|
+
```text
|
|
61
|
+
I{(ξ1, ξ2) | ξ1:∈D1; ξ2:=F1[ξ1]; LE(ξ1, ξ2)}
|
|
62
|
+
I{β | δ1:=Fi1,2[α, α](σ); δ2:=δ1\Pr1,1(δ1); β:=Pr1(δ2)\Pr2(δ2)}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Слева от `|` — STE, задающее элемент результата (часто кортеж локальных переменных).
|
|
66
|
+
|
|
67
|
+
Справа — блоки через `;`. Три вида блока:
|
|
68
|
+
|
|
69
|
+
| Блок | Синтаксис | Смысл |
|
|
70
|
+
| :--------- | :-------- | :--------------------------------------------------------------- |
|
|
71
|
+
| Перебор | `ξ:∈STE` | `ξ` (или кортеж) перебирает элементы множества |
|
|
72
|
+
| Присвоение | `ξ:=STE` | `ξ` получает вычисленное значение |
|
|
73
|
+
| Проверка | `LE` | при ложности дальнейшие блоки пропускаются, перебор продолжается |
|
|
74
|
+
|
|
75
|
+
- Префикс `I` обязателен; в переборе — `:∈`, не `∈`.
|
|
76
|
+
- Типизация результата: `ℬ(H)`, где `H` — ступень выражения слева от `|`.
|
|
77
|
+
- Пример: `I{(ξ1, ξ2) | ξ1:∈{1, 2, 3}; ξ2:=ξ1+1; ∃σ∈{4, 5, 6} σ=2*ξ2}` → `{(1, 2), (2, 3)}`.
|
|
78
|
+
|
|
79
|
+
### Рекурсивная `R{переменная := база | условие продолжения | формула следующего шага}`
|
|
80
|
+
|
|
81
|
+
Итеративно пересчитывает переменную рекурсии; возвращает **одно значение**, не множество.
|
|
82
|
+
|
|
83
|
+
```text
|
|
84
|
+
R{ξ := STE1 | STE2(ξ)} — короткая форма
|
|
85
|
+
R{ξ := STE1 | LE(ξ) | STE2(ξ)} — полная форма с условием продолжения
|
|
86
|
+
R{(ξ, σ) := (STE1, STE2) | LE(ξ, σ) | (STE3, STE4)}
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
| Часть | Позиция | Смысл |
|
|
90
|
+
| :------------------ | :------------------ | :---------------------------------------------------------------- |
|
|
91
|
+
| База | `переменная := STE` | начальное значение |
|
|
92
|
+
| Условие продолжения | `LE` (опционально) | пересчитывается на каждом шаге; при ложности цикл останавливается |
|
|
93
|
+
| Пересчёт | последний `STE` | новое значение переменной на следующем шаге |
|
|
94
|
+
|
|
95
|
+
Порядок шага: присвоить текущее значение → (если есть) проверить условие → вычислить пересчёт.
|
|
96
|
+
|
|
97
|
+
Завершение: условие продолжения ложно, либо значение на шаге `k` равно значению на шаге `k+1` (в том числе в короткой форме без `LE`).
|
|
98
|
+
|
|
99
|
+
- Префикс `R` обязателен; в присвоении — `:=`.
|
|
100
|
+
- Типизация результата совпадает со ступенью переменной рекурсии; пересчёт должен иметь ту же ступень.
|
|
101
|
+
- Пример: `R{(ξ, σ) := (1, 0) | σ<5 | (2*ξ, σ+1)}` → `32`.
|
|
102
|
+
|
|
28
103
|
## Логические выражения (LE)
|
|
29
104
|
|
|
30
105
|
- Предикаты множеств: `ξ ∈ S`, `ξ ∉ S`, `S1 = S2`, `S1 ≠ S2`, `S1 ⊆ S2`, `S1 ⊂ S2`, `S1 ⊄ S2`.
|
|
@@ -56,7 +131,7 @@ P1 ::= [α1∈STE1, α2∈STE2(α1)] LE(α1, α2)
|
|
|
56
131
|
- В `[]` идут параметры через `∈`.
|
|
57
132
|
- Параметр доступен в следующих доменах и теле.
|
|
58
133
|
- Вызов позиционный: `F1[ξ1, S1]`, `P1[ξ1\ξ2, ξ3]`.
|
|
59
|
-
- `F#` возвращает
|
|
134
|
+
- `F#` возвращает STE, `P#` — LE.
|
|
60
135
|
|
|
61
136
|
## Радикалы
|
|
62
137
|
|
|
@@ -76,9 +151,36 @@ F2 ::= [α1∈R1×R2, α2∈R1] α2 = pr1(α1)
|
|
|
76
151
|
- `(4 + 5) * 3`, `card(X1) > 5`
|
|
77
152
|
- `pr2((5, 4, 3, 2, 1)) = 4`
|
|
78
153
|
- `red({{1, 2, 3}, {3, 4}}) = {1, 2, 3, 4}`
|
|
154
|
+
- `D{ξ∈σ | card(ξ) > 2}`
|
|
155
|
+
- `I{(ξ1, ξ2) | ξ1:∈Pr1(σ); ξ2:∈Pr2(Fi1[{ξ1}](σ))}`
|
|
156
|
+
- `R{ξ:=Pr2(Fi1[α](σ)) | ξ ∪ Pr2(Fi1[ξ](σ))}`
|
|
79
157
|
|
|
80
158
|
## Корректность
|
|
81
159
|
|
|
82
160
|
- Анализ идет в глобальном контексте: все алиасы должны быть известны и типизированы.
|
|
83
161
|
- Формальные определения должны быть биективно переносимыми (гарантируется семантическим анализатором).
|
|
84
162
|
- Логическая непротиворечивость проверяется примером интерпретации в модели.
|
|
163
|
+
|
|
164
|
+
## Приоритеты операторов
|
|
165
|
+
|
|
166
|
+
От высшего к низшему:
|
|
167
|
+
|
|
168
|
+
1. Вызовы функций, проекции, `ℬ`, `bool`, `debool`, `red`, `card`.
|
|
169
|
+
2. `×`.
|
|
170
|
+
3. `*`.
|
|
171
|
+
4. `+`, `-`.
|
|
172
|
+
5. `∪`, `∩`, `\`, `∆`.
|
|
173
|
+
6. Предикаты: `∈`, `=`, `<`, …
|
|
174
|
+
7. `¬`.
|
|
175
|
+
8. `&`.
|
|
176
|
+
9. `∨`.
|
|
177
|
+
10. `⇒`.
|
|
178
|
+
11. `⇔`.
|
|
179
|
+
|
|
180
|
+
## Исходники парсера
|
|
181
|
+
|
|
182
|
+
Читай, если позиция ошибки неожиданная или нужны Lezer terms / token IDs:
|
|
183
|
+
|
|
184
|
+
- `@rsconcept/domain/src/rslang/parser/rslang.grammar`
|
|
185
|
+
- `@rsconcept/domain/src/rslang/parser/token.ts`
|
|
186
|
+
- `@rsconcept/domain/src/rslang/parser/parser.terms.ts`
|
package/examples/README.md
CHANGED
|
@@ -4,21 +4,13 @@
|
|
|
4
4
|
|
|
5
5
|
## Как запускать
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
```bash
|
|
10
|
-
npm install
|
|
11
|
-
npm run build # обёртка для скриптов
|
|
12
|
-
npm run example:client # минимальный цикл API; схемы — см. таблицу ниже
|
|
13
|
-
```
|
|
14
|
-
|
|
15
|
-
**После `npm install @rsconcept/rstool`** (нужен `tsx` или аналог):
|
|
7
|
+
После `npm install @rsconcept/rstool` (нужен `tsx` или аналог):
|
|
16
8
|
|
|
17
9
|
```bash
|
|
18
10
|
npx tsx node_modules/@rsconcept/rstool/examples/agent-client.ts
|
|
19
11
|
```
|
|
20
12
|
|
|
21
|
-
Скрипты пишут JSON в `examples/<topic
|
|
13
|
+
Скрипты пишут JSON в `examples/<topic>/` рядом с собой. Запускайте из каталога, где установлен пакет.
|
|
22
14
|
|
|
23
15
|
## Макет папки темы
|
|
24
16
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rsconcept/rstool",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "Agent-facing library for incremental RSForm construction, RSLang analysis, diagnostics, modeling, and evaluation. Wraps @rsconcept/domain with a deterministic session contract.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "IRBorisov",
|
|
@@ -50,6 +50,21 @@
|
|
|
50
50
|
"README.md",
|
|
51
51
|
"LICENSE"
|
|
52
52
|
],
|
|
53
|
+
"dependencies": {
|
|
54
|
+
"@rsconcept/domain": "1.7.7"
|
|
55
|
+
},
|
|
56
|
+
"devDependencies": {
|
|
57
|
+
"@types/node": "^26.1.0",
|
|
58
|
+
"@vitest/coverage-v8": "^4.1.9",
|
|
59
|
+
"tsdown": "^0.22.3",
|
|
60
|
+
"tsx": "^4.22.5",
|
|
61
|
+
"typescript": "^6.0.3",
|
|
62
|
+
"unrun": "^0.3.1",
|
|
63
|
+
"vitest": "^4.1.9"
|
|
64
|
+
},
|
|
65
|
+
"publishConfig": {
|
|
66
|
+
"access": "public"
|
|
67
|
+
},
|
|
53
68
|
"scripts": {
|
|
54
69
|
"build": "tsdown",
|
|
55
70
|
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
@@ -67,21 +82,6 @@
|
|
|
67
82
|
"example:build-movd-rsmodel": "tsx examples/movd/build-rsmodel.ts",
|
|
68
83
|
"example:build-expression-bank-schema": "tsx examples/expression-bank/build-rsform.ts",
|
|
69
84
|
"example:build-template-apply-schema": "tsx examples/template-apply/build-rsform.ts",
|
|
70
|
-
"kinship:cli": "tsx examples/kinship/cli.ts"
|
|
71
|
-
"prepublishOnly": "npm run build"
|
|
72
|
-
},
|
|
73
|
-
"dependencies": {
|
|
74
|
-
"@rsconcept/domain": "^1.7.4"
|
|
75
|
-
},
|
|
76
|
-
"devDependencies": {
|
|
77
|
-
"@types/node": "^26.1.0",
|
|
78
|
-
"@vitest/coverage-v8": "^4.1.9",
|
|
79
|
-
"tsdown": "^0.22.3",
|
|
80
|
-
"tsx": "^4.22.5",
|
|
81
|
-
"typescript": "^6.0.3",
|
|
82
|
-
"vitest": "^4.1.9"
|
|
83
|
-
},
|
|
84
|
-
"publishConfig": {
|
|
85
|
-
"access": "public"
|
|
85
|
+
"kinship:cli": "tsx examples/kinship/cli.ts"
|
|
86
86
|
}
|
|
87
|
-
}
|
|
87
|
+
}
|
|
@@ -71,9 +71,7 @@ const session = tool.importData(portalDetailsJsonString);
|
|
|
71
71
|
```ts
|
|
72
72
|
import { RSToolWrapperClient } from '@rsconcept/rstool/wrapper';
|
|
73
73
|
|
|
74
|
-
|
|
75
|
-
// Для установленного пакета: new RSToolWrapperClient({ command: 'npx', args: ['rstool-wrapper'] }).
|
|
76
|
-
const client = new RSToolWrapperClient();
|
|
74
|
+
const client = new RSToolWrapperClient({ command: 'npx', args: ['rstool-wrapper'] });
|
|
77
75
|
await client.waitUntilReady();
|
|
78
76
|
|
|
79
77
|
await client.call('applySchemaPatch', {
|
|
@@ -29,13 +29,12 @@
|
|
|
29
29
|
- Термины предметной области: [../../docs/DOMAIN.md](../../docs/DOMAIN.md).
|
|
30
30
|
- Концептуализация, создание схемы: [../../docs/CONCEPTUAL-SCHEMA.md](../../docs/CONCEPTUAL-SCHEMA.md).
|
|
31
31
|
- Конституенты и валидация: [../../docs/CONSTITUENTA.md](../../docs/CONSTITUENTA.md).
|
|
32
|
-
-
|
|
32
|
+
- Синтаксис родов структур: [../../docs/SYNTAX.md](../../docs/SYNTAX.md).
|
|
33
33
|
- Типизация: [../../docs/TYPIFICATION.md](../../docs/TYPIFICATION.md).
|
|
34
34
|
- Проверка определений на КМ: [../../docs/MODEL-TESTING.md](../../docs/MODEL-TESTING.md).
|
|
35
35
|
- Диагностики: [../../docs/DIAGNOSTICS.md](../../docs/DIAGNOSTICS.md).
|
|
36
|
-
- Грамматика: [../../docs/GRAMMAR-REF.md](../../docs/GRAMMAR-REF.md).
|
|
37
36
|
- REST Portal: [../../docs/PORTAL-API.md](../../docs/PORTAL-API.md).
|
|
38
|
-
- Репозиторий Portal (исходники, API, nginx): [ConceptPortal на GitHub](https://github.com/IRBorisov/ConceptPortal)
|
|
37
|
+
- Репозиторий Portal (исходники, API, nginx): [ConceptPortal на GitHub](https://github.com/IRBorisov/ConceptPortal).
|
|
39
38
|
|
|
40
39
|
## Воркфлоу
|
|
41
40
|
|
|
@@ -73,15 +72,15 @@ auto определит `portal-details` или `portal-schema`. Явный kind
|
|
|
73
72
|
Когда нужно построить или существенно развить КС по тексту ПО, требованиям или предметному описанию. Правила редукции, слоёв и паттернов — [CONCEPTUAL-SCHEMA.md](../../docs/CONCEPTUAL-SCHEMA.md).
|
|
74
73
|
|
|
75
74
|
1. Собери словарь: базовые понятия, ключевые отношения, сценарий синтеза.
|
|
76
|
-
2. Добавь `X#`, `C#` с конвенциями из источника (не копируй дословно).
|
|
77
|
-
3.
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
75
|
+
2. Добавь неопределяемые понятия `X#`, `C#`, `S#` с конвенциями из источника (не копируй дословно).
|
|
76
|
+
3. Проверь независимость базовых понятий — они не выводятся друг из друга.
|
|
77
|
+
Если отношение или множество выражается через уже введенные `X#`, `C#`, `S#`, оформляй его как `D#` / `F#` / `P#`.
|
|
78
|
+
4. Введи `F#` и `D#` для раскрытия проекций и функциональных связей в базовых понятиях.
|
|
79
|
+
5. Добавь `A#` на структуры, выражающие ограничения предметной области. Возможно стоит ввести промежуточные производные термы и терм-функции.
|
|
80
|
+
6. Подбери промежуточные производные понятия `D#`, `F#`, `P#` так, чтобы выразить целевые понятия без использования не введенных в схеме понятий.
|
|
81
|
+
7. Перед каждым patch — `analyzeExpression`; при ошибках — [цикл диагностик](#цикл-диагностик).
|
|
82
|
+
8. Сомнительную семантику проверь на маленькой КМ ([цикл КМ](#проверка-на-маленькой-км), [MODEL-TESTING.md](../../docs/MODEL-TESTING.md)).
|
|
83
|
+
9. Перед показом результата пройди [чеклист ревью КС](#ревью-концептуальной-схемы).
|
|
85
84
|
|
|
86
85
|
Дальше — обычное [редактирование и проверка](#редактирование-и-проверка-схемы): commit, export.
|
|
87
86
|
|
|
@@ -111,10 +110,10 @@ auto определит `portal-details` или `portal-schema`. Явный kind
|
|
|
111
110
|
|
|
112
111
|
### Порядок объявления конституент
|
|
113
112
|
|
|
114
|
-
1. `basic`, `constant`.
|
|
115
|
-
2.
|
|
116
|
-
3.
|
|
117
|
-
4.
|
|
113
|
+
1. В начале схемы — `basic`, `constant`.
|
|
114
|
+
2. Родовые структуры производные и ключевые понятия, аксиомы и утверждения в произвольном порядке.
|
|
115
|
+
3. Конституенты в топологическом порядке.
|
|
116
|
+
4. Предпочитай размещать связанные с родовыми структурами конституенты вместе с этой структурой.
|
|
118
117
|
|
|
119
118
|
Правила валидации по типам — [CONSTITUENTA.md](../../docs/CONSTITUENTA.md).
|
|
120
119
|
|
|
@@ -134,7 +133,7 @@ auto определит `portal-details` или `portal-schema`. Явный kind
|
|
|
134
133
|
### Сессия и rstool
|
|
135
134
|
|
|
136
135
|
- [ ] Используется текущая сессия (`getSessionState`) или явный `sessionId`, если сессий несколько.
|
|
137
|
-
- [ ] Для стандартных alias `X/C/S/D/A/F/P` можно
|
|
136
|
+
- [ ] Для стандартных alias `X/C/S/D/A/F/P` можно не указывать `cstType` в `applySchemaPatch`.
|
|
138
137
|
- [ ] Для пачки конституент предпочитай один `applySchemaPatch` с массивом `items`.
|
|
139
138
|
|
|
140
139
|
### Перед показом, commit и export
|
|
@@ -148,7 +147,7 @@ auto определит `portal-details` или `portal-schema`. Явный kind
|
|
|
148
147
|
|
|
149
148
|
- [ ] Атрибутивная и родоструктурная экспликации не смешаны без явного запроса.
|
|
150
149
|
- [ ] Нет избыточной проверки принадлежности к собственной типизации (`x∈X1`, если `x` уже в `X1`).
|
|
151
|
-
- [ ] Базовые понятия
|
|
150
|
+
- [ ] Базовые понятия и `S#` независимы; вычислимые отношения вынесены в `D#` / `F#` / `P#`, а не объявлены новыми структурами.
|
|
152
151
|
- [ ] Покрыты главные сущности, роли, отношения, утверждения.
|
|
153
152
|
- [ ] В текстовых определениях используются только понятия из схемы.
|
|
154
153
|
- [ ] Повторяющиеся части формальных определений вынесены в производные понятия `D#` и `F#`.
|
|
@@ -28,9 +28,9 @@ Always open **GUIDE.md** first when starting a rstool task, then **REFERENCE.md*
|
|
|
28
28
|
|
|
29
29
|
## Portal (приложение)
|
|
30
30
|
|
|
31
|
-
|
|
31
|
+
REST API и curl — `node_modules/@rsconcept/rstool/docs/PORTAL-API.md`.
|
|
32
32
|
|
|
33
33
|
## Quick facts
|
|
34
34
|
|
|
35
35
|
- Package: `@rsconcept/rstool`; wrapper: `npx rstool-wrapper`
|
|
36
|
-
- `@rsconcept/domain` is installed as a dependency (analyzer
|
|
36
|
+
- `@rsconcept/domain` is installed as a dependency (analyzer and error codes)
|
package/docs/GRAMMAR-REF.md
DELETED
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
# Грамматика: короткая карта
|
|
2
|
-
|
|
3
|
-
Этого обычно достаточно агенту. Полная грамматика живет в `@rsconcept/domain`.
|
|
4
|
-
|
|
5
|
-
## Токены
|
|
6
|
-
|
|
7
|
-
- Литералы: `0`, `42`, `Z`, `∅`.
|
|
8
|
-
- Алиасы: `X#`, `C#`, `S#`, `D#`, `F#`, `P#`, `A#`, `T#`, `R#`.
|
|
9
|
-
- Локальные переменные: `x`, `ξ`, `μ2`, `y1`.
|
|
10
|
-
- Скобки и разделители: `()`, `[]`, `{}`, `,`, `;`.
|
|
11
|
-
- Комментариев в формальных выражениях нет.
|
|
12
|
-
|
|
13
|
-
## Операторы
|
|
14
|
-
|
|
15
|
-
- Множества: `∪`, `∩`, `\`, `∆`, `×`, `ℬ`.
|
|
16
|
-
- Структуры: `red`, `bool`, `debool`, `pr1`, `Pr1`, `Fi1[D](S)`, `card`.
|
|
17
|
-
- Предикаты: `∈`, `∉`, `⊆`, `⊂`, `⊄`, `=`, `≠`, `<`, `≤`, `>`, `≥`.
|
|
18
|
-
- Связки: `¬`, `&`, `∨`, `⇒`, `⇔`.
|
|
19
|
-
- Кванторы: `∀`, `∃`.
|
|
20
|
-
|
|
21
|
-
Мультииндексы парсятся как список натуральных чисел: `pr1,3`, `Pr2,4`, `Fi1,2[D](S)`.
|
|
22
|
-
|
|
23
|
-
## Декларации
|
|
24
|
-
|
|
25
|
-
- Терм-функция: `F# ::= [<params>] <body STE>`.
|
|
26
|
-
- Предикат-функция: `P# ::= [<params>] <body LE>`.
|
|
27
|
-
- Параметр: `α ∈ <STE>`.
|
|
28
|
-
- Вызов: `F#[<arg1>, <arg2>]`.
|
|
29
|
-
|
|
30
|
-
## Приоритеты
|
|
31
|
-
|
|
32
|
-
1. Вызовы функций, проекции, `ℬ`, `bool`, `debool`, `red`, `card`.
|
|
33
|
-
2. `×`.
|
|
34
|
-
3. `*`.
|
|
35
|
-
4. `+`, `-`.
|
|
36
|
-
5. `∪`, `∩`, `\`, `∆`.
|
|
37
|
-
6. Предикаты: `∈`, `=`, `<`, ...
|
|
38
|
-
7. `¬`.
|
|
39
|
-
8. `&`.
|
|
40
|
-
9. `∨`.
|
|
41
|
-
10. `⇒`.
|
|
42
|
-
11. `⇔`.
|
|
43
|
-
|
|
44
|
-
## Когда читать исходники
|
|
45
|
-
|
|
46
|
-
- Позиция ошибки неожиданная.
|
|
47
|
-
- Нужны Lezer terms/token IDs: `@rsconcept/domain/src/rslang/parser/token.ts`, `parser.terms.ts`.
|