@rsconcept/rstool 1.9.0 → 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 (105) hide show
  1. package/README.md +3 -3
  2. package/dist/mappers/model-adapter.d.ts +1 -2
  3. package/dist/mappers/schema-adapter.d.ts +1 -2
  4. package/dist/mappers/types.d.ts +4 -5
  5. package/dist/models/rstool-agent.js +1 -2
  6. package/dist/session/session-store.d.ts +3 -3
  7. package/dist/session/session-store.js +1 -2
  8. package/dist/wrapper/client.d.ts +3 -4
  9. package/docs/BRIEF.md +93 -0
  10. package/docs/CONCEPTUAL-SCHEMA.md +16 -1
  11. package/docs/CONSTRUCTIONS.md +14 -2
  12. package/docs/DIAGNOSTICS.md +3 -2
  13. package/docs/DOMAIN.md +12 -0
  14. package/docs/METHOD.md +208 -0
  15. package/docs/PORTAL-API.md +38 -285
  16. package/docs/PORTAL-MODELS.md +24 -0
  17. package/docs/PORTAL-OSS.md +56 -0
  18. package/docs/PORTAL-PUBLISH.md +39 -0
  19. package/docs/PORTAL-READ.md +301 -0
  20. package/docs/README.md +7 -4
  21. package/docs/REQUIREMENTS.md +61 -0
  22. package/docs/SYNTAX.md +4 -3
  23. package/docs/TYPIFICATION.md +1 -1
  24. package/docs/brief.schema.json +173 -0
  25. package/examples/README.md +16 -2
  26. package/examples/access-control/NOTES.md +23 -0
  27. package/examples/access-control/anti/collapsed.json +439 -0
  28. package/examples/access-control/anti/weakened.json +439 -0
  29. package/examples/access-control/brief-v1.json +231 -0
  30. package/examples/access-control/brief.json +310 -0
  31. package/examples/access-control/build-rsform.ts +151 -0
  32. package/examples/access-control/requirements-v1.md +9 -0
  33. package/examples/access-control/requirements-v2.md +4 -0
  34. package/examples/access-control/rsform-session-v1.json +439 -0
  35. package/examples/access-control/rsform-session.json +523 -0
  36. package/examples/audit-diagnostics.ts +9 -1
  37. package/examples/briefs.test.ts +126 -0
  38. package/examples/clinic-booking/NOTES.md +24 -0
  39. package/examples/clinic-booking/anti/collapsed.json +615 -0
  40. package/examples/clinic-booking/anti/species-as-genus.json +568 -0
  41. package/examples/clinic-booking/brief-v1.json +332 -0
  42. package/examples/clinic-booking/brief.json +405 -0
  43. package/examples/clinic-booking/build-rsform.ts +174 -0
  44. package/examples/clinic-booking/requirements-v1.md +9 -0
  45. package/examples/clinic-booking/requirements-v2.md +4 -0
  46. package/examples/clinic-booking/rsform-session-v1.json +615 -0
  47. package/examples/clinic-booking/rsform-session.json +700 -0
  48. package/examples/diagnostics-utils.ts +26 -0
  49. package/examples/kinship/brief.json +337 -0
  50. package/examples/kinship/build-rsform.ts +7 -4
  51. package/examples/kinship/rsform-session.json +20 -63
  52. package/examples/kinship/rsmodel-session.json +14 -14
  53. package/examples/kinship-subordination/NOTES.md +49 -0
  54. package/examples/kinship-subordination/brief.json +161 -0
  55. package/examples/kinship-subordination/build-rsform.ts +100 -0
  56. package/examples/kinship-subordination/rsform-session.json +795 -0
  57. package/examples/library-loans/NOTES.md +46 -0
  58. package/examples/library-loans/anti/collapsed.json +481 -0
  59. package/examples/library-loans/anti/species-as-genus.json +334 -0
  60. package/examples/library-loans/anti/uncovered.json +406 -0
  61. package/examples/library-loans/anti/weakened.json +464 -0
  62. package/examples/library-loans/brief-v1.json +340 -0
  63. package/examples/library-loans/brief.json +502 -0
  64. package/examples/library-loans/build-rsform.ts +239 -0
  65. package/examples/library-loans/requirements-v1.md +11 -0
  66. package/examples/library-loans/requirements-v2.md +5 -0
  67. package/examples/library-loans/rsform-session-v1.json +481 -0
  68. package/examples/library-loans/rsform-session.json +652 -0
  69. package/examples/library-loans/source-markup.md +18 -0
  70. package/examples/movd/brief.json +220 -0
  71. package/examples/movd/build-rsform.ts +5 -2
  72. package/examples/movd/rsform-session.json +14 -46
  73. package/examples/subordination/NOTES.md +59 -0
  74. package/examples/subordination/anti/collapsed.json +556 -0
  75. package/examples/subordination/anti/single-relation.json +125 -0
  76. package/examples/subordination/anti/transitive.json +573 -0
  77. package/examples/subordination/anti/weakened.json +539 -0
  78. package/examples/subordination/brief.json +386 -0
  79. package/examples/subordination/build-rsform.ts +63 -0
  80. package/examples/subordination/constants.ts +115 -0
  81. package/examples/subordination/rsform-session.json +556 -0
  82. package/examples/subordination/source-markup.md +19 -0
  83. package/examples/subordination/source.md +40 -0
  84. package/package.json +18 -10
  85. package/skills/INSTALL.md +28 -29
  86. package/skills/README.md +25 -10
  87. package/skills/rs-core/SKILL.md +56 -0
  88. package/skills/rs-explain/SKILL.md +28 -0
  89. package/skills/rs-explicate/SKILL.md +71 -0
  90. package/skills/rs-interpret/SKILL.md +67 -0
  91. package/skills/rs-portal/SKILL.md +51 -0
  92. package/skills/rs-review/SKILL.md +79 -0
  93. package/skills/rs-scope/SKILL.md +67 -0
  94. package/skills/rs-synthesis/SKILL.md +52 -0
  95. package/skills/rstool/SKILL.md +70 -0
  96. package/skills/rstool-helper/GUIDE.md +18 -299
  97. package/skills/rstool-helper/SKILL.md +8 -58
  98. package/skills/{rstool-helper → rstool-runtime}/EXAMPLES.md +16 -12
  99. package/skills/{rstool-helper → rstool-runtime}/REFERENCE.md +7 -5
  100. package/skills/rstool-runtime/SKILL.md +96 -0
  101. package/skills/scripts/brief-check.test.ts +165 -0
  102. package/skills/scripts/brief-check.ts +826 -0
  103. package/skills/scripts/check-brief.ts +94 -0
  104. package/skills/scripts/rstool-skills.mjs +119 -0
  105. package/skills/scripts/skill-stubs.test.ts +48 -0
@@ -0,0 +1,24 @@
1
+ # «Запись к врачу»: слоты, записи и приёмы
2
+
3
+ Пример по требованиям к ПО: v1 — слоты врачей, записи и состоявшиеся приёмы; v2 — повторные записи. Метод — [`docs/METHOD.md`](../../docs/METHOD.md); требования → бриф — [`docs/REQUIREMENTS.md`](../../docs/REQUIREMENTS.md).
4
+
5
+ Файлы: [`requirements-v1.md`](requirements-v1.md), [`requirements-v2.md`](requirements-v2.md), [`brief-v1.json`](brief-v1.json), [`brief.json`](brief.json), [`build-rsform.ts`](build-rsform.ts), сессии v1 и v2, [`anti/`](anti/).
6
+
7
+ ## Главные решения
8
+
9
+ - **Слот — сущность (`DC1`).** Кортеж (врач, день, начало, конец) пришлось бы повторять в каждой записи и приёме; слот `X4` с отношениями «врач слота» и «время слота» плюс аксиома однозначности `A3`.
10
+ - **Время — целые (`DC2`).** Пересечение слотов требует сравнения: день и минуты — `Z`. Предикат `P1` «слоты пересекаются» обособлен, им пользуются и правило врача (`A2`), и доступность для пациента (`F4`). Стык отрезков (570 и 570) — не пересечение; это проверяет сценарий `SC1`.
11
+ - **Запись ≠ приём (`DC3`).** Приём — отдельная структура `S5 ⊆ S4`: пациент может не прийти.
12
+ - **«Сирота» — сигнал.** Первая версия не использовала специальности врача (п. 1), и `check-brief` показал `X2`, `S1` вне путей к требованиям. Решение — требование `E8` и аксиома `A7`, а не удаление пункта ТЗ.
13
+ - **Отсутствие правила — открытый вопрос.** Должна ли запись соответствовать специальности? В требованиях этого нет: `DC4` «без аксиомы» и вопрос в `openQuestions`.
14
+
15
+ ## v2
16
+
17
+ Повторные записи — структура `S6 ⊆ S4`; первичные — остаток (`DC5`), поэтому разбиение полное по построению. Правило «повторная — к знакомому врачу» опирается на приёмы `S5`, а не на записи: записаться — не значит побывать.
18
+
19
+ ## Антипримеры
20
+
21
+ | Снимок | Ошибка | Что ловит |
22
+ | :---------------------------------------------------- | :---------------------------------------------------------------- | :---------------------------------------------------- |
23
+ | [`collapsed.json`](anti/collapsed.json) | доступные пациенту = свободные минус свои записи, без пересечений | `SC1`: `s3` пересекается с `s1`, но попал в доступные |
24
+ | [`species-as-genus.json`](anti/species-as-genus.json) | приём не отличается от записи (`S5` нет) | `E4`, `I5` не выражены; различение `V2` |
@@ -0,0 +1,615 @@
1
+ {
2
+ "contractVersion": "3.3.0",
3
+ "state": {
4
+ "sessionId": "6e5419d1-5fbb-4de1-817f-ab1f9da9f902",
5
+ "alias": "CLINIC",
6
+ "title": "Антипример: collapsed",
7
+ "comment": "Запись пациентов на приём к врачу. Эксплицировать слоты, записи и приёмы для проектирования модуля записи и его проверок.\nL1. Исключено: уведомления (п. 6); невыразимо: отправленное напоминание.\nL2. Исключено: оплата (п. 7); невыразимо: оплаченный приём, стоимость.\nL3. Исключено: отмены и история записей; невыразимо: отменённая запись, неявка в прошлом месяце.\nDC1. слот: X4 и структуры S2, S3 — на слот ссылаются записи и приёмы; кортеж-слот пришлось бы повторять в каждой паре.\nDC2. время: день и минуты как Z — пересечение требует порядка и сравнения; календарные даты исключены (L3).\nDC3. приём: S5 и аксиома A5 — запись ≠ приём (п. 5): пациент может не прийти.\nDC4. специальность записи: без аксиомы — в требованиях нет правила о специальности при записи.",
8
+ "createdAt": "2026-10-25T18:34:36.435Z",
9
+ "updatedAt": "2026-10-25T18:34:36.443Z",
10
+ "revisions": [
11
+ {
12
+ "revisionId": "0b159acd-d152-4b97-b708-96c1f3cfae9c",
13
+ "at": "2026-10-25T18:34:36.443Z",
14
+ "message": "Антипример: collapsed: шаг 1"
15
+ }
16
+ ],
17
+ "items": [
18
+ {
19
+ "id": 1,
20
+ "alias": "X1",
21
+ "cstType": "basic",
22
+ "definitionFormal": "",
23
+ "term": "врачи",
24
+ "definitionText": "",
25
+ "convention": "Врачи клиники.",
26
+ "analysis": {
27
+ "success": true,
28
+ "type": {
29
+ "typeID": 5,
30
+ "base": {
31
+ "typeID": 3,
32
+ "baseID": "X1"
33
+ }
34
+ },
35
+ "valueClass": "value",
36
+ "diagnostics": []
37
+ }
38
+ },
39
+ {
40
+ "id": 2,
41
+ "alias": "X2",
42
+ "cstType": "basic",
43
+ "definitionFormal": "",
44
+ "term": "специальности",
45
+ "definitionText": "",
46
+ "convention": "Врачебные специальности (терапевт, хирург, …).",
47
+ "analysis": {
48
+ "success": true,
49
+ "type": {
50
+ "typeID": 5,
51
+ "base": {
52
+ "typeID": 3,
53
+ "baseID": "X2"
54
+ }
55
+ },
56
+ "valueClass": "value",
57
+ "diagnostics": []
58
+ }
59
+ },
60
+ {
61
+ "id": 3,
62
+ "alias": "X3",
63
+ "cstType": "basic",
64
+ "definitionFormal": "",
65
+ "term": "пациенты",
66
+ "definitionText": "",
67
+ "convention": "Пациенты, зарегистрированные в клинике.",
68
+ "analysis": {
69
+ "success": true,
70
+ "type": {
71
+ "typeID": 5,
72
+ "base": {
73
+ "typeID": 3,
74
+ "baseID": "X3"
75
+ }
76
+ },
77
+ "valueClass": "value",
78
+ "diagnostics": []
79
+ }
80
+ },
81
+ {
82
+ "id": 4,
83
+ "alias": "X4",
84
+ "cstType": "basic",
85
+ "definitionFormal": "",
86
+ "term": "слоты",
87
+ "definitionText": "",
88
+ "convention": "Слоты приёма: отрезок времени конкретного врача в конкретный день.",
89
+ "analysis": {
90
+ "success": true,
91
+ "type": {
92
+ "typeID": 5,
93
+ "base": {
94
+ "typeID": 3,
95
+ "baseID": "X4"
96
+ }
97
+ },
98
+ "valueClass": "value",
99
+ "diagnostics": []
100
+ }
101
+ },
102
+ {
103
+ "id": 5,
104
+ "alias": "S1",
105
+ "cstType": "structure",
106
+ "definitionFormal": "ℬ(X1×X2)",
107
+ "term": "специальности врача",
108
+ "definitionText": "",
109
+ "convention": "Пара (врач, специальность).",
110
+ "analysis": {
111
+ "success": true,
112
+ "type": {
113
+ "typeID": 5,
114
+ "base": {
115
+ "typeID": 4,
116
+ "factors": [
117
+ {
118
+ "typeID": 3,
119
+ "baseID": "X1"
120
+ },
121
+ {
122
+ "typeID": 3,
123
+ "baseID": "X2"
124
+ }
125
+ ]
126
+ }
127
+ },
128
+ "valueClass": "value",
129
+ "diagnostics": []
130
+ }
131
+ },
132
+ {
133
+ "id": 6,
134
+ "alias": "S2",
135
+ "cstType": "structure",
136
+ "definitionFormal": "ℬ(X4×X1)",
137
+ "term": "врач слота",
138
+ "definitionText": "",
139
+ "convention": "Пара (слот, врач): врач ведёт приём в слоте.",
140
+ "analysis": {
141
+ "success": true,
142
+ "type": {
143
+ "typeID": 5,
144
+ "base": {
145
+ "typeID": 4,
146
+ "factors": [
147
+ {
148
+ "typeID": 3,
149
+ "baseID": "X4"
150
+ },
151
+ {
152
+ "typeID": 3,
153
+ "baseID": "X1"
154
+ }
155
+ ]
156
+ }
157
+ },
158
+ "valueClass": "value",
159
+ "diagnostics": []
160
+ }
161
+ },
162
+ {
163
+ "id": 7,
164
+ "alias": "S3",
165
+ "cstType": "structure",
166
+ "definitionFormal": "ℬ(X4×Z×Z×Z)",
167
+ "term": "время слота",
168
+ "definitionText": "",
169
+ "convention": "Четвёрка (слот, день, начало, конец); начало и конец — минуты от начала дня.",
170
+ "analysis": {
171
+ "success": true,
172
+ "type": {
173
+ "typeID": 5,
174
+ "base": {
175
+ "typeID": 4,
176
+ "factors": [
177
+ {
178
+ "typeID": 3,
179
+ "baseID": "X4"
180
+ },
181
+ {
182
+ "typeID": 2,
183
+ "isOrdered": true,
184
+ "isArithmetic": true,
185
+ "isIntegerCompatible": true
186
+ },
187
+ {
188
+ "typeID": 2,
189
+ "isOrdered": true,
190
+ "isArithmetic": true,
191
+ "isIntegerCompatible": true
192
+ },
193
+ {
194
+ "typeID": 2,
195
+ "isOrdered": true,
196
+ "isArithmetic": true,
197
+ "isIntegerCompatible": true
198
+ }
199
+ ]
200
+ }
201
+ },
202
+ "valueClass": "value",
203
+ "diagnostics": []
204
+ }
205
+ },
206
+ {
207
+ "id": 8,
208
+ "alias": "S4",
209
+ "cstType": "structure",
210
+ "definitionFormal": "ℬ(X3×X4)",
211
+ "term": "записи",
212
+ "definitionText": "",
213
+ "convention": "Пара (пациент, слот): пациент записан на слот.",
214
+ "analysis": {
215
+ "success": true,
216
+ "type": {
217
+ "typeID": 5,
218
+ "base": {
219
+ "typeID": 4,
220
+ "factors": [
221
+ {
222
+ "typeID": 3,
223
+ "baseID": "X3"
224
+ },
225
+ {
226
+ "typeID": 3,
227
+ "baseID": "X4"
228
+ }
229
+ ]
230
+ }
231
+ },
232
+ "valueClass": "value",
233
+ "diagnostics": []
234
+ }
235
+ },
236
+ {
237
+ "id": 9,
238
+ "alias": "S5",
239
+ "cstType": "structure",
240
+ "definitionFormal": "ℬ(X3×X4)",
241
+ "term": "состоявшиеся приёмы",
242
+ "definitionText": "",
243
+ "convention": "Пара (пациент, слот): пациент пришёл на приём по записи.",
244
+ "analysis": {
245
+ "success": true,
246
+ "type": {
247
+ "typeID": 5,
248
+ "base": {
249
+ "typeID": 4,
250
+ "factors": [
251
+ {
252
+ "typeID": 3,
253
+ "baseID": "X3"
254
+ },
255
+ {
256
+ "typeID": 3,
257
+ "baseID": "X4"
258
+ }
259
+ ]
260
+ }
261
+ },
262
+ "valueClass": "value",
263
+ "diagnostics": []
264
+ }
265
+ },
266
+ {
267
+ "id": 10,
268
+ "alias": "F1",
269
+ "cstType": "function",
270
+ "definitionFormal": "[σ∈X4] Pr2,3,4(Fi1[{σ}](S3))",
271
+ "term": "время",
272
+ "definitionText": "День, начало и конец данного слота.",
273
+ "convention": "",
274
+ "analysis": {
275
+ "success": true,
276
+ "type": {
277
+ "typeID": 7,
278
+ "result": {
279
+ "typeID": 5,
280
+ "base": {
281
+ "typeID": 4,
282
+ "factors": [
283
+ {
284
+ "typeID": 2,
285
+ "isOrdered": true,
286
+ "isArithmetic": true,
287
+ "isIntegerCompatible": true
288
+ },
289
+ {
290
+ "typeID": 2,
291
+ "isOrdered": true,
292
+ "isArithmetic": true,
293
+ "isIntegerCompatible": true
294
+ },
295
+ {
296
+ "typeID": 2,
297
+ "isOrdered": true,
298
+ "isArithmetic": true,
299
+ "isIntegerCompatible": true
300
+ }
301
+ ]
302
+ }
303
+ },
304
+ "args": [
305
+ {
306
+ "alias": "σ",
307
+ "type": {
308
+ "typeID": 3,
309
+ "baseID": "X4"
310
+ }
311
+ }
312
+ ]
313
+ },
314
+ "valueClass": "value",
315
+ "diagnostics": []
316
+ }
317
+ },
318
+ {
319
+ "id": 11,
320
+ "alias": "P1",
321
+ "cstType": "predicate",
322
+ "definitionFormal": "[σ∈X4, τ∈X4] σ≠τ & ∃(d1,b1,e1)∈F1[σ] ∃(d2,b2,e2)∈F1[τ] (d1=d2 & b1<e2 & b2<e1)",
323
+ "term": "слоты пересекаются",
324
+ "definitionText": "Два разных слота в один день перекрываются по времени.",
325
+ "convention": "",
326
+ "analysis": {
327
+ "success": true,
328
+ "type": {
329
+ "typeID": 8,
330
+ "result": {
331
+ "typeID": 6
332
+ },
333
+ "args": [
334
+ {
335
+ "alias": "σ",
336
+ "type": {
337
+ "typeID": 3,
338
+ "baseID": "X4"
339
+ }
340
+ },
341
+ {
342
+ "alias": "τ",
343
+ "type": {
344
+ "typeID": 3,
345
+ "baseID": "X4"
346
+ }
347
+ }
348
+ ]
349
+ },
350
+ "valueClass": "value",
351
+ "diagnostics": []
352
+ }
353
+ },
354
+ {
355
+ "id": 12,
356
+ "alias": "F2",
357
+ "cstType": "function",
358
+ "definitionFormal": "[δ∈X1] Pr1(Fi2[{δ}](S2))",
359
+ "term": "слоты врача",
360
+ "definitionText": "Слоты, в которых ведёт приём данный врач.",
361
+ "convention": "",
362
+ "analysis": {
363
+ "success": true,
364
+ "type": {
365
+ "typeID": 7,
366
+ "result": {
367
+ "typeID": 5,
368
+ "base": {
369
+ "typeID": 3,
370
+ "baseID": "X4"
371
+ }
372
+ },
373
+ "args": [
374
+ {
375
+ "alias": "δ",
376
+ "type": {
377
+ "typeID": 3,
378
+ "baseID": "X1"
379
+ }
380
+ }
381
+ ]
382
+ },
383
+ "valueClass": "value",
384
+ "diagnostics": []
385
+ }
386
+ },
387
+ {
388
+ "id": 13,
389
+ "alias": "D1",
390
+ "cstType": "term",
391
+ "definitionFormal": "X4\\Pr2(S4)",
392
+ "term": "свободные слоты",
393
+ "definitionText": "Слоты без записи.",
394
+ "convention": "",
395
+ "analysis": {
396
+ "success": true,
397
+ "type": {
398
+ "typeID": 5,
399
+ "base": {
400
+ "typeID": 3,
401
+ "baseID": "X4"
402
+ }
403
+ },
404
+ "valueClass": "value",
405
+ "diagnostics": []
406
+ }
407
+ },
408
+ {
409
+ "id": 14,
410
+ "alias": "F3",
411
+ "cstType": "function",
412
+ "definitionFormal": "[π∈X3] Pr2(Fi1[{π}](S4))",
413
+ "term": "слоты записей пациента",
414
+ "definitionText": "Слоты, на которые записан данный пациент.",
415
+ "convention": "",
416
+ "analysis": {
417
+ "success": true,
418
+ "type": {
419
+ "typeID": 7,
420
+ "result": {
421
+ "typeID": 5,
422
+ "base": {
423
+ "typeID": 3,
424
+ "baseID": "X4"
425
+ }
426
+ },
427
+ "args": [
428
+ {
429
+ "alias": "π",
430
+ "type": {
431
+ "typeID": 3,
432
+ "baseID": "X3"
433
+ }
434
+ }
435
+ ]
436
+ },
437
+ "valueClass": "value",
438
+ "diagnostics": []
439
+ }
440
+ },
441
+ {
442
+ "id": 15,
443
+ "alias": "F4",
444
+ "cstType": "function",
445
+ "definitionFormal": "[π∈X3] D1\\F3[π]",
446
+ "term": "слоты, доступные пациенту",
447
+ "definitionText": "Свободные слоты, которые не пересекаются с другими записями пациента.",
448
+ "convention": "",
449
+ "analysis": {
450
+ "success": true,
451
+ "type": {
452
+ "typeID": 7,
453
+ "result": {
454
+ "typeID": 5,
455
+ "base": {
456
+ "typeID": 3,
457
+ "baseID": "X4"
458
+ }
459
+ },
460
+ "args": [
461
+ {
462
+ "alias": "π",
463
+ "type": {
464
+ "typeID": 3,
465
+ "baseID": "X3"
466
+ }
467
+ }
468
+ ]
469
+ },
470
+ "valueClass": "value",
471
+ "diagnostics": []
472
+ }
473
+ },
474
+ {
475
+ "id": 16,
476
+ "alias": "A1",
477
+ "cstType": "axiom",
478
+ "definitionFormal": "card(Pr2(S4))=card(S4)",
479
+ "term": "одна запись на слот",
480
+ "definitionText": "п. 3.",
481
+ "convention": "",
482
+ "analysis": {
483
+ "success": true,
484
+ "type": {
485
+ "typeID": 6
486
+ },
487
+ "valueClass": "value",
488
+ "diagnostics": []
489
+ }
490
+ },
491
+ {
492
+ "id": 17,
493
+ "alias": "A2",
494
+ "cstType": "axiom",
495
+ "definitionFormal": "∀δ∈X1 ∀σ,τ∈F2[δ] ¬P1[σ,τ]",
496
+ "term": "слоты врача не пересекаются",
497
+ "definitionText": "п. 2.",
498
+ "convention": "",
499
+ "analysis": {
500
+ "success": true,
501
+ "type": {
502
+ "typeID": 6
503
+ },
504
+ "valueClass": "value",
505
+ "diagnostics": []
506
+ }
507
+ },
508
+ {
509
+ "id": 18,
510
+ "alias": "A3",
511
+ "cstType": "axiom",
512
+ "definitionFormal": "card(S2)=card(Pr1(S2)) & Pr1(S2)=X4 & card(S3)=card(Pr1(S3)) & Pr1(S3)=X4",
513
+ "term": "у слота один врач и одно время",
514
+ "definitionText": "Каждый слот принадлежит ровно одному врачу и имеет ровно одно время.",
515
+ "convention": "",
516
+ "analysis": {
517
+ "success": true,
518
+ "type": {
519
+ "typeID": 6
520
+ },
521
+ "valueClass": "value",
522
+ "diagnostics": []
523
+ }
524
+ },
525
+ {
526
+ "id": 19,
527
+ "alias": "A4",
528
+ "cstType": "axiom",
529
+ "definitionFormal": "∀σ∈S3 pr3(σ)<pr4(σ)",
530
+ "term": "начало раньше конца",
531
+ "definitionText": "У слота положительная длительность.",
532
+ "convention": "",
533
+ "analysis": {
534
+ "success": true,
535
+ "type": {
536
+ "typeID": 6
537
+ },
538
+ "valueClass": "value",
539
+ "diagnostics": []
540
+ }
541
+ },
542
+ {
543
+ "id": 20,
544
+ "alias": "A5",
545
+ "cstType": "axiom",
546
+ "definitionFormal": "S5⊆S4",
547
+ "term": "приём только по записи",
548
+ "definitionText": "п. 5.",
549
+ "convention": "",
550
+ "analysis": {
551
+ "success": true,
552
+ "type": {
553
+ "typeID": 6
554
+ },
555
+ "valueClass": "value",
556
+ "diagnostics": []
557
+ }
558
+ },
559
+ {
560
+ "id": 21,
561
+ "alias": "F6",
562
+ "cstType": "function",
563
+ "definitionFormal": "[δ∈X1] Pr2(Fi1[{δ}](S1))",
564
+ "term": "специальности данного врача",
565
+ "definitionText": "Специальности, по которым ведёт приём данный врач.",
566
+ "convention": "",
567
+ "analysis": {
568
+ "success": true,
569
+ "type": {
570
+ "typeID": 7,
571
+ "result": {
572
+ "typeID": 5,
573
+ "base": {
574
+ "typeID": 3,
575
+ "baseID": "X2"
576
+ }
577
+ },
578
+ "args": [
579
+ {
580
+ "alias": "δ",
581
+ "type": {
582
+ "typeID": 3,
583
+ "baseID": "X1"
584
+ }
585
+ }
586
+ ]
587
+ },
588
+ "valueClass": "value",
589
+ "diagnostics": []
590
+ }
591
+ },
592
+ {
593
+ "id": 22,
594
+ "alias": "A7",
595
+ "cstType": "axiom",
596
+ "definitionFormal": "∀δ∈X1 F6[δ]≠∅",
597
+ "term": "у врача есть специальность",
598
+ "definitionText": "п. 1: у врача одна или несколько специальностей.",
599
+ "convention": "",
600
+ "analysis": {
601
+ "success": true,
602
+ "type": {
603
+ "typeID": 6
604
+ },
605
+ "valueClass": "value",
606
+ "diagnostics": []
607
+ }
608
+ }
609
+ ],
610
+ "model": {
611
+ "items": []
612
+ }
613
+ },
614
+ "diagnostics": []
615
+ }