@rsconcept/rstool 0.2.0 → 0.3.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/docs/CONCEPTUAL-SCHEMA.md +78 -0
- package/docs/CONSTITUENTA.md +37 -55
- package/docs/DIAGNOSTICS.md +85 -130
- package/docs/DOMAIN.md +68 -91
- package/docs/GRAMMAR-REF.md +35 -86
- package/docs/MODEL-TESTING.md +57 -0
- package/docs/PORTAL-API.md +22 -36
- package/docs/README.md +14 -12
- package/docs/SYNTAX.md +49 -104
- package/docs/TYPIFICATION.md +41 -60
- package/package.json +1 -1
- package/skills/README.md +6 -8
- package/skills/rstool-helper/EXAMPLES.md +83 -106
- package/skills/rstool-helper/GUIDE.md +68 -108
- package/skills/rstool-helper/REFERENCE.md +1 -0
- package/skills/rstool-helper/SKILL.md +5 -8
package/docs/GRAMMAR-REF.md
CHANGED
|
@@ -1,98 +1,47 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Грамматика: короткая карта
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Этого обычно достаточно агенту. Полная грамматика живет в `@rsconcept/domain`.
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## Токены
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
| Integer set | `Z` |
|
|
13
|
-
| Globals | `X#`, `C#`, `S#`, `D#`, `F#`, `P#`, `A#`, `T#`, `N#`, `R#` |
|
|
14
|
-
| Locals | `x`, `ξ`, `μ2`, `y1` |
|
|
15
|
-
| Punctuation | `(`, `)`, `[`, `]`, `{`, `}`, `,`, `;` |
|
|
16
|
-
| Comment | none — RSLang has no comments inside formal expressions |
|
|
7
|
+
- Литералы: `0`, `42`, `Z`, `∅`.
|
|
8
|
+
- Алиасы: `X#`, `C#`, `S#`, `D#`, `F#`, `P#`, `A#`, `T#`, `R#`.
|
|
9
|
+
- Локальные переменные: `x`, `ξ`, `μ2`, `y1`.
|
|
10
|
+
- Скобки и разделители: `()`, `[]`, `{}`, `,`, `;`.
|
|
11
|
+
- Комментариев в формальных выражениях нет.
|
|
17
12
|
|
|
18
|
-
##
|
|
13
|
+
## Операторы
|
|
19
14
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
| Symmetric difference | `∆` |
|
|
26
|
-
| Cartesian product | `×` |
|
|
27
|
-
| Boolean | `ℬ` |
|
|
28
|
-
| Sum set | `red` |
|
|
29
|
-
| Singleton | `bool` |
|
|
30
|
-
| Desingleton | `debool` |
|
|
31
|
-
| Small projection | `pr1`, `pr1,3`, … |
|
|
32
|
-
| Large projection | `Pr1`, `Pr2,4`, … |
|
|
33
|
-
| Filter | `Fi1[D](S)`, `Fi1,2[D](S)` |
|
|
34
|
-
| Cardinality | `card` |
|
|
15
|
+
- Множества: `∪`, `∩`, `\`, `∆`, `×`, `ℬ`.
|
|
16
|
+
- Структуры: `red`, `bool`, `debool`, `pr1`, `Pr1`, `Fi1[D](S)`, `card`.
|
|
17
|
+
- Предикаты: `∈`, `∉`, `⊆`, `⊂`, `⊄`, `=`, `≠`, `<`, `≤`, `>`, `≥`.
|
|
18
|
+
- Связки: `¬`, `&`, `∨`, `⇒`, `⇔`.
|
|
19
|
+
- Кванторы: `∀`, `∃`.
|
|
35
20
|
|
|
36
|
-
|
|
21
|
+
Мультииндексы парсятся как список натуральных чисел: `pr1,3`, `Pr2,4`, `Fi1,2[D](S)`.
|
|
37
22
|
|
|
38
|
-
|
|
39
|
-
| ---------------- | ------ |
|
|
40
|
-
| Membership | `∈` |
|
|
41
|
-
| Non-membership | `∉` |
|
|
42
|
-
| Inclusion | `⊆` |
|
|
43
|
-
| Strict inclusion | `⊂` |
|
|
44
|
-
| Non-inclusion | `⊄` |
|
|
45
|
-
| Equality | `=` |
|
|
46
|
-
| Inequality | `≠` |
|
|
47
|
-
| Less | `<` |
|
|
48
|
-
| Less-or-equal | `≤` |
|
|
49
|
-
| Greater | `>` |
|
|
50
|
-
| Greater-or-equal | `≥` |
|
|
23
|
+
## Декларации
|
|
51
24
|
|
|
52
|
-
|
|
25
|
+
- Терм-функция: `F# ::= [<params>] <body STE>`.
|
|
26
|
+
- Предикат-функция: `P# ::= [<params>] <body LE>`.
|
|
27
|
+
- Параметр: `α ∈ <STE>`.
|
|
28
|
+
- Вызов: `F#[<arg1>, <arg2>]`.
|
|
53
29
|
|
|
54
|
-
|
|
55
|
-
| ----------- | ------ |
|
|
56
|
-
| Negation | `¬` |
|
|
57
|
-
| Conjunction | `&` |
|
|
58
|
-
| Disjunction | `∨` |
|
|
59
|
-
| Implication | `⇒` |
|
|
60
|
-
| Equivalence | `⇔` |
|
|
30
|
+
## Приоритеты
|
|
61
31
|
|
|
62
|
-
|
|
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. `⇔`.
|
|
63
43
|
|
|
64
|
-
|
|
65
|
-
| ----------- | ------ |
|
|
66
|
-
| Universal | `∀` |
|
|
67
|
-
| Existential | `∃` |
|
|
44
|
+
## Когда читать исходники
|
|
68
45
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
| Token | Form |
|
|
72
|
-
| --------------------- | ------------------------------------------------- |
|
|
73
|
-
| Function declaration | `F# ::= [<params>] <body STE>` |
|
|
74
|
-
| Predicate declaration | `P# ::= [<params>] <body LE>` |
|
|
75
|
-
| Parameter declaration | `α ∈ <STE>` (commas separate; commas inside `[]`) |
|
|
76
|
-
| Function call | `F#[<arg1>, <arg2>, …]` |
|
|
77
|
-
|
|
78
|
-
## Precedence (from highest to lowest)
|
|
79
|
-
|
|
80
|
-
1. Function calls, projections, boolean
|
|
81
|
-
2. Cartesian product `×`
|
|
82
|
-
3. Multiplicative `*`
|
|
83
|
-
4. Additive `+`, `-`
|
|
84
|
-
5. Set operators `∪`, `∩`, `\`, `∆`
|
|
85
|
-
6. Predicates (`∈`, `=`, `<`, …)
|
|
86
|
-
7. Negation `¬`
|
|
87
|
-
8. Conjunction `&`
|
|
88
|
-
9. Disjunction `∨`
|
|
89
|
-
10. Implication `⇒`
|
|
90
|
-
11. Equivalence `⇔`
|
|
91
|
-
|
|
92
|
-
Multi-index tokens inside projections / filters are parsed as a comma-separated list of natural numbers.
|
|
93
|
-
|
|
94
|
-
## When to consult the full grammar
|
|
95
|
-
|
|
96
|
-
- Grammar conflicts or surprising error positions — read `rslang.grammar` directly.
|
|
97
|
-
- Adding new operators or precedence rules — must be done in the domain package, not in rstool.
|
|
98
|
-
- Lezer terms / token IDs — see `@rsconcept/domain/src/rslang/parser/token.ts` and `parser.terms.ts`.
|
|
46
|
+
- Позиция ошибки неожиданная.
|
|
47
|
+
- Нужны Lezer terms/token IDs: `@rsconcept/domain/src/rslang/parser/token.ts`, `parser.terms.ts`.
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# Тестирование определений через концептуальную модель
|
|
2
|
+
|
|
3
|
+
Концептуальная модель (`КМ`) полезна как маленький стенд для проверки семантики выражений. Если агент не уверен, что формула означает именно нужную операцию, не угадывай по виду выражения: создай минимальную схему, задай тестовые значения для неопределяемых конституент и вычисли результат.
|
|
4
|
+
|
|
5
|
+
## Когда использовать
|
|
6
|
+
|
|
7
|
+
- Неочевидны `S#` против `D#`, проекции `Pr*` / `pr*`, фильтры `Fi*`, `red`, `bool`, `debool`.
|
|
8
|
+
- Формула синтаксически корректна, но есть сомнение в семантике результата.
|
|
9
|
+
- Нужно проверить, что аксиома действительно ловит ошибочные данные.
|
|
10
|
+
- Пользователь просит надежно изменить важное определение, а пример данных можно сделать маленьким.
|
|
11
|
+
|
|
12
|
+
Для простой проверки типизации сначала используй `analyzeExpression`. КМ нужна, когда вопрос зависит от интерпретации данных и вычисленного значения.
|
|
13
|
+
|
|
14
|
+
## Минимальный цикл
|
|
15
|
+
|
|
16
|
+
1. Создай отдельную `createSession` или изолированную копию текущей сессии.
|
|
17
|
+
2. Добавь только нужные поставщики: `X#`, `C#`, `S#` и проверяемые `D#` / `F#` / `P#` / `A#`.
|
|
18
|
+
3. Проверь формулы через `analyzeExpression` и `addOrUpdateConstituenta`.
|
|
19
|
+
4. Задай значения базисов и структур через `setConstituentaValue` или `setConstituentaValues`.
|
|
20
|
+
5. Вычисли проверяемую формулу через `evaluateExpression` или сохраненную конституенту через `evaluateConstituenta`.
|
|
21
|
+
6. Сравни результат с ожидаемым значением; если есть несколько зависимых определений, запусти `recalculateModel`.
|
|
22
|
+
|
|
23
|
+
## Что задавать руками
|
|
24
|
+
|
|
25
|
+
`basic`, `constant`, `structure` можно интерпретировать напрямую. `term`, `function`, `predicate`, `axiom`, `statement` должны вычисляться из формулы, поэтому их напрямую не задавай.
|
|
26
|
+
|
|
27
|
+
Пример формы данных:
|
|
28
|
+
|
|
29
|
+
```ts
|
|
30
|
+
const TUPLE_ID = -111;
|
|
31
|
+
|
|
32
|
+
tool.setConstituentaValues(sessionId, {
|
|
33
|
+
items: [
|
|
34
|
+
{ target: 1, value: { 0: 'ann', 1: 'bob', 2: 'cat' } },
|
|
35
|
+
{ target: 2, value: [[TUPLE_ID, 0, 1], [TUPLE_ID, 0, 2]] }
|
|
36
|
+
]
|
|
37
|
+
});
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Здесь `X1` получает подписи элементов, а `S1: ℬ(X1×X1)` получает множество пар по индексам элементов `X1`.
|
|
41
|
+
|
|
42
|
+
## Скрипты-тесты
|
|
43
|
+
|
|
44
|
+
Если проверка влияет на поведение схемы или есть риск регрессии, вынеси ее в маленький скрипт или colocated `*.test.ts`:
|
|
45
|
+
|
|
46
|
+
1. Собери минимальную сессию с нужными конституентами.
|
|
47
|
+
2. Задай тестовые значения неопределяемых конституент.
|
|
48
|
+
3. Вычисли целевые конституенты.
|
|
49
|
+
4. Проверь `success`, `status`, `diagnostics.length` и само `value`.
|
|
50
|
+
|
|
51
|
+
Тест должен проверять смысл формулы, а не только отсутствие диагностик. Для аксиом отдельно проверяй положительный и отрицательный набор данных: корректная модель должна давать истинную аксиому, ошибочная — `AXIOM_FALSE` или диагностируемый сбой вычисления.
|
|
52
|
+
|
|
53
|
+
## Ограничения
|
|
54
|
+
|
|
55
|
+
- Маленькая КМ проверяет семантику на выбранных данных, но не доказывает определение для всех моделей.
|
|
56
|
+
- Не подменяй предметное соглашение тестом: если смысл `S#` не ясен, уточни `convention` или спроси пользователя.
|
|
57
|
+
- Не добавляй искусственные конституенты в рабочую схему только ради теста. Держи scratch-сессию или тестовый скрипт отдельно.
|
package/docs/PORTAL-API.md
CHANGED
|
@@ -1,45 +1,31 @@
|
|
|
1
|
-
# Portal REST API
|
|
1
|
+
# Portal REST API
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Справка только для чтения существующих КС, ОСС и RSModel. `rstool` сам не ходит в REST API: он работает с in-memory сессиями.
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## Хосты
|
|
6
6
|
|
|
7
|
-
-
|
|
8
|
-
-
|
|
7
|
+
- UI: `https://portal.acconcept.ru/`
|
|
8
|
+
- REST API: `https://api.portal.acconcept.ru/`
|
|
9
9
|
|
|
10
|
-
##
|
|
10
|
+
## Пути
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
| `/models/:id` | `GET /api/models/:id` (RSModel router) |
|
|
12
|
+
- `/rsforms/:id` в UI → `GET /api/rsforms/:id` для метаданных.
|
|
13
|
+
- Полная КС → `GET /api/rsforms/:id/details`.
|
|
14
|
+
- Версия КС → `GET /api/library/:id/versions/:version`.
|
|
15
|
+
- ОСС → `GET /api/oss/:id` и соседние routes viewset.
|
|
16
|
+
- Модель → `GET /api/models/:id`.
|
|
17
|
+
- OpenAPI JSON → `GET https://api.portal.acconcept.ru/schema`.
|
|
19
18
|
|
|
20
|
-
##
|
|
19
|
+
## Как перенести КС в rstool
|
|
21
20
|
|
|
22
|
-
|
|
21
|
+
1. Получи `GET /api/rsforms/:id/details`.
|
|
22
|
+
2. Создай `createSession`.
|
|
23
|
+
3. Перенеси конституенты через `addOrUpdateConstituenta`: `alias`, `cstType`, `definitionFormal`, `term`, `definitionText`, `convention`.
|
|
24
|
+
4. Работай локально: анализ, правки, вычисления.
|
|
25
|
+
5. Для передачи результата используй `exportSession`.
|
|
23
26
|
|
|
24
|
-
|
|
25
|
-
GET https://api.portal.acconcept.ru/schema
|
|
26
|
-
```
|
|
27
|
+
## Не делай
|
|
27
28
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
rstool itself works with in-memory sessions via `RSToolAgent` or the stdio wrapper. To bridge between the REST payload and a rstool session, the typical flow is:
|
|
33
|
-
|
|
34
|
-
1. `GET /api/rsforms/:id/details` to fetch the persisted RSForm.
|
|
35
|
-
2. Convert the response (constituents, formal definitions, term, convention, etc.) into a series of `addOrUpdateConstituenta` calls inside a fresh `createSession`.
|
|
36
|
-
3. Operate offline: analyse, edit, evaluate, then `exportSession` for hand-off.
|
|
37
|
-
|
|
38
|
-
There is no backend write path in rstool: edits never round-trip to the Portal automatically. Publish changes back to the Portal through the existing Portal UI or REST writes.
|
|
39
|
-
|
|
40
|
-
## Don'ts
|
|
41
|
-
|
|
42
|
-
- Do not scrape the SPA HTML.
|
|
43
|
-
- Do not pass UI hash params (`?tab=editor`, etc.) to REST.
|
|
44
|
-
- Do not call `/api/rsforms/:id/details` for trivial metadata — `GET /api/rsforms/:id` is cheaper.
|
|
45
|
-
- Do not assume the API host is the same as the UI host in production — they are different.
|
|
29
|
+
- Не парси HTML SPA.
|
|
30
|
+
- Не переноси UI query/hash вроде `?tab=editor` в REST.
|
|
31
|
+
- Не запрашивай `/details`, если нужны только метаданные.
|
package/docs/README.md
CHANGED
|
@@ -1,15 +1,17 @@
|
|
|
1
|
-
# rstool
|
|
1
|
+
# Документация rstool
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Краткая русская справка для агентов.
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|------|-----------|
|
|
7
|
-
| [`DOMAIN.md`](DOMAIN.md) | You need the Concept Portal vocabulary (constituenta, conceptual schema/model, OSS, synthesis). |
|
|
8
|
-
| [`CONSTITUENTA.md`](CONSTITUENTA.md) | You are upserting constituents — fields, `cstType` table, validation rules, recommended order. |
|
|
9
|
-
| [`SYNTAX.md`](SYNTAX.md) | You are constructing RSLang expressions — operators, quantifiers, parameterised functions, examples. |
|
|
10
|
-
| [`TYPIFICATION.md`](TYPIFICATION.md) | You are interpreting `AnalysisResult.type` / `valueClass` or constructing template expressions with radicals. |
|
|
11
|
-
| [`DIAGNOSTICS.md`](DIAGNOSTICS.md) | You received `analysis.diagnostics` and need to map error codes to fixes. |
|
|
12
|
-
| [`PORTAL-API.md`](PORTAL-API.md) | You need to fetch an existing RSForm/OSS/RSModel from the live Portal REST API. |
|
|
13
|
-
| [`GRAMMAR-REF.md`](GRAMMAR-REF.md) | You need a compact token / precedence table; the full grammar lives in `@rsconcept/domain`. |
|
|
5
|
+
## Какой файл читать
|
|
14
6
|
|
|
15
|
-
|
|
7
|
+
- **DOMAIN.md** — термины Portal: конституента, концептуальная схема/модель, ОСС, синтез.
|
|
8
|
+
- **CONCEPTUAL-SCHEMA.md** — проектирование и ревью концептуальных схем.
|
|
9
|
+
- **CONSTITUENTA.md** — структура и правила конституент.
|
|
10
|
+
- **SYNTAX.md** — операторы, кванторы, функции и примеры выражений.
|
|
11
|
+
- **TYPIFICATION.md** — типизация (`AnalysisResult.type`, `valueClass`).
|
|
12
|
+
- **MODEL-TESTING.md** — проверка семантики определений на маленьких концептуальных моделях.
|
|
13
|
+
- **DIAGNOSTICS.md** — диагностики анализа и способы исправления ошибок.
|
|
14
|
+
- **PORTAL-API.md** — объекты REST API Portal.
|
|
15
|
+
- **GRAMMAR-REF.md** — краткая карта токенов и приоритетов.
|
|
16
|
+
|
|
17
|
+
Контракт агента `rstool` см. в `../skills/rstool-helper/REFERENCE.md`.
|
package/docs/SYNTAX.md
CHANGED
|
@@ -1,139 +1,84 @@
|
|
|
1
|
-
# RSLang
|
|
1
|
+
# Синтаксис RSLang
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Читай, когда строишь или исправляешь `definitionFormal`. Токены и приоритеты — в `GRAMMAR-REF.md`, типизация — в `TYPIFICATION.md`.
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## Имена и литералы
|
|
6
6
|
|
|
7
|
-
-
|
|
8
|
-
-
|
|
9
|
-
-
|
|
10
|
-
-
|
|
7
|
+
- Глобальные алиасы: `X1`, `C2`, `S3`, `D11`, `F7`, `P4`, `A6`, `T9`; буква совпадает с ролью.
|
|
8
|
+
- Радикалы: `R1`, `R2` — шаблонные ступени в параметрах.
|
|
9
|
+
- Локальные переменные: `x`, `ξ`, `μ2`, `y1`.
|
|
10
|
+
- Целые: `0`, `42`; отрицательного литерала нет, пиши `0 - 5`.
|
|
11
|
+
- `Z` — множество целых, `∅` — пустое множество с типизацией `ℬ(R0)`.
|
|
11
12
|
|
|
12
|
-
##
|
|
13
|
+
## Теоретико-множественные выражения (STE)
|
|
13
14
|
|
|
14
|
-
-
|
|
15
|
-
-
|
|
16
|
-
-
|
|
15
|
+
- `D1 ∪ D2`, `D1 ∩ D2`, `D1 \ D2`, `D1 ∆ D2` — операции над множествами.
|
|
16
|
+
- `X1 × X2` — декартово произведение.
|
|
17
|
+
- `ℬ(X1)` — булеан, множество всех подмножеств.
|
|
18
|
+
- `(a, b, c)` — кортеж, арность минимум 2.
|
|
19
|
+
- `{a, b, c}` — перечисление.
|
|
20
|
+
- `bool(a)` — синглетон, `debool(S)` — извлечение единственного элемента.
|
|
21
|
+
- `red(S)` — суммарное множество; `S` должно иметь ступень `ℬ(ℬ(H))`.
|
|
22
|
+
- `pr1(tuple)` — малая проекция кортежа.
|
|
23
|
+
- `Pr1(S)` — большая проекция множества кортежей.
|
|
24
|
+
- `Fi1[D](S)` — фильтр по принадлежности выбранной проекции в `D`.
|
|
17
25
|
|
|
18
|
-
|
|
26
|
+
Мультииндексы разрешены: `pr1,3(...)`, `Pr2,4(S1)`, `Fi1,2[D1](S1)`.
|
|
19
27
|
|
|
20
|
-
|
|
21
|
-
| -------------------- | ------------------- | ----------------------------------------------- |
|
|
22
|
-
| Union | `D1 ∪ D2` | |
|
|
23
|
-
| Intersection | `D1 ∩ D2` | |
|
|
24
|
-
| Difference | `D1 \ D2` | |
|
|
25
|
-
| Symmetric difference | `D1 ∆ D2` | |
|
|
26
|
-
| Cartesian product | `X1 × X2` | typification: tuple |
|
|
27
|
-
| Boolean / power set | `ℬ(X1)` | set of all subsets |
|
|
28
|
-
| Tuple | `(a, b, c)` | ordered, n ≥ 2 |
|
|
29
|
-
| Enumeration | `{a, b, c}` | unordered, n ≥ 1 |
|
|
30
|
-
| Singleton | `bool(a)` ≡ `{a}` | |
|
|
31
|
-
| Desingleton | `debool({a})` ≡ `a` | only for one-element sets |
|
|
32
|
-
| Sum set | `red(S1)` | union of inner sets; `S1` must be a set of sets |
|
|
33
|
-
| Small projection | `pr1((a1, …, an))` | returns `a1` |
|
|
34
|
-
| Large projection | `Pr1(S1)` | set of first components of tuples in `S1` |
|
|
35
|
-
| Filter | `Fi1[D1](S1)` | subset of `S1` whose first projection ∈ `D1` |
|
|
28
|
+
## Логические выражения (LE)
|
|
36
29
|
|
|
37
|
-
|
|
30
|
+
- Предикаты множеств: `ξ ∈ S`, `ξ ∉ S`, `S1 = S2`, `S1 ≠ S2`, `S1 ⊆ S2`, `S1 ⊂ S2`, `S1 ⊄ S2`.
|
|
31
|
+
- Арифметические предикаты: `=`, `≠`, `<`, `≤`, `>`, `≥` над `Z`.
|
|
32
|
+
- Связки: `¬A`, `A & B`, `A ∨ B`, `A ⇒ B`, `A ⇔ B`.
|
|
38
33
|
|
|
39
|
-
|
|
34
|
+
`TRUE` и `FALSE` в экспликации КС не используют.
|
|
40
35
|
|
|
41
|
-
|
|
36
|
+
## Кванторы
|
|
42
37
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
| Set equality | `S1 = S2` |
|
|
48
|
-
| Set inequality | `S1 ≠ S2` |
|
|
49
|
-
| Inclusion | `S1 ⊆ S2` |
|
|
50
|
-
| Strict inclusion | `S1 ⊂ S2` |
|
|
51
|
-
| Non-inclusion | `S1 ⊄ S2` |
|
|
38
|
+
- `∀ξ∈D1 (LE(ξ))` — всеобщность.
|
|
39
|
+
- `∃ξ∈D1 (LE(ξ))` — существование.
|
|
40
|
+
- `∀(ξ1, ξ2)∈S1 (LE(ξ1, ξ2))` — объявление кортежа.
|
|
41
|
+
- `∀ξ1, ξ2∈D1 (LE(ξ1, ξ2))` — сокращение вложенных кванторов.
|
|
52
42
|
|
|
53
|
-
|
|
43
|
+
Скобки вокруг `LE` можно опустить для атомарного логического выражения.
|
|
54
44
|
|
|
55
|
-
|
|
45
|
+
## Арифметика
|
|
56
46
|
|
|
57
|
-
|
|
47
|
+
`a + b`, `a - b`, `a * b` дают `Z`. `card(S)` возвращает мощность конечного множества.
|
|
58
48
|
|
|
59
|
-
|
|
60
|
-
| ----------- | ------- |
|
|
61
|
-
| Negation | `¬A` |
|
|
62
|
-
| Conjunction | `A & B` |
|
|
63
|
-
| Disjunction | `A ∨ B` |
|
|
64
|
-
| Implication | `A ⇒ B` |
|
|
65
|
-
| Equivalence | `A ⇔ B` |
|
|
49
|
+
## Параметризованные выражения
|
|
66
50
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
## Quantifiers
|
|
70
|
-
|
|
71
|
-
| Form | Syntax |
|
|
72
|
-
| ------------- | ---------------------------- |
|
|
73
|
-
| Universal | `∀ξ∈STE (LE(ξ))` |
|
|
74
|
-
| Existential | `∃ξ∈STE (LE(ξ))` |
|
|
75
|
-
| Tuple binding | `∀(ξ1, ξ2)∈STE (LE(ξ1, ξ2))` |
|
|
76
|
-
| Variable list | `∀ξ1, ξ2 ∈ STE (LE(ξ1, ξ2))` |
|
|
77
|
-
|
|
78
|
-
Parentheses around `LE` may be omitted for atomic logical expressions.
|
|
79
|
-
|
|
80
|
-
## Arithmetic
|
|
81
|
-
|
|
82
|
-
Operations `a + b`, `a - b`, `a * b` form set-theoretic expressions with typification `Z`. Negative numbers are computed, never literal.
|
|
83
|
-
|
|
84
|
-
`card(S)` returns the integer cardinality of `S` (always finite in practice).
|
|
85
|
-
|
|
86
|
-
## Parameterised expressions
|
|
87
|
-
|
|
88
|
-
### Term-function declaration
|
|
89
|
-
|
|
90
|
-
```
|
|
51
|
+
```text
|
|
91
52
|
F1 ::= [α1∈STE1, α2∈STE2(α1)] STE(α1, α2)
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
- Inside `[]` is an ordered list of parameter declarations separated by commas.
|
|
95
|
-
- A parameter is declared with `∈`: `local_var ∈ domain`.
|
|
96
|
-
- A declared variable can appear in subsequent parameter domains and in the result STE.
|
|
97
|
-
|
|
98
|
-
### Predicate-function declaration
|
|
99
|
-
|
|
100
|
-
```
|
|
101
53
|
P1 ::= [α1∈STE1, α2∈STE2(α1)] LE(α1, α2)
|
|
102
54
|
```
|
|
103
55
|
|
|
104
|
-
|
|
56
|
+
- В `[]` идут параметры через `∈`.
|
|
57
|
+
- Параметр доступен в следующих доменах и теле.
|
|
58
|
+
- Вызов позиционный: `F1[ξ1, S1]`, `P1[ξ1\ξ2, ξ3]`.
|
|
59
|
+
- `F#` возвращает теоретико-множественное выражение, `P#` — логическое.
|
|
105
60
|
|
|
106
|
-
|
|
61
|
+
## Радикалы
|
|
107
62
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
### Template expressions
|
|
111
|
-
|
|
112
|
-
Functions that use radicals as parameter typifications are templates:
|
|
113
|
-
|
|
114
|
-
```
|
|
63
|
+
```text
|
|
115
64
|
F2 ::= [α1∈R1×R2, α2∈R1] α2 = pr1(α1)
|
|
116
65
|
```
|
|
117
66
|
|
|
118
|
-
-
|
|
119
|
-
-
|
|
120
|
-
-
|
|
67
|
+
- `R#` выводится по типизациям аргументов в месте вызова.
|
|
68
|
+
- Все вхождения одного `R#` должны совпасть.
|
|
69
|
+
- Радикалы допустимы только в доменах параметров.
|
|
121
70
|
|
|
122
|
-
##
|
|
71
|
+
## Примеры
|
|
123
72
|
|
|
124
73
|
- `¬α ∈ S1`
|
|
125
|
-
- `D1 ∈ S1 ⇒ 2 + 2 = 5`
|
|
126
74
|
- `D1 ⊆ D2 ⇔ ∀x∈D1 x∈D2`
|
|
127
75
|
- `∀x∈D1 ∃y∈D2 (x, y)∈S1 & (x, x)∈S1`
|
|
128
76
|
- `(4 + 5) * 3`, `card(X1) > 5`
|
|
129
|
-
- `ℬ(2) = {{}, {1}, {2}, {1, 2}}`
|
|
130
77
|
- `pr2((5, 4, 3, 2, 1)) = 4`
|
|
131
78
|
- `red({{1, 2, 3}, {3, 4}}) = {1, 2, 3, 4}`
|
|
132
|
-
- `Fi2[{2, 4}]({((1, 2), (3, 4), (5, 6))}) = {((1, 2), (3, 4))}`
|
|
133
79
|
|
|
134
|
-
##
|
|
80
|
+
## Корректность
|
|
135
81
|
|
|
136
|
-
-
|
|
137
|
-
-
|
|
138
|
-
-
|
|
139
|
-
- All formal definitions must be **bijectively portable**: values are independent of any bijective replacement of undefined-concept interpretations.
|
|
82
|
+
- Анализ идет в глобальном контексте: все алиасы должны быть известны и типизированы.
|
|
83
|
+
- Формальные определения должны быть биективно переносимыми (гарантируется семантическим анализатором).
|
|
84
|
+
- Логическая непротиворечивость проверяется примером интерпретации в модели.
|
package/docs/TYPIFICATION.md
CHANGED
|
@@ -1,84 +1,65 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Типизация
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Читай, когда разбираешь `AnalysisResult.type`, `valueClass` или радикалы.
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## Ступени
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
Выражение типизировано, если его значения принадлежат ступени `H`.
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
| Tuple of arity n | `(H1 × H2 × … × Hn)` | ordered structured grade |
|
|
14
|
-
| Set | `ℬ(H)` | set of values of grade `H` |
|
|
9
|
+
- `Xi`, `Ci` — элемент базисного или константного множества.
|
|
10
|
+
- `Z` — целое число.
|
|
11
|
+
- `(H1 × H2 × ... × Hn)` — кортеж.
|
|
12
|
+
- `ℬ(H)` — множество значений ступени `H`.
|
|
15
13
|
|
|
16
|
-
|
|
14
|
+
`∅` имеет типизацию `ℬ(R0)`: пустое множество подстраивается под контекст.
|
|
17
15
|
|
|
18
|
-
##
|
|
16
|
+
## Дополнительные типизации
|
|
19
17
|
|
|
20
|
-
|
|
18
|
+
- `Logic` — логические выражения: аксиомы, высказывания, тела предикат-функций.
|
|
19
|
+
- `Hr <- [H1, H2, ..., Hi]` — параметризованная типизация функций: результат и аргументы.
|
|
21
20
|
|
|
22
|
-
|
|
23
|
-
- **Parameterised** — typification of term-functions and predicate-functions:
|
|
21
|
+
## Радикалы
|
|
24
22
|
|
|
25
|
-
|
|
26
|
-
Hr 🠔 [H1, H2, …, Hi]
|
|
27
|
-
```
|
|
23
|
+
`R1`, `R2`, ... — шаблонные ступени.
|
|
28
24
|
|
|
29
|
-
|
|
25
|
+
- Значение `R#` выводится по аргументам в месте вызова.
|
|
26
|
+
- Все вхождения одного `R#` должны дать одну ступень.
|
|
27
|
+
- Разные `R#` независимы.
|
|
28
|
+
- Радикалы можно писать только в доменах параметров; в теле результата будет `radicalUsage`.
|
|
30
29
|
|
|
31
|
-
##
|
|
30
|
+
## `AnalysisResult.type`
|
|
32
31
|
|
|
33
|
-
|
|
32
|
+
`type` приходит как JSON анализатора: `Record<string, unknown> | null`.
|
|
34
33
|
|
|
35
|
-
|
|
36
|
-
- Radicals with different indices are independent.
|
|
37
|
-
- Radicals may only appear in parameter domains, **not in the result expression**.
|
|
34
|
+
Правила:
|
|
38
35
|
|
|
39
|
-
|
|
36
|
+
1. Сначала проверь `analysis.success === true` и `analysis.type !== null`.
|
|
37
|
+
2. Не разбирай объект вручную; используй helpers из `@rsconcept/domain`.
|
|
38
|
+
3. `valueClass` уточняет вычислимость: `Value`, `Property`, `Invalid`.
|
|
40
39
|
|
|
41
|
-
|
|
40
|
+
Полезные API: `TypeID`, `TypePath`, `makeTypePath`, `parseTypeText(...)`.
|
|
42
41
|
|
|
43
|
-
|
|
44
|
-
- `TypePath` (sequence of indices) addresses positions inside a tuple-of-sets-of-tuples structure; use `makeTypePath` to construct.
|
|
45
|
-
- `parseTypeText(...)` parses an ASCII representation `B(X1)`, `(X1×X2)`, etc., into a `Typification`.
|
|
42
|
+
## `S#` и `D#`
|
|
46
43
|
|
|
47
|
-
|
|
44
|
+
- У `structure` (`S#`) `definitionFormal` читается как типизация. `ℬ(X1×X1)` описывает множество пар.
|
|
45
|
+
- У `term` (`D#`) `definitionFormal` читается как определение. `X1×X1` строит декартов продукт.
|
|
48
46
|
|
|
49
|
-
|
|
50
|
-
2. Use `analysis.type` (object) only as opaque input to `@rsconcept/domain` helpers — do not pattern-match it manually.
|
|
51
|
-
3. The `valueClass` companion indicates `Value`, `Property` (non-computable membership only), or `Invalid`.
|
|
47
|
+
Для отношений предпочитай `S#` с `ℬ(X1×X1)` и конвенцией; выводимые понятия делай через `Pr*`, `Fi*`, фильтры и функции.
|
|
52
48
|
|
|
53
|
-
##
|
|
49
|
+
## Операции
|
|
54
50
|
|
|
55
|
-
|
|
56
|
-
- On a **`term`** (`D#`), the same token sequence is a **definition** evaluated in the model. `X1×X1` alone is the Cartesian product — all ordered pairs from `X1` — not the typification of a relation stored in `S#`.
|
|
51
|
+
Создают ступень: `ℬ(H)`, `H1 × H2`, `(a, b)`, `{a, b}`, `bool(a)`.
|
|
57
52
|
|
|
58
|
-
|
|
53
|
+
Требуют подходящую ступень:
|
|
59
54
|
|
|
60
|
-
|
|
55
|
+
- `red(S)` — нужно `S : ℬ(ℬ(H))`.
|
|
56
|
+
- `debool(S)` — нужно одноэлементное множество.
|
|
57
|
+
- `pr1(tuple)`, `Pr1(S)` — нужна достаточная арность.
|
|
58
|
+
- `Fi1[D](S)` — `D` должен соответствовать выбранной проекции.
|
|
61
59
|
|
|
62
|
-
|
|
60
|
+
## Частые ошибки
|
|
63
61
|
|
|
64
|
-
-
|
|
65
|
-
- `
|
|
66
|
-
- `(
|
|
67
|
-
- `
|
|
68
|
-
- `bool(a)` — singleton
|
|
69
|
-
|
|
70
|
-
Derived structures consume a grade:
|
|
71
|
-
|
|
72
|
-
- `red(S)` — union of inner sets; requires `S : ℬ(ℬ(H))`
|
|
73
|
-
- `debool({a})` — extracts the single element of a singleton
|
|
74
|
-
- `pr1((a1, …, an))`, `Pr1(S)` — projections (multi-indices allowed: `pr1,3`, `Pr2,4`)
|
|
75
|
-
- `Fi1[D](S)` — filters by membership in `D`; multi-index variants must match parameter arity
|
|
76
|
-
|
|
77
|
-
## Common typification pitfalls
|
|
78
|
-
|
|
79
|
-
- Negative integer literals do not exist — use `0 - n`.
|
|
80
|
-
- `debool(S)` fails if `S` is not a singleton.
|
|
81
|
-
- Tuple projections require the argument to be a tuple of sufficient arity; `pr3((a, b))` is an error.
|
|
82
|
-
- Filter parameter list arity must match the multi-index in `Fi[...]`.
|
|
83
|
-
- A radical in the **result expression** of a template is a hard error (`radicalUsage`).
|
|
84
|
-
- An `axiom` or `statement` must have typification `Logic`; non-logical formal definitions raise `expectedLogic`.
|
|
62
|
+
- `debool(S)` без гарантии синглетона.
|
|
63
|
+
- `pr3((a, b))`: индекс вне арности.
|
|
64
|
+
- `Fi1,2[D](S)`: параметр `D` не совпал с двумя проекциями.
|
|
65
|
+
- `A#` и `T#` не имеют `Logic`: будет `expectedLogic`.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rsconcept/rstool",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.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 and stdio wrapper.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "IRBorisov",
|