@rsconcept/rstool 0.7.2 → 0.8.1
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 +1 -1
- package/docs/CONSTITUENTA.md +1 -1
- package/docs/DIAGNOSTICS.md +8 -5
- package/docs/MODEL-TESTING.md +1 -1
- package/docs/PORTAL-API.md +20 -0
- package/examples/README.md +52 -29
- package/examples/build-chocolate-nim-rsform.ts +311 -0
- package/examples/chocolate-nim/build-rsform.ts +311 -0
- package/examples/chocolate-nim/build-rsmodel.ts +100 -0
- package/examples/chocolate-nim/constants.ts +10 -0
- package/examples/chocolate-nim/rsform-session.json +778 -0
- package/examples/chocolate-nim/rsmodel-session.json +802 -0
- package/examples/expression-bank/bank-constituents.ts +370 -0
- package/examples/expression-bank/build-rsform.ts +59 -0
- package/examples/expression-bank/constants.ts +1 -0
- package/examples/expression-bank/rsform-session.json +4006 -0
- package/examples/{build-kinship-rsform.ts → kinship/build-rsform.ts} +276 -54
- package/examples/{build-kinship-rsmodel.ts → kinship/build-rsmodel.ts} +18 -7
- package/examples/kinship/constants.ts +5 -3
- package/examples/{kinship-rsmodel-session.json → kinship/rsform-session.json} +614 -92
- package/examples/{kinship-rsform-session.json → kinship/rsmodel-session.json} +704 -50
- package/examples/kinship/x1-actions.test.ts +2 -1
- package/examples/movd/build-rsform.ts +325 -0
- package/examples/movd/build-rsmodel.ts +159 -0
- package/examples/movd/constants.ts +18 -0
- package/examples/movd/rsform-session.json +738 -0
- package/examples/movd/rsmodel-session.json +832 -0
- package/examples/{build-sample-rsform.ts → sample/build-rsform.ts} +2 -2
- package/examples/{build-sample-rsmodel.ts → sample/build-rsmodel.ts} +3 -4
- package/examples/template-apply/build-rsform.ts +236 -0
- package/examples/template-apply/constants.ts +13 -0
- package/examples/template-apply/rsform-session.json +333 -0
- package/package.json +12 -6
- package/skills/rstool-helper/EXAMPLES.md +2 -2
- /package/examples/{sample-rsform-session.json → sample/rsform-session.json} +0 -0
- /package/examples/{sample-rsmodel-session.json → sample/rsmodel-session.json} +0 -0
package/README.md
CHANGED
|
@@ -78,7 +78,7 @@ From `rsconcept/rstool` (or run `powershell -File scripts/dev/LocalDevSetup.ps1`
|
|
|
78
78
|
- `npm test`
|
|
79
79
|
- `npm run build` — produce `dist/` via tsdown
|
|
80
80
|
- `npm run wrapper` — dev stdio wrapper via `tsx`
|
|
81
|
-
- `npm run example:client`, `npm run example:build-schema`, `npm run example:build-rsmodel` —
|
|
81
|
+
- `npm run example:client`, `npm run example:build-schema`, `npm run example:build-rsmodel` — полный список `example:*` и `kinship:cli` в [`examples/README.md`](examples/README.md)
|
|
82
82
|
|
|
83
83
|
## Stdio protocol
|
|
84
84
|
|
package/docs/CONSTITUENTA.md
CHANGED
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
2. `S1` — `definitionFormal: 'ℬ(X1×X1)'`; конвенция объясняет порядок пары.
|
|
43
43
|
3. `D#` — проекции и фильтры: `Pr1(S1)`, `Pr2(S1)`, `Fi1[D1](S1)`.
|
|
44
44
|
|
|
45
|
-
Пример: `examples/build-
|
|
45
|
+
Пример: `examples/kinship/build-rsform.ts`.
|
|
46
46
|
|
|
47
47
|
## Валидация
|
|
48
48
|
|
package/docs/DIAGNOSTICS.md
CHANGED
|
@@ -41,21 +41,23 @@
|
|
|
41
41
|
|
|
42
42
|
## Типизации и структура
|
|
43
43
|
|
|
44
|
-
- `0x8803 typesNotEqual` / `0x8825 typesNotCompatible` — операнды
|
|
44
|
+
- `0x8803 typesNotEqual` / `0x8825 typesNotCompatible` — операнды несовместимы для оператора (`params`: тип A, тип B, оператор).
|
|
45
45
|
- `0x8804 globalNotTyped` — сначала добавь и проанализируй поставщика.
|
|
46
46
|
- `0x8805 invalidDecart`, `0x8806 invalidBoolean`, `0x8810 invalidReduce` — неверная ступень для операции.
|
|
47
|
+
- `0x8807 invalidTypeOperation` — аргумент оператора (`∪`, `∈`, `D{}`, `:∈` и т.д.) должен быть множеством (`params`: оператор, тип).
|
|
47
48
|
- `0x8808 invalidCard` — `card(...)` не над множеством.
|
|
48
49
|
- `0x8809 invalidDebool` — нет гарантии синглетона.
|
|
49
50
|
- `0x880B globalFuncWithoutArgs` — функция вызвана без `[]`.
|
|
50
51
|
- `0x8811 invalidProjectionTuple`, `0x8812 invalidProjectionSet` — неверная проекция.
|
|
51
52
|
- `0x8813 invalidEnumeration` — элементы перечисления разных ступеней.
|
|
52
|
-
- `0x8816 invalidElementPredicate` — `ξ ∈ S` с несовместимыми
|
|
53
|
+
- `0x8816 invalidElementPredicate` — `ξ ∈ S` с несовместимыми ступенями (`params`: тип элемента, оператор, тип множества).
|
|
53
54
|
- `0x8818 invalidArgsArity`, `0x8819 invalidArgumentType` — неверный вызов функции.
|
|
54
55
|
- `0x8821 radicalUsage` — радикал вне домена параметра.
|
|
55
56
|
- `0x8822 invalidFilterArgumentType`, `0x8823 invalidFilterArity` — неверный `Fi`.
|
|
56
|
-
- `0x8824 arithmeticNotSupported`, `0x8826 orderingNotSupported` — нужна ступень `Z`.
|
|
57
|
+
- `0x8824 arithmeticNotSupported`, `0x8826 orderingNotSupported` — тип не поддерживает оператор (`params`: тип, оператор); для арифметики/порядка нужна ступень `Z`.
|
|
57
58
|
- `0x8827 expectedLogic` — нужна логическая формула.
|
|
58
59
|
- `0x8828 expectedSetexpr` — нужно теоретико-множественное выражение, а не логика.
|
|
60
|
+
- `0x882A invalidQuantifierDomain` — в кванторной декларации `∀`/`∃` область должна быть множеством (`params`: оператор, тип); не путать с `0x8807`.
|
|
59
61
|
|
|
60
62
|
## Схема и вычисление
|
|
61
63
|
|
|
@@ -67,7 +69,7 @@
|
|
|
67
69
|
- `0x8100 calcUnknownError` — непредвиденная ошибка вычисления (неверные данные для операции, внутренний сбой).
|
|
68
70
|
- `0x8105 calcInvalidDebool` — `debool` получил не синглетон.
|
|
69
71
|
- `0x8106 iterateInfinity`, `0x8107 calculationNotSupported` — конструкция не исполнима в конечной модели.
|
|
70
|
-
- `0x8108 calcInvalidData` — несовместимые значения в runtime (`params`:
|
|
72
|
+
- `0x8108 calcInvalidData` — несовместимые значения в runtime (`params`: значение A, значение B, оператор); типично сравнение множества с числом. Диапазон `from`/`to` — узел операции.
|
|
71
73
|
|
|
72
74
|
## Типичные ошибки агентов
|
|
73
75
|
|
|
@@ -77,7 +79,8 @@
|
|
|
77
79
|
- Давать логическое тело `term` или нелогическое тело `axiom`/`statement`.
|
|
78
80
|
- Использовать `R#` в теле результата.
|
|
79
81
|
- Вычислять производные понятия до привязки данных для базовых.
|
|
80
|
-
- Сравнивать или комбинировать значения несовместимых ступеней в модели (ожидай `0x8108 calcInvalidData`).
|
|
82
|
+
- Сравнивать или комбинировать значения несовместимых ступеней в модели (ожидай `0x8108 calcInvalidData` с оператором в `params`).
|
|
83
|
+
- Писать `∀a∈Z` или `∀a∈(логика)` вместо множества (ожидай `0x882A invalidQuantifierDomain`).
|
|
81
84
|
|
|
82
85
|
## Цикл исправления
|
|
83
86
|
|
package/docs/MODEL-TESTING.md
CHANGED
package/docs/PORTAL-API.md
CHANGED
|
@@ -102,6 +102,26 @@ for (const item of portal.items) {
|
|
|
102
102
|
а не alias `curl` (`Invoke-WebRequest`), если нужен CLI-синтаксис curl.
|
|
103
103
|
- Сначала бери метаданные, если нужно только название или доступность схемы.
|
|
104
104
|
|
|
105
|
+
### Windows: кодировка в скриптах пайплайна
|
|
106
|
+
|
|
107
|
+
На Windows консоль по умолчанию часто **cp1251**; Python `print` падает с `UnicodeEncodeError`
|
|
108
|
+
на символах вне этой таблицы (стрелки `→`, математика в логах и т.п.). Если `print` стоит
|
|
109
|
+
**до** следующего шага пайплайна (например вызова `npx tsx`), скрипт оборвётся и артефакт
|
|
110
|
+
не обновится.
|
|
111
|
+
|
|
112
|
+
- **Запись JSON** — всегда UTF-8; для RSLang-символов в формулах не экранируй Unicode в JSON:
|
|
113
|
+
|
|
114
|
+
```python
|
|
115
|
+
path.write_text(json.dumps(payload, ensure_ascii=False, indent=2), encoding='utf-8')
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
- **Чтение** — `encoding='utf-8'`; для fetch API предпочитай `urllib` / `requests`, не
|
|
119
|
+
`Out-File` без явной UTF-8 в PowerShell.
|
|
120
|
+
- **Логи в `print`** — ASCII (`->`, `...`) или только id/alias без математики; не полагайся
|
|
121
|
+
на то, что консоль UTF-8.
|
|
122
|
+
- При необходимости Unicode в stdout: `PYTHONIOENCODING=utf-8` или `sys.stdout.reconfigure(encoding='utf-8')`
|
|
123
|
+
(Python 3.7+), но для агентских скриптов проще держать вывод в ASCII.
|
|
124
|
+
|
|
105
125
|
## Не делай
|
|
106
126
|
|
|
107
127
|
- Не парси HTML SPA.
|
package/examples/README.md
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
```bash
|
|
10
10
|
npm install
|
|
11
11
|
npm run build # обёртка для скриптов
|
|
12
|
-
npm run example:client #
|
|
12
|
+
npm run example:client # минимальный цикл API; схемы — см. таблицу ниже
|
|
13
13
|
```
|
|
14
14
|
|
|
15
15
|
**После `npm install @rsconcept/rstool`** (нужен `tsx` или аналог):
|
|
@@ -18,42 +18,65 @@ npm run example:client # и остальные example:* / kinship:cli — см.
|
|
|
18
18
|
npx tsx node_modules/@rsconcept/rstool/examples/agent-client.ts
|
|
19
19
|
```
|
|
20
20
|
|
|
21
|
-
Скрипты пишут JSON
|
|
21
|
+
Скрипты пишут JSON в `examples/<topic>/`; запускайте из корня пакета (каталог с `package.json` rstool).
|
|
22
22
|
|
|
23
|
-
##
|
|
23
|
+
## Макет папки темы
|
|
24
24
|
|
|
25
|
-
|
|
26
|
-
|------|------------|------------|
|
|
27
|
-
| [`agent-client.ts`](agent-client.ts) | `example:client` | Минимальный цикл: сессия, upsert, анализ, значения, диагностики через stdio |
|
|
28
|
-
| [`build-sample-rsform.ts`](build-sample-rsform.ts) | `example:build-schema` | Собрать учебную RSForm (X1, S1, D1) и сохранить сессию |
|
|
29
|
-
| [`build-sample-rsmodel.ts`](build-sample-rsmodel.ts) | `example:build-rsmodel` | RSForm + привязки + вычисления → учебная RSModel |
|
|
30
|
-
| [`build-kinship-rsform.ts`](build-kinship-rsform.ts) | `example:build-kinship-schema` | Полная концептуальная схема «родственные отношения» (много конституент) |
|
|
31
|
-
| [`build-kinship-rsmodel.ts`](build-kinship-rsmodel.ts) | `example:build-kinship-rsmodel` | Загрузить kinship RSForm, задать семью, вычислить модель (в т.ч. D3) |
|
|
32
|
-
| [`kinship/cli.ts`](kinship/cli.ts) | `kinship:cli` | Интерактивное редактирование людей (X1) и связей (S1) в kinship-модели |
|
|
25
|
+
У `sample/`, `chocolate-nim/` и `movd/` одинаковая структура:
|
|
33
26
|
|
|
34
|
-
|
|
27
|
+
| Файл | Роль |
|
|
28
|
+
| ------------------ | ----------------------------------------------- |
|
|
29
|
+
| `constants.ts` | Id конституент и пути к JSON-сессиям |
|
|
30
|
+
| `build-rsform.ts` | Сборка RSForm → `rsform-session.json` |
|
|
31
|
+
| `build-rsmodel.ts` | Демо-модель и проверки → `rsmodel-session.json` |
|
|
35
32
|
|
|
36
|
-
Готовые снимки `exportSession`
|
|
33
|
+
Готовые `*-session.json` — снимки `exportSession` для `importSession` и тестов. Пересобрать: соответствующий `build-*.ts` перезапишет файл рядом с собой.
|
|
37
34
|
|
|
38
|
-
|
|
39
|
-
|------|------------|
|
|
40
|
-
| [`sample-rsform-session.json`](sample-rsform-session.json) | Учебная RSForm (результат `build-sample-rsform`) |
|
|
41
|
-
| [`sample-rsmodel-session.json`](sample-rsmodel-session.json) | Учебная RSModel с вычисленными значениями |
|
|
42
|
-
| [`kinship-rsform-session.json`](kinship-rsform-session.json) | Схема родства без привязок |
|
|
43
|
-
| [`kinship-rsmodel-session.json`](kinship-rsmodel-session.json) | Kinship-модель с примерной семьёй (по умолчанию для `kinship:cli`) |
|
|
35
|
+
## Темы и npm-скрипты
|
|
44
36
|
|
|
45
|
-
|
|
37
|
+
- **[`sample/`](sample/):**
|
|
38
|
+
- Минимальная учебная схема: `X1`, `C1`, `S1`, `D1`, `A1`
|
|
39
|
+
- `build-rsform` скрипт: `example:build-schema`
|
|
40
|
+
- `build-rsmodel` скрипт: `example:build-rsmodel`
|
|
41
|
+
|
|
42
|
+
- **[`kinship/`](kinship/):**
|
|
43
|
+
- «Родственные отношения» — развёрнутая предметная схема
|
|
44
|
+
- `build-rsform` скрипт: `example:build-kinship-schema`
|
|
45
|
+
- `build-rsmodel` скрипт: `example:build-kinship-rsmodel`
|
|
46
|
+
|
|
47
|
+
- **[`chocolate-nim/`](chocolate-nim/):**
|
|
48
|
+
- «Шоколадный Ним» — пример математической схемы без `X#`
|
|
49
|
+
- `build-rsform` скрипт: `example:build-chocolate-nim-schema`
|
|
50
|
+
- `build-rsmodel` скрипт: `example:build-chocolate-nim-rsmodel`
|
|
51
|
+
|
|
52
|
+
- **[`movd/`](movd/):**
|
|
53
|
+
- «МОВД» — пример предметной схемы со сложными `S#`, мультипроекциями и фильтрами
|
|
54
|
+
- `build-rsform` скрипт: `example:build-movd-schema`
|
|
55
|
+
- `build-rsmodel` скрипт: `example:build-movd-rsmodel`
|
|
56
|
+
|
|
57
|
+
- **[`expression-bank/`](expression-bank/):**
|
|
58
|
+
- «Банк выражений» (Portal rsforms/42) — шаблоны T1–T10 на радикалах `R1`–`R3` без `X#`
|
|
59
|
+
- `build-rsform` скрипт: `example:build-expression-bank-schema`
|
|
60
|
+
- только `rsform-session.json` (без модели)
|
|
61
|
+
|
|
62
|
+
- **[`template-apply/`](template-apply/):**
|
|
63
|
+
- Небольшая предметная схема: подстановка `R1→X1`, `R2→X2` для шаблонов БВ (F6, F20, P5)
|
|
64
|
+
- `build-rsform` скрипт: `example:build-template-apply-schema` (сборка + проверка на модели в скрипте)
|
|
65
|
+
- только `rsform-session.json`
|
|
66
|
+
|
|
67
|
+
В корне: [`agent-client.ts`](agent-client.ts) (`example:client`) — минимальный цикл через stdio без привязки к теме.
|
|
46
68
|
|
|
47
69
|
## Папка `kinship/`
|
|
48
70
|
|
|
49
|
-
|
|
71
|
+
Тот же макет, плюс интерактивное редактирование модели:
|
|
72
|
+
|
|
73
|
+
| Файл | Роль |
|
|
74
|
+
| -------------------------------------------------- | ------------------------------------------------------------------------- |
|
|
75
|
+
| [`session.ts`](kinship/session.ts) | Обёртка: загрузка/сохранение, команды над `X1` и `S1` |
|
|
76
|
+
| [`x1-actions.ts`](kinship/x1-actions.ts) | Парсинг и применение изменений списка людей |
|
|
77
|
+
| [`x1-actions.test.ts`](kinship/x1-actions.test.ts) | Тесты логики `X1` (`npm test`) |
|
|
78
|
+
| [`cli.ts`](kinship/cli.ts) | REPL (`kinship:cli`): `list`, `add`, `remove`, `rename`, `set`, `save`, … |
|
|
50
79
|
|
|
51
|
-
|
|
52
|
-
|------|------|
|
|
53
|
-
| [`constants.ts`](kinship/constants.ts) | Id конституент (X1, S1, D3, A1, …) и путь сессии по умолчанию |
|
|
54
|
-
| [`session.ts`](kinship/session.ts) | Обёртка над сессией: загрузка/сохранение, команды над X1 и S1 |
|
|
55
|
-
| [`x1-actions.ts`](kinship/x1-actions.ts) | Парсинг и применение изменений списка людей |
|
|
56
|
-
| [`x1-actions.test.ts`](kinship/x1-actions.test.ts) | Тесты логики X1 (`npm test`) |
|
|
57
|
-
| [`cli.ts`](kinship/cli.ts) | REPL: `list`, `add`, `remove`, `rename`, `set`, `save`, … |
|
|
80
|
+
По умолчанию CLI читает [`kinship/rsmodel-session.json`](kinship/rsmodel-session.json).
|
|
58
81
|
|
|
59
|
-
См. также [`../docs/CONSTITUENTA.md`](../docs/CONSTITUENTA.md)
|
|
82
|
+
См. также [`../docs/CONSTITUENTA.md`](../docs/CONSTITUENTA.md) и [`../docs/MODEL-TESTING.md`](../docs/MODEL-TESTING.md).
|
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
import { writeFile } from 'node:fs/promises';
|
|
2
|
+
import { resolve } from 'node:path';
|
|
3
|
+
|
|
4
|
+
import { CstType, RSToolWrapperClient, type AddOrUpdateConstituentaInput } from '../src';
|
|
5
|
+
|
|
6
|
+
import { DEFAULT_RSFORM_SESSION_PATH } from './chocolate-nim/constants';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Учебная RSForm «шоколадный Ним» (ОШК-НИМ) по Portal rsforms/825.
|
|
10
|
+
* Целочисленное представление без базисного множества: размеры и позиции — кортежи Z×Z.
|
|
11
|
+
*/
|
|
12
|
+
async function run() {
|
|
13
|
+
const client = new RSToolWrapperClient({
|
|
14
|
+
cwd: resolve(process.cwd())
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
try {
|
|
18
|
+
await client.waitUntilReady();
|
|
19
|
+
const session = await client.call<{ sessionId: string; contractVersion: string }>('createSession');
|
|
20
|
+
|
|
21
|
+
const drafts: AddOrUpdateConstituentaInput[] = [
|
|
22
|
+
{
|
|
23
|
+
draft: {
|
|
24
|
+
id: 1,
|
|
25
|
+
alias: 'S1',
|
|
26
|
+
cstType: CstType.STRUCTURED,
|
|
27
|
+
definitionFormal: 'Z×Z',
|
|
28
|
+
term: 'шоколадка',
|
|
29
|
+
convention: 'Первая проекция — ширина, вторая — длина'
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
draft: {
|
|
34
|
+
id: 2,
|
|
35
|
+
alias: 'D1',
|
|
36
|
+
cstType: CstType.TERM,
|
|
37
|
+
definitionFormal: 'pr1(S1)',
|
|
38
|
+
term: 'ширина шоколадки'
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
draft: {
|
|
43
|
+
id: 3,
|
|
44
|
+
alias: 'D2',
|
|
45
|
+
cstType: CstType.TERM,
|
|
46
|
+
definitionFormal: 'pr2(S1)',
|
|
47
|
+
term: 'длина шоколадки'
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
draft: {
|
|
52
|
+
id: 4,
|
|
53
|
+
alias: 'S2',
|
|
54
|
+
cstType: CstType.STRUCTURED,
|
|
55
|
+
definitionFormal: 'Z×Z',
|
|
56
|
+
term: 'отравленная долька',
|
|
57
|
+
convention: 'Координаты отравленной дольки: первая проекция по ширине, вторая — по длине'
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
draft: {
|
|
62
|
+
id: 5,
|
|
63
|
+
alias: 'D3',
|
|
64
|
+
cstType: CstType.TERM,
|
|
65
|
+
definitionFormal: 'pr1(S2)',
|
|
66
|
+
term: 'расположение отравленной дольки по ширине'
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
draft: {
|
|
71
|
+
id: 6,
|
|
72
|
+
alias: 'D4',
|
|
73
|
+
cstType: CstType.TERM,
|
|
74
|
+
definitionFormal: 'pr2(S2)',
|
|
75
|
+
term: 'расположение отравленной дольки по длине'
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
draft: {
|
|
80
|
+
id: 7,
|
|
81
|
+
alias: 'A1',
|
|
82
|
+
cstType: CstType.AXIOM,
|
|
83
|
+
definitionFormal: '(1≤D3)&(D3≤D1)&(1≤D4)&(D4≤D2)',
|
|
84
|
+
term: 'отравленная долька в шоколадке',
|
|
85
|
+
definitionText: 'Координаты отравленной дольки лежат в пределах шоколадки'
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
draft: {
|
|
90
|
+
id: 8,
|
|
91
|
+
alias: 'P1',
|
|
92
|
+
cstType: CstType.PREDICATE,
|
|
93
|
+
definitionFormal: '[α∈Z] R{ξ:=α | ξ≥2 | ξ-2}=0',
|
|
94
|
+
term: 'чётное?',
|
|
95
|
+
convention: 'Для малых аргументов — прямое вычитание двойки; для больших нужно двоичное представление'
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
draft: {
|
|
100
|
+
id: 9,
|
|
101
|
+
alias: 'F1',
|
|
102
|
+
cstType: CstType.FUNCTION,
|
|
103
|
+
definitionFormal: '[α∈Z, σ∈ℬ(Z×R1)] debool(Pr2(Fi1[{α}](σ)))',
|
|
104
|
+
term: 'значение элемента последовательности с данным номером',
|
|
105
|
+
definitionText: 'Значение пары с заданным номером в последовательности пар'
|
|
106
|
+
}
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
draft: {
|
|
110
|
+
id: 10,
|
|
111
|
+
alias: 'F2',
|
|
112
|
+
cstType: CstType.FUNCTION,
|
|
113
|
+
definitionFormal: '[σ∈ℬ(Z)] debool(D{ξ∈σ | ∀α∈σ α≤ξ})',
|
|
114
|
+
term: 'максимум набора чисел'
|
|
115
|
+
}
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
draft: {
|
|
119
|
+
id: 11,
|
|
120
|
+
alias: 'F4',
|
|
121
|
+
cstType: CstType.FUNCTION,
|
|
122
|
+
definitionFormal: '[σ∈ℬ(Z)] D{ξ∈σ | ∀α∈σ α≤ξ}',
|
|
123
|
+
term: 'верхние границы набора чисел',
|
|
124
|
+
definitionText: 'Множество элементов набора, не меньших всех остальных'
|
|
125
|
+
}
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
draft: {
|
|
129
|
+
id: 12,
|
|
130
|
+
alias: 'F5',
|
|
131
|
+
cstType: CstType.FUNCTION,
|
|
132
|
+
definitionFormal: '[α∈Z, β∈Z] debool(I{(α,0) | α<β} ∪ I{(α-β,1) | α≥β})',
|
|
133
|
+
term: 'деление с остатком на степень двойки',
|
|
134
|
+
convention: 'Предполагается, что удвоенный делитель больше делимого'
|
|
135
|
+
}
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
draft: {
|
|
139
|
+
id: 13,
|
|
140
|
+
alias: 'F6',
|
|
141
|
+
cstType: CstType.FUNCTION,
|
|
142
|
+
definitionFormal: '[α∈Z, β∈Z] pr1(F5[α, β])',
|
|
143
|
+
term: 'остаток'
|
|
144
|
+
}
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
draft: {
|
|
148
|
+
id: 14,
|
|
149
|
+
alias: 'F7',
|
|
150
|
+
cstType: CstType.FUNCTION,
|
|
151
|
+
definitionFormal: '[α∈Z, β∈Z] pr2(F5[α, β])',
|
|
152
|
+
term: 'целая часть'
|
|
153
|
+
}
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
draft: {
|
|
157
|
+
id: 15,
|
|
158
|
+
alias: 'D5',
|
|
159
|
+
cstType: CstType.TERM,
|
|
160
|
+
definitionFormal: '{(0, D3-1), (1, D4-1), (2, D1-D3), (3, D2-D4)}',
|
|
161
|
+
term: 'шоколадка как кучки Ним',
|
|
162
|
+
definitionText: 'Четыре кучки камней после разреза по отравленной дольке: слева, сверху, справа и снизу'
|
|
163
|
+
}
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
draft: {
|
|
167
|
+
id: 16,
|
|
168
|
+
alias: 'D6',
|
|
169
|
+
cstType: CstType.TERM,
|
|
170
|
+
definitionFormal: 'card(D5)',
|
|
171
|
+
term: 'количество кучек'
|
|
172
|
+
}
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
draft: {
|
|
176
|
+
id: 17,
|
|
177
|
+
alias: 'D7',
|
|
178
|
+
cstType: CstType.TERM,
|
|
179
|
+
definitionFormal: 'Pr1(D5)',
|
|
180
|
+
term: 'номера кучек'
|
|
181
|
+
}
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
draft: {
|
|
185
|
+
id: 18,
|
|
186
|
+
alias: 'D8',
|
|
187
|
+
cstType: CstType.TERM,
|
|
188
|
+
definitionFormal: 'Pr2(D5)',
|
|
189
|
+
term: 'размеры кучек'
|
|
190
|
+
}
|
|
191
|
+
},
|
|
192
|
+
{
|
|
193
|
+
draft: {
|
|
194
|
+
id: 19,
|
|
195
|
+
alias: 'A2',
|
|
196
|
+
cstType: CstType.AXIOM,
|
|
197
|
+
definitionFormal: 'card(D5)=card(D7)',
|
|
198
|
+
term: 'однозначность количества камней в кучках',
|
|
199
|
+
definitionText: 'У каждой кучки ровно один номер'
|
|
200
|
+
}
|
|
201
|
+
},
|
|
202
|
+
{
|
|
203
|
+
draft: {
|
|
204
|
+
id: 20,
|
|
205
|
+
alias: 'A3',
|
|
206
|
+
cstType: CstType.AXIOM,
|
|
207
|
+
definitionFormal: '∀α∈D5 (pr1(α)<D6 & pr1(α)≥0)',
|
|
208
|
+
term: 'последовательная нумерация кучек',
|
|
209
|
+
definitionText: 'Номера кучек — целые от нуля до количества кучек минус один'
|
|
210
|
+
}
|
|
211
|
+
},
|
|
212
|
+
{
|
|
213
|
+
draft: {
|
|
214
|
+
id: 21,
|
|
215
|
+
alias: 'F8',
|
|
216
|
+
cstType: CstType.FUNCTION,
|
|
217
|
+
definitionFormal: '[α∈Z] F1[α,D5]',
|
|
218
|
+
term: 'количество камней в данной кучке'
|
|
219
|
+
}
|
|
220
|
+
},
|
|
221
|
+
{
|
|
222
|
+
draft: {
|
|
223
|
+
id: 22,
|
|
224
|
+
alias: 'D9',
|
|
225
|
+
cstType: CstType.TERM,
|
|
226
|
+
definitionFormal: 'Pr1(Fi2[{0}](D5))',
|
|
227
|
+
term: 'пустые кучки',
|
|
228
|
+
definitionText: 'Номера кучек с нулевым размером'
|
|
229
|
+
}
|
|
230
|
+
},
|
|
231
|
+
{
|
|
232
|
+
draft: {
|
|
233
|
+
id: 23,
|
|
234
|
+
alias: 'D10',
|
|
235
|
+
cstType: CstType.TERM,
|
|
236
|
+
definitionFormal: 'D7\\D9',
|
|
237
|
+
term: 'непустые кучки',
|
|
238
|
+
definitionText: 'Номера кучек с положительным размером'
|
|
239
|
+
}
|
|
240
|
+
},
|
|
241
|
+
{
|
|
242
|
+
draft: {
|
|
243
|
+
id: 24,
|
|
244
|
+
alias: 'T1',
|
|
245
|
+
cstType: CstType.STATEMENT,
|
|
246
|
+
definitionFormal: 'D8={0}',
|
|
247
|
+
term: 'игра закончена',
|
|
248
|
+
definitionText: 'Во всех кучках не осталось камней'
|
|
249
|
+
}
|
|
250
|
+
},
|
|
251
|
+
{
|
|
252
|
+
draft: {
|
|
253
|
+
id: 25,
|
|
254
|
+
alias: 'T2',
|
|
255
|
+
cstType: CstType.STATEMENT,
|
|
256
|
+
definitionFormal: 'card(D10)=1',
|
|
257
|
+
term: 'существует выигрышный ход',
|
|
258
|
+
definitionText: 'Осталась ровно одна непустая кучка'
|
|
259
|
+
}
|
|
260
|
+
},
|
|
261
|
+
{
|
|
262
|
+
draft: {
|
|
263
|
+
id: 26,
|
|
264
|
+
alias: 'F10',
|
|
265
|
+
cstType: CstType.FUNCTION,
|
|
266
|
+
definitionFormal: '[σ∈D7×Z] debool(I{ pr2(σ)*D2 | P1[pr1(σ)]} ∪ I{ pr2(σ)*D1 | ¬P1[pr1(σ)]})',
|
|
267
|
+
term: 'оценка хода Ним',
|
|
268
|
+
definitionText:
|
|
269
|
+
'Стоимость хода в дольках шоколадки: для чётного номера кучки — размер, умноженный на длину, иначе — на ширину'
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
];
|
|
273
|
+
|
|
274
|
+
for (const input of drafts) {
|
|
275
|
+
const result = await client.call<{
|
|
276
|
+
state: { alias: string; analysis: { success: boolean } };
|
|
277
|
+
diagnostics: unknown[];
|
|
278
|
+
}>('addOrUpdateConstituenta', {
|
|
279
|
+
sessionId: session.sessionId,
|
|
280
|
+
input
|
|
281
|
+
});
|
|
282
|
+
const ok = result.state.analysis.success;
|
|
283
|
+
const diagCount = result.diagnostics?.length ?? 0;
|
|
284
|
+
console.log(`${input.draft.alias}: ${ok ? 'OK' : 'FAIL'} (${diagCount} diagnostics)`);
|
|
285
|
+
if (!ok) {
|
|
286
|
+
const diags = await client.call('listDiagnostics', { sessionId: session.sessionId });
|
|
287
|
+
console.log(JSON.stringify(diags, null, 2));
|
|
288
|
+
throw new Error(`${input.draft.alias}: analysis failed (${diagCount} diagnostics)`);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
await client.call('commitStep', {
|
|
293
|
+
sessionId: session.sessionId,
|
|
294
|
+
message: 'КС «шоколадный Ним» (rsforms/825): Z×Z, pr, P#, T#, арифметика, радикал R1'
|
|
295
|
+
});
|
|
296
|
+
|
|
297
|
+
const exported = await client.call<string>('exportSession', {
|
|
298
|
+
sessionId: session.sessionId
|
|
299
|
+
});
|
|
300
|
+
const outputPath = resolve(process.cwd(), DEFAULT_RSFORM_SESSION_PATH);
|
|
301
|
+
await writeFile(outputPath, exported, 'utf8');
|
|
302
|
+
console.log(`Exported: ${outputPath}`);
|
|
303
|
+
} finally {
|
|
304
|
+
await client.close();
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
run().catch(error => {
|
|
309
|
+
console.error(error);
|
|
310
|
+
process.exit(1);
|
|
311
|
+
});
|