From fba16a3d0b576248a91a2b175c3715ac1c8831d8 Mon Sep 17 00:00:00 2001 From: IRBorisov <8611739+IRBorisov@users.noreply.github.com> Date: Fri, 25 Aug 2023 22:51:20 +0300 Subject: [PATCH] Change data model and refactor backend --- rsconcept/RunServer.ps1 | 7 +- rsconcept/backend/apps/rsform/admin.py | 6 +- .../apps/rsform/migrations/0001_initial.py | 20 +- rsconcept/backend/apps/rsform/models.py | 255 +- rsconcept/backend/apps/rsform/serializers.py | 83 +- .../backend/apps/rsform/tests/t_models.py | 98 +- .../backend/apps/rsform/tests/t_views.py | 343 +- rsconcept/backend/apps/rsform/urls.py | 9 +- rsconcept/backend/apps/rsform/utils.py | 10 +- rsconcept/backend/apps/rsform/views.py | 210 +- rsconcept/backend/fixtures/InitialData.json | 10513 ++++++++++++++++ .../load_commons.py} | 9 +- .../frontend/src/context/LibraryContext.tsx | 26 +- .../frontend/src/context/RSFormContext.tsx | 54 +- .../frontend/src/pages/CreateRSFormPage.tsx | 4 +- .../src/pages/LibraryPage/ViewLibrary.tsx | 34 +- .../frontend/src/pages/LibraryPage/index.tsx | 6 +- .../src/pages/RSFormPage/DlgCloneRSForm.tsx | 14 +- .../src/pages/RSFormPage/EditorRSForm.tsx | 65 +- .../frontend/src/pages/RSFormPage/RSTabs.tsx | 38 +- .../src/pages/RSFormPage/RSTabsMenu.tsx | 41 +- rsconcept/frontend/src/utils/backendAPI.ts | 27 +- rsconcept/frontend/src/utils/models.ts | 42 +- rsconcept/frontend/src/utils/procedures.ts | 34 - 24 files changed, 11336 insertions(+), 612 deletions(-) create mode 100644 rsconcept/backend/fixtures/InitialData.json rename rsconcept/backend/{apps/rsform/migrations/0002_load_commons.py => fixtures/load_commons.py} (78%) delete mode 100644 rsconcept/frontend/src/utils/procedures.ts diff --git a/rsconcept/RunServer.ps1 b/rsconcept/RunServer.ps1 index 46d7b72d..7b51b6b5 100644 --- a/rsconcept/RunServer.ps1 +++ b/rsconcept/RunServer.ps1 @@ -5,6 +5,7 @@ Param( $pyExec = "$PSScriptRoot\backend\venv\Scripts\python.exe" $djangoSrc = "$PSScriptRoot\backend\manage.py" +$initialData = "fixtures/InitialData.json" function RunServer() { RunBackend @@ -20,6 +21,7 @@ function RunBackend() { FlushData DoMigrations PrepareStatic -clearPrevious + AddInitialData AddAdmin } else { DoMigrations @@ -35,13 +37,16 @@ function RunFrontend() { } function FlushData { - & $pyExec $djangoSrc flush --no-input\ + & $pyExec $djangoSrc flush --noinput $dbPath = "$PSScriptRoot\backend\db.sqlite3" if (Test-Path -Path $dbPath -PathType Leaf) { Remove-Item $dbPath } } +function AddInitialData { + & $pyExec manage.py loaddata $initialData +} function AddAdmin { $env:DJANGO_SUPERUSER_USERNAME = 'admin' $env:DJANGO_SUPERUSER_PASSWORD = '1234' diff --git a/rsconcept/backend/apps/rsform/admin.py b/rsconcept/backend/apps/rsform/admin.py index c3d4ecbe..b4d370d6 100644 --- a/rsconcept/backend/apps/rsform/admin.py +++ b/rsconcept/backend/apps/rsform/admin.py @@ -8,9 +8,9 @@ class ConstituentaAdmin(admin.ModelAdmin): ''' Admin model: Constituenta. ''' -class RSFormAdmin(admin.ModelAdmin): - ''' Admin model: RSForm. ''' +class Librarydmin(admin.ModelAdmin): + ''' Admin model: LibraryItem. ''' admin.site.register(models.Constituenta, ConstituentaAdmin) -admin.site.register(models.RSForm, RSFormAdmin) +admin.site.register(models.LibraryItem, Librarydmin) diff --git a/rsconcept/backend/apps/rsform/migrations/0001_initial.py b/rsconcept/backend/apps/rsform/migrations/0001_initial.py index a484560c..3ab27367 100644 --- a/rsconcept/backend/apps/rsform/migrations/0001_initial.py +++ b/rsconcept/backend/apps/rsform/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 4.2.3 on 2023-07-26 15:19 +# Generated by Django 4.2.4 on 2023-08-25 12:15 import apps.rsform.models from django.conf import settings @@ -17,13 +17,15 @@ class Migration(migrations.Migration): operations = [ migrations.CreateModel( - name='RSForm', + name='LibraryItem', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('item_type', models.CharField(choices=[('rsform', 'Rsform'), ('oss', 'Operations Schema')], max_length=50, verbose_name='Тип')), ('title', models.TextField(verbose_name='Название')), ('alias', models.CharField(blank=True, max_length=255, verbose_name='Шифр')), ('comment', models.TextField(blank=True, verbose_name='Комментарий')), ('is_common', models.BooleanField(default=False, verbose_name='Общая')), + ('is_canonical', models.BooleanField(default=False, verbose_name='Каноничная')), ('time_create', models.DateTimeField(auto_now_add=True, verbose_name='Дата создания')), ('time_update', models.DateTimeField(auto_now=True, verbose_name='Дата изменения')), ('owner', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='Владелец')), @@ -33,6 +35,18 @@ class Migration(migrations.Migration): 'verbose_name_plural': 'Схемы', }, ), + migrations.CreateModel( + name='Subscription', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('item', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rsform.libraryitem', verbose_name='Элемент')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Пользователь')), + ], + options={ + 'verbose_name': 'Подписки', + 'verbose_name_plural': 'Подписка', + }, + ), migrations.CreateModel( name='Constituenta', fields=[ @@ -47,7 +61,7 @@ class Migration(migrations.Migration): ('definition_formal', models.TextField(blank=True, default='', verbose_name='Родоструктурное определение')), ('definition_raw', models.TextField(blank=True, default='', verbose_name='Текстовое определние (с отсылками)')), ('definition_resolved', models.TextField(blank=True, default='', verbose_name='Текстовое определние')), - ('schema', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rsform.rsform', verbose_name='Концептуальная схема')), + ('schema', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='rsform.libraryitem', verbose_name='Концептуальная схема')), ], options={ 'verbose_name': 'Конституета', diff --git a/rsconcept/backend/apps/rsform/models.py b/rsconcept/backend/apps/rsform/models.py index 754c432d..6fac23de 100644 --- a/rsconcept/backend/apps/rsform/models.py +++ b/rsconcept/backend/apps/rsform/models.py @@ -24,6 +24,12 @@ _REF_ENTITY_PATTERN = re.compile(r'@{([^0-9\-].*?)\|.*?}') _GLOBAL_ID_PATTERN = re.compile(r'([XCSADFPT][0-9]+)') +class LibraryItemType(TextChoices): + ''' Type of library items ''' + RSFORM = 'rsform' + OPERATIONS_SCHEMA = 'oss' + + class CstType(TextChoices): ''' Type of constituenta ''' BASE = 'basic' @@ -67,8 +73,14 @@ def _get_type_prefix(cst_type: CstType) -> str: return 'X' -class RSForm(Model): - ''' RSForm is a math form of capturing conceptual schema ''' +class LibraryItem(Model): + ''' Abstract library item. + Please use wrappers below to access functionality. ''' + item_type: CharField = CharField( + verbose_name='Тип', + max_length=50, + choices=LibraryItemType.choices + ) owner: ForeignKey = ForeignKey( verbose_name='Владелец', to=User, @@ -91,6 +103,10 @@ class RSForm(Model): verbose_name='Общая', default=False ) + is_canonical: BooleanField = BooleanField( + verbose_name='Каноничная', + default=False + ) time_create: DateTimeField = DateTimeField( verbose_name='Дата создания', auto_now_add=True @@ -105,9 +121,127 @@ class RSForm(Model): verbose_name = 'Схема' verbose_name_plural = 'Схемы' + def __str__(self) -> str: + return f'{self.title}' + + def get_absolute_url(self): + return f'/api/library/{self.pk}/' + + +class Subscription(Model): + ''' User subscription to library item. ''' + user: ForeignKey = ForeignKey( + verbose_name='Пользователь', + to=User, + on_delete=CASCADE + ) + item: ForeignKey = ForeignKey( + verbose_name='Элемент', + to=LibraryItem, + on_delete=CASCADE + ) + + class Meta: + ''' Model metadata. ''' + verbose_name = 'Подписки' + verbose_name_plural = 'Подписка' + + def __str__(self) -> str: + return f'{self.user} -> {self.item}' + + +class Constituenta(Model): + ''' Constituenta is the base unit for every conceptual schema ''' + schema: ForeignKey = ForeignKey( + verbose_name='Концептуальная схема', + to=LibraryItem, + on_delete=CASCADE + ) + order: PositiveIntegerField = PositiveIntegerField( + verbose_name='Позиция', + validators=[MinValueValidator(1)], + default=-1, + ) + alias: CharField = CharField( + verbose_name='Имя', + max_length=8, + default='undefined' + ) + cst_type: CharField = CharField( + verbose_name='Тип', + max_length=10, + choices=CstType.choices, + default=CstType.BASE + ) + convention: TextField = TextField( + verbose_name='Комментарий/Конвенция', + default='', + blank=True + ) + term_raw: TextField = TextField( + verbose_name='Термин (с отсылками)', + default='', + blank=True + ) + term_resolved: TextField = TextField( + verbose_name='Термин', + default='', + blank=True + ) + term_forms: JSONField = JSONField( + verbose_name='Словоформы', + default=_empty_forms + ) + definition_formal: TextField = TextField( + verbose_name='Родоструктурное определение', + default='', + blank=True + ) + definition_raw: TextField = TextField( + verbose_name='Текстовое определние (с отсылками)', + default='', + blank=True + ) + definition_resolved: TextField = TextField( + verbose_name='Текстовое определние', + default='', + blank=True + ) + + class Meta: + ''' Model metadata. ''' + verbose_name = 'Конституета' + verbose_name_plural = 'Конституенты' + + def get_absolute_url(self): + ''' URL access. ''' + return reverse('constituenta-detail', kwargs={'pk': self.pk}) + + def __str__(self) -> str: + return f'{self.alias}' + + def set_term_resolved(self, new_term: str): + ''' Set term and reset forms if needed. ''' + if new_term == self.term_resolved: + return + self.term_resolved = new_term + self.term_forms = [] + + +class RSForm: + ''' RSForm is a math form of capturing conceptual schema. ''' + def __init__(self, item: LibraryItem): + if item.item_type != LibraryItemType.RSFORM: + raise ValueError('Attempting to use invalid adaptor for non-RSForm item') + self.item = item + + @staticmethod + def create(**kwargs) -> 'RSForm': + return RSForm(LibraryItem.objects.create(item_type=LibraryItemType.RSFORM, **kwargs)) + def constituents(self) -> QuerySet['Constituenta']: - ''' Get QuerySet containing all constituents of current RSForm ''' - return Constituenta.objects.filter(schema=self) + ''' Get QuerySet containing all constituents of current RSForm. ''' + return Constituenta.objects.filter(schema=self.item) def resolver(self) -> Resolver: ''' Create resolver for text references based on schema terms. ''' @@ -152,19 +286,19 @@ class RSForm(Model): ''' Insert new constituenta at given position. All following constituents order is shifted by 1 position ''' if position <= 0: raise ValidationError('Invalid position: should be positive integer') - update_list = Constituenta.objects.only('id', 'order', 'schema').filter(schema=self, order__gte=position) + update_list = Constituenta.objects.only('id', 'order', 'schema').filter(schema=self.item, order__gte=position) for cst in update_list: cst.order += 1 Constituenta.objects.bulk_update(update_list, ['order']) result = Constituenta.objects.create( - schema=self, + schema=self.item, order=position, alias=alias, cst_type=insert_type ) self.update_order() - self.save() + self.item.save() result.refresh_from_db() return result @@ -175,13 +309,13 @@ class RSForm(Model): if self.constituents().exists(): position += self.constituents().count() result = Constituenta.objects.create( - schema=self, + schema=self.item, order=position, alias=alias, cst_type=insert_type ) self.update_order() - self.save() + self.item.save() result.refresh_from_db() return result @@ -207,7 +341,7 @@ class RSForm(Model): update_list.append(cst) Constituenta.objects.bulk_update(update_list, ['order']) self.update_order() - self.save() + self.item.save() @transaction.atomic def delete_cst(self, listCst): @@ -216,7 +350,7 @@ class RSForm(Model): cst.delete() self.update_order() self.resolve_all_text() - self.save() + self.item.save() @transaction.atomic def create_cst(self, data: dict, insert_after: Optional[str]=None) -> 'Constituenta': @@ -326,12 +460,6 @@ class RSForm(Model): else: return self.insert_last(data['alias'], data['cst_type']) - def __str__(self) -> str: - return f'{self.title}' - - def get_absolute_url(self): - return reverse('rsform-detail', kwargs={'pk': self.pk}) - def _term_graph(self) -> Graph: result = Graph() cst_list = self.constituents().only('order', 'alias', 'term_raw').order_by('order') @@ -355,83 +483,6 @@ class RSForm(Model): return result -class Constituenta(Model): - ''' Constituenta is the base unit for every conceptual schema ''' - schema: ForeignKey = ForeignKey( - verbose_name='Концептуальная схема', - to=RSForm, - on_delete=CASCADE - ) - order: PositiveIntegerField = PositiveIntegerField( - verbose_name='Позиция', - validators=[MinValueValidator(1)], - default=-1, - ) - alias: CharField = CharField( - verbose_name='Имя', - max_length=8, - default='undefined' - ) - cst_type: CharField = CharField( - verbose_name='Тип', - max_length=10, - choices=CstType.choices, - default=CstType.BASE - ) - convention: TextField = TextField( - verbose_name='Комментарий/Конвенция', - default='', - blank=True - ) - term_raw: TextField = TextField( - verbose_name='Термин (с отсылками)', - default='', - blank=True - ) - term_resolved: TextField = TextField( - verbose_name='Термин', - default='', - blank=True - ) - term_forms: JSONField = JSONField( - verbose_name='Словоформы', - default=_empty_forms - ) - definition_formal: TextField = TextField( - verbose_name='Родоструктурное определение', - default='', - blank=True - ) - definition_raw: TextField = TextField( - verbose_name='Текстовое определние (с отсылками)', - default='', - blank=True - ) - definition_resolved: TextField = TextField( - verbose_name='Текстовое определние', - default='', - blank=True - ) - - class Meta: - ''' Model metadata. ''' - verbose_name = 'Конституета' - verbose_name_plural = 'Конституенты' - - def get_absolute_url(self): - ''' URL access. ''' - return reverse('constituenta-detail', kwargs={'pk': self.pk}) - - def __str__(self) -> str: - return f'{self.alias}' - - def set_term_resolved(self, new_term: str): - ''' Set term and reset forms if needed. ''' - if new_term == self.term_resolved: - return - self.term_resolved = new_term - self.term_forms = [] - class PyConceptAdapter: ''' RSForm adapter for interacting with pyconcept module. ''' def __init__(self, instance: RSForm): @@ -456,14 +507,14 @@ class PyConceptAdapter: def _complete_rsform_details(self, data: dict) -> dict: result = deepcopy(data) - result['id'] = self.schema.pk - result['alias'] = self.schema.alias - result['title'] = self.schema.title - result['comment'] = self.schema.comment - result['time_update'] = self.schema.time_update - result['time_create'] = self.schema.time_create - result['is_common'] = self.schema.is_common - result['owner'] = (self.schema.owner.pk if self.schema.owner is not None else None) + result['id'] = self.schema.item.pk + result['alias'] = self.schema.item.alias + result['title'] = self.schema.item.title + result['comment'] = self.schema.item.comment + result['time_update'] = self.schema.item.time_update + result['time_create'] = self.schema.item.time_create + result['is_common'] = self.schema.item.is_common + result['owner'] = (self.schema.item.owner.pk if self.schema.item.owner is not None else None) for cst_data in result['items']: cst = Constituenta.objects.get(pk=cst_data['id']) cst_data['convention'] = cst.convention diff --git a/rsconcept/backend/apps/rsform/serializers.py b/rsconcept/backend/apps/rsform/serializers.py index 9e2cf5c0..e18a9873 100644 --- a/rsconcept/backend/apps/rsform/serializers.py +++ b/rsconcept/backend/apps/rsform/serializers.py @@ -6,7 +6,7 @@ from django.db import transaction from cctext import Resolver, Reference, ReferenceType, EntityReference, SyntacticReference from .utils import fix_old_references -from .models import Constituenta, RSForm +from .models import Constituenta, LibraryItem, RSForm _CST_TYPE = 'constituenta' _TRS_TYPE = 'rsform' @@ -30,13 +30,27 @@ class TextSerializer(serializers.Serializer): text = serializers.CharField() -class RSFormMetaSerializer(serializers.ModelSerializer): - ''' Serializer: General purpose RSForm data. ''' +class LibraryItemSerializer(serializers.ModelSerializer): + ''' Serializer: Library item data. ''' + class Meta: + ''' serializer metadata. ''' + model = LibraryItem + fields = '__all__' + read_only_fields = ('owner', 'id', 'item_type') + + +class RSFormSerializer(serializers.ModelSerializer): + ''' Serializer: Detailed data for RSForm. ''' class Meta: ''' serializer metadata. ''' model = RSForm - fields = '__all__' - read_only_fields = ('owner', 'id') + + def to_representation(self, instance: RSForm): + result = LibraryItemSerializer(instance.item).data + result['items'] = [] + for cst in instance.constituents().order_by('order'): + result['items'].append(ConstituentaSerializer(cst).data) + return result class RSFormUploadSerializer(serializers.Serializer): @@ -45,26 +59,8 @@ class RSFormUploadSerializer(serializers.Serializer): load_metadata = serializers.BooleanField() -class RSFormContentsSerializer(serializers.ModelSerializer): - ''' Serializer: Detailed data for RSForm. ''' - class Meta: - ''' serializer metadata. ''' - model = RSForm - - def to_representation(self, instance: RSForm): - result = RSFormMetaSerializer(instance).data - result['items'] = [] - for cst in instance.constituents().order_by('order'): - result['items'].append(ConstituentaSerializer(cst).data) - return result - - class RSFormTRSSerializer(serializers.Serializer): ''' Serializer: TRS file production and loading for RSForm. ''' - class Meta: - ''' serializer metadata. ''' - model = RSForm - def to_representation(self, instance: RSForm) -> dict: result = self._prepare_json_rsform(instance) items = instance.constituents().order_by('order') @@ -76,9 +72,9 @@ class RSFormTRSSerializer(serializers.Serializer): def _prepare_json_rsform(schema: RSForm) -> dict: return { 'type': _TRS_TYPE, - 'title': schema.title, - 'alias': schema.alias, - 'comment': schema.comment, + 'title': schema.item.title, + 'alias': schema.item.alias, + 'comment': schema.item.comment, 'items': [], 'claimed': False, 'selection': [], @@ -114,6 +110,8 @@ class RSFormTRSSerializer(serializers.Serializer): result['owner'] = data['owner'] if 'is_common' in data: result['is_common'] = data['is_common'] + if 'is_canonical' in data: + result['is_canonical'] = data['is_canonical'] result['items'] = data.get('items', []) if self.context['load_meta']: result['title'] = data.get('title', 'Без названия') @@ -121,7 +119,7 @@ class RSFormTRSSerializer(serializers.Serializer): result['comment']= data.get('comment', '') if 'id' in data: result['id'] = data['id'] - self.instance = RSForm.objects.get(pk=result['id']) + self.instance = RSForm(LibraryItem.objects.get(pk=result['id'])) return result def validate(self, attrs: dict): @@ -135,19 +133,20 @@ class RSFormTRSSerializer(serializers.Serializer): @transaction.atomic def create(self, validated_data: dict) -> RSForm: - self.instance = RSForm( + self.instance: RSForm = RSForm.create( owner=validated_data.get('owner', None), alias=validated_data['alias'], title=validated_data['title'], comment=validated_data['comment'], - is_common=validated_data['is_common'] + is_common=validated_data['is_common'], + is_canonical=validated_data['is_canonical'] ) - self.instance.save() + self.instance.item.save() order = 1 for cst_data in validated_data['items']: cst = Constituenta( alias=cst_data['alias'], - schema=self.instance, + schema=self.instance.item, order=order, cst_type=cst_data['cstType'], ) @@ -160,11 +159,11 @@ class RSFormTRSSerializer(serializers.Serializer): @transaction.atomic def update(self, instance: RSForm, validated_data) -> RSForm: if 'alias' in validated_data: - instance.alias = validated_data['alias'] + instance.item.alias = validated_data['alias'] if 'title' in validated_data: - instance.title = validated_data['title'] + instance.item.title = validated_data['title'] if 'comment' in validated_data: - instance.comment = validated_data['comment'] + instance.item.comment = validated_data['comment'] order = 1 prev_constituents = instance.constituents() @@ -181,7 +180,7 @@ class RSFormTRSSerializer(serializers.Serializer): else: cst = Constituenta( alias=cst_data['alias'], - schema=instance, + schema=instance.item, order=order, cst_type=cst_data['cstType'], ) @@ -196,7 +195,7 @@ class RSFormTRSSerializer(serializers.Serializer): instance.update_order() instance.resolve_all_text() - instance.save() + instance.item.save() return instance @staticmethod @@ -225,7 +224,7 @@ class ConstituentaSerializer(serializers.ModelSerializer): read_only_fields = ('id', 'order', 'alias', 'cst_type', 'definition_resolved', 'term_resolved') def update(self, instance: Constituenta, validated_data) -> Constituenta: - schema: RSForm = instance.schema + schema = RSForm(instance.schema) definition: Optional[str] = validated_data['definition_raw'] if 'definition_raw' in validated_data else None term: Optional[str] = validated_data['term_raw'] if 'term_raw' in validated_data else None term_changed = False @@ -240,7 +239,7 @@ class ConstituentaSerializer(serializers.ModelSerializer): if term_changed: schema.on_term_change([result.alias]) result.refresh_from_db() - schema.save() + schema.item.save() return result @@ -281,16 +280,16 @@ class CstRenameSerializer(serializers.ModelSerializer): def validate(self, attrs): schema = cast(RSForm, self.context['schema']) old_cst = Constituenta.objects.get(pk=self.initial_data['id']) - if old_cst.schema != schema: + if old_cst.schema != schema.item: raise serializers.ValidationError({ - 'id': f'Изменяемая конституента должна относиться к изменяемой схеме: {schema.title}' + 'id': f'Изменяемая конституента должна относиться к изменяемой схеме: {schema.item.title}' }) if old_cst.alias == self.initial_data['alias']: raise serializers.ValidationError({ 'alias': f'Имя конституенты должно отличаться от текущего: {self.initial_data["alias"]}' }) self.instance = old_cst - attrs['schema'] = schema + attrs['schema'] = schema.item attrs['id'] = self.initial_data['id'] return attrs @@ -306,7 +305,7 @@ class CstListSerializer(serializers.Serializer): cstList = [] for item in attrs['items']: cst = item['object'] - if cst.schema != schema: + if cst.schema != schema.item: raise serializers.ValidationError( {'items': f'Конституенты должны относиться к данной схеме: {item}'}) cstList.append(cst) diff --git a/rsconcept/backend/apps/rsform/tests/t_models.py b/rsconcept/backend/apps/rsform/tests/t_models.py index 669e0837..adb2f612 100644 --- a/rsconcept/backend/apps/rsform/tests/t_models.py +++ b/rsconcept/backend/apps/rsform/tests/t_models.py @@ -8,14 +8,17 @@ from apps.rsform.models import ( RSForm, Constituenta, CstType, - User + User, + LibraryItem, + LibraryItemType ) class TestConstituenta(TestCase): + ''' Testing Constituenta model. ''' def setUp(self): - self.schema1 = RSForm.objects.create(title='Test1') - self.schema2 = RSForm.objects.create(title='Test2') + self.schema1 = LibraryItem.objects.create(item_type=LibraryItemType.RSFORM, title='Test1') + self.schema2 = LibraryItem.objects.create(item_type=LibraryItemType.RSFORM, title='Test2') def test_str(self): testStr = 'X1' @@ -63,7 +66,8 @@ class TestConstituenta(TestCase): self.assertEqual(cst.definition_raw, '') -class TestRSForm(TestCase): +class TestLibraryItem(TestCase): + ''' Testing LibraryItem model. ''' def setUp(self): self.user1 = User.objects.create(username='User1') self.user2 = User.objects.create(username='User2') @@ -71,65 +75,79 @@ class TestRSForm(TestCase): def test_str(self): testStr = 'Test123' - schema = RSForm.objects.create(title=testStr, owner=self.user1, alias='КС1') - self.assertEqual(str(schema), testStr) + item = LibraryItem.objects.create(item_type=LibraryItemType.RSFORM, + title=testStr, owner=self.user1, alias='КС1') + self.assertEqual(str(item), testStr) def test_url(self): testStr = 'Test123' - schema = RSForm.objects.create(title=testStr, owner=self.user1, alias='КС1') - self.assertEqual(schema.get_absolute_url(), f'/api/rsforms/{schema.id}/') + item = LibraryItem.objects.create(item_type=LibraryItemType.RSFORM, + title=testStr, owner=self.user1, alias='КС1') + self.assertEqual(item.get_absolute_url(), f'/api/library/{item.id}/') def test_create_default(self): - schema = RSForm.objects.create(title='Test') - self.assertIsNone(schema.owner) - self.assertEqual(schema.title, 'Test') - self.assertEqual(schema.alias, '') - self.assertEqual(schema.comment, '') - self.assertEqual(schema.is_common, False) + item = LibraryItem.objects.create(item_type=LibraryItemType.RSFORM, title='Test') + self.assertIsNone(item.owner) + self.assertEqual(item.title, 'Test') + self.assertEqual(item.alias, '') + self.assertEqual(item.comment, '') + self.assertEqual(item.is_common, False) + self.assertEqual(item.is_canonical, False) def test_create(self): - schema = RSForm.objects.create( + item = LibraryItem.objects.create( + item_type=LibraryItemType.RSFORM, title='Test', owner=self.user1, alias='KS1', comment='Test comment', - is_common=True + is_common=True, + is_canonical=True ) - self.assertEqual(schema.owner, self.user1) - self.assertEqual(schema.title, 'Test') - self.assertEqual(schema.alias, 'KS1') - self.assertEqual(schema.comment, 'Test comment') - self.assertEqual(schema.is_common, True) + self.assertEqual(item.owner, self.user1) + self.assertEqual(item.title, 'Test') + self.assertEqual(item.alias, 'KS1') + self.assertEqual(item.comment, 'Test comment') + self.assertEqual(item.is_common, True) + self.assertEqual(item.is_canonical, True) + + +class TestRSForm(TestCase): + ''' Testing RSForm wrapper. ''' + def setUp(self): + self.user1 = User.objects.create(username='User1') + self.user2 = User.objects.create(username='User2') + self.assertNotEqual(self.user1, self.user2) def test_constituents(self): - schema1 = RSForm.objects.create(title='Test1') - schema2 = RSForm.objects.create(title='Test2') + schema1 = RSForm.create(title='Test1') + schema2 = RSForm.create(title='Test2') self.assertFalse(schema1.constituents().exists()) self.assertFalse(schema2.constituents().exists()) - Constituenta.objects.create(alias='X1', schema=schema1, order=1) - Constituenta.objects.create(alias='X2', schema=schema1, order=2) + Constituenta.objects.create(alias='X1', schema=schema1.item, order=1) + Constituenta.objects.create(alias='X2', schema=schema1.item, order=2) self.assertTrue(schema1.constituents().exists()) self.assertFalse(schema2.constituents().exists()) self.assertEqual(schema1.constituents().count(), 2) def test_insert_at(self): - schema = RSForm.objects.create(title='Test') + schema = RSForm.create(title='Test') cst1 = schema.insert_at(1, 'X1', CstType.BASE) self.assertEqual(cst1.order, 1) - self.assertEqual(cst1.schema, schema) + self.assertEqual(cst1.schema, schema.item) cst2 = schema.insert_at(1, 'X2', CstType.BASE) cst1.refresh_from_db() self.assertEqual(cst2.order, 1) - self.assertEqual(cst2.schema, schema) + self.assertEqual(cst2.schema, schema.item) self.assertEqual(cst1.order, 2) cst3 = schema.insert_at(4, 'X3', CstType.BASE) cst2.refresh_from_db() cst1.refresh_from_db() self.assertEqual(cst3.order, 3) - self.assertEqual(cst3.schema, schema) + self.assertEqual(cst3.schema, schema.item) self.assertEqual(cst2.order, 1) self.assertEqual(cst1.order, 2) @@ -138,7 +156,7 @@ class TestRSForm(TestCase): cst2.refresh_from_db() cst1.refresh_from_db() self.assertEqual(cst4.order, 3) - self.assertEqual(cst4.schema, schema) + self.assertEqual(cst4.schema, schema.item) self.assertEqual(cst3.order, 4) self.assertEqual(cst2.order, 1) self.assertEqual(cst1.order, 2) @@ -147,7 +165,7 @@ class TestRSForm(TestCase): schema.insert_at(0, 'X5', CstType.BASE) def test_insert_at_reorder(self): - schema = RSForm.objects.create(title='Test') + schema = RSForm.create(title='Test') schema.insert_at(1, 'X1', CstType.BASE) d1 = schema.insert_at(2, 'D1', CstType.TERM) d2 = schema.insert_at(1, 'D2', CstType.TERM) @@ -159,18 +177,18 @@ class TestRSForm(TestCase): self.assertEqual(x2.order, 2) def test_insert_last(self): - schema = RSForm.objects.create(title='Test') + schema = RSForm.create(title='Test') cst1 = schema.insert_last('X1', CstType.BASE) self.assertEqual(cst1.order, 1) - self.assertEqual(cst1.schema, schema) + self.assertEqual(cst1.schema, schema.item) cst2 = schema.insert_last('X2', CstType.BASE) self.assertEqual(cst2.order, 2) - self.assertEqual(cst2.schema, schema) + self.assertEqual(cst2.schema, schema.item) self.assertEqual(cst1.order, 1) def test_create_cst_resolve(self): - schema = RSForm.objects.create(title='Test') + schema = RSForm.create(title='Test') cst1 = schema.insert_last('X1', CstType.BASE) cst1.term_raw = '@{X2|datv}' cst1.definition_raw = '@{X1|datv} @{X2|datv}' @@ -188,7 +206,7 @@ class TestRSForm(TestCase): self.assertEqual(cst2.definition_resolved, 'слонам слоны') def test_delete_cst(self): - schema = RSForm.objects.create(title='Test') + schema = RSForm.create(title='Test') x1 = schema.insert_last('X1', CstType.BASE) x2 = schema.insert_last('X2', CstType.BASE) d1 = schema.insert_last('D1', CstType.TERM) @@ -196,13 +214,13 @@ class TestRSForm(TestCase): schema.delete_cst([x2, d1]) x1.refresh_from_db() d2.refresh_from_db() - schema.refresh_from_db() + schema.item.refresh_from_db() self.assertEqual(schema.constituents().count(), 2) self.assertEqual(x1.order, 1) self.assertEqual(d2.order, 2) def test_move_cst(self): - schema = RSForm.objects.create(title='Test') + schema = RSForm.create(title='Test') x1 = schema.insert_last('X1', CstType.BASE) x2 = schema.insert_last('X2', CstType.BASE) d1 = schema.insert_last('D1', CstType.TERM) @@ -218,7 +236,7 @@ class TestRSForm(TestCase): self.assertEqual(d2.order, 3) def test_move_cst_down(self): - schema = RSForm.objects.create(title='Test') + schema = RSForm.create(title='Test') x1 = schema.insert_last('X1', CstType.BASE) x2 = schema.insert_last('X2', CstType.BASE) schema.move_cst([x1], 2) @@ -228,7 +246,7 @@ class TestRSForm(TestCase): self.assertEqual(x2.order, 1) def test_reset_aliases(self): - schema = RSForm.objects.create(title='Test') + schema = RSForm.create(title='Test') x1 = schema.insert_last('X11', CstType.BASE) x2 = schema.insert_last('X21', CstType.BASE) d1 = schema.insert_last('D11', CstType.TERM) diff --git a/rsconcept/backend/apps/rsform/tests/t_views.py b/rsconcept/backend/apps/rsform/tests/t_views.py index 72aa0ecf..1d33fd18 100644 --- a/rsconcept/backend/apps/rsform/tests/t_views.py +++ b/rsconcept/backend/apps/rsform/tests/t_views.py @@ -9,7 +9,7 @@ from rest_framework.exceptions import ErrorDetail from cctext import ReferenceType from apps.users.models import User -from apps.rsform.models import Syntax, RSForm, Constituenta, CstType +from apps.rsform.models import Syntax, RSForm, Constituenta, CstType, LibraryItem, LibraryItemType from apps.rsform.views import ( convert_to_ascii, convert_to_math, @@ -17,28 +17,28 @@ from apps.rsform.views import ( ) -def _response_contains(response, schema: RSForm) -> bool: - return any(x for x in response.data if x['id'] == schema.pk) +def _response_contains(response, item: LibraryItem) -> bool: + return any(x for x in response.data if x['id'] == item.pk) class TestConstituentaAPI(APITestCase): - ''' Testing constituenta view. ''' + ''' Testing Constituenta view. ''' def setUp(self): self.factory = APIRequestFactory() self.user = User.objects.create(username='UserTest') self.client = APIClient() self.client.force_authenticate(user=self.user) - self.rsform_owned = RSForm.objects.create(title='Test', alias='T1', owner=self.user) - self.rsform_unowned = RSForm.objects.create(title='Test2', alias='T2') + self.rsform_owned = RSForm.create(title='Test', alias='T1', owner=self.user) + self.rsform_unowned = RSForm.create(title='Test2', alias='T2') self.cst1 = Constituenta.objects.create( - alias='X1', schema=self.rsform_owned, order=1, convention='Test', + alias='X1', schema=self.rsform_owned.item, order=1, convention='Test', term_raw='Test1', term_resolved='Test1R', term_forms=[{'text':'form1', 'tags':'sing,datv'}]) self.cst2 = Constituenta.objects.create( - alias='X2', schema=self.rsform_unowned, order=1, convention='Test1', + alias='X2', schema=self.rsform_unowned.item, order=1, convention='Test1', term_raw='Test2', term_resolved='Test2R') self.cst3 = Constituenta.objects.create( - alias='X3', schema=self.rsform_owned, order=2, + alias='X3', schema=self.rsform_owned.item, order=2, term_raw='Test3', term_resolved='Test3', definition_raw='Test1', definition_resolved='Test2') @@ -102,6 +102,110 @@ class TestConstituentaAPI(APITestCase): self.assertEqual(response.data['order'], self.cst1.order) +class TestLibraryViewset(APITestCase): + ''' Testing Library view. ''' + def setUp(self): + self.factory = APIRequestFactory() + self.user = User.objects.create(username='UserTest') + self.client = APIClient() + self.client.force_authenticate(user=self.user) + self.owned = LibraryItem.objects.create( + item_type=LibraryItemType.RSFORM, + title='Test', + alias='T1', + owner=self.user + ) + self.unowned = LibraryItem.objects.create( + item_type=LibraryItemType.RSFORM, + title='Test2', + alias='T2' + ) + self.common = LibraryItem.objects.create( + item_type=LibraryItemType.RSFORM, + title='Test3', + alias='T3', + is_common=True + ) + + def test_create_anonymous(self): + self.client.logout() + data = json.dumps({'title': 'Title'}) + response = self.client.post('/api/library/', data=data, content_type='application/json') + self.assertEqual(response.status_code, 403) + + def test_create_populate_user(self): + data = json.dumps({'title': 'Title'}) + response = self.client.post('/api/library/', data=data, content_type='application/json') + self.assertEqual(response.status_code, 201) + self.assertEqual(response.data['title'], 'Title') + self.assertEqual(response.data['owner'], self.user.id) + + def test_update(self): + data = json.dumps({'id': self.owned.id, 'title': 'New title'}) + response = self.client.patch(f'/api/library/{self.owned.id}/', + data=data, content_type='application/json') + self.assertEqual(response.status_code, 200) + self.assertEqual(response.data['title'], 'New title') + self.assertEqual(response.data['alias'], self.owned.alias) + + def test_update_unowned(self): + data = json.dumps({'id': self.unowned.id, 'title': 'New title'}) + response = self.client.patch(f'/api/library/{self.unowned.id}/', + data=data, content_type='application/json') + self.assertEqual(response.status_code, 403) + + def test_destroy(self): + response = self.client.delete(f'/api/library/{self.owned.id}/') + self.assertTrue(response.status_code in [202, 204]) + + def test_destroy_admin_override(self): + response = self.client.delete(f'/api/library/{self.unowned.id}/') + self.assertEqual(response.status_code, 403) + self.user.is_staff = True + self.user.save() + response = self.client.delete(f'/api/library/{self.unowned.id}/') + self.assertTrue(response.status_code in [202, 204]) + + def test_claim(self): + response = self.client.post(f'/api/library/{self.owned.id}/claim/') + self.assertEqual(response.status_code, 403) + + self.owned.is_common = True + self.owned.save() + response = self.client.post(f'/api/library/{self.owned.id}/claim/') + self.assertEqual(response.status_code, 304) + + response = self.client.post(f'/api/library/{self.unowned.id}/claim/') + self.assertEqual(response.status_code, 403) + + self.unowned.is_common = True + self.unowned.save() + response = self.client.post(f'/api/library/{self.unowned.id}/claim/') + self.assertEqual(response.status_code, 200) + self.unowned.refresh_from_db() + self.assertEqual(self.unowned.owner, self.user) + + def test_claim_anonymous(self): + self.client.logout() + response = self.client.post(f'/api/library/{self.owned.id}/claim/') + self.assertEqual(response.status_code, 403) + + def test_retrieve_common(self): + self.client.logout() + response = self.client.get('/api/library/active/') + self.assertEqual(response.status_code, 200) + self.assertTrue(_response_contains(response, self.common)) + self.assertFalse(_response_contains(response, self.unowned)) + self.assertFalse(_response_contains(response, self.owned)) + + def test_retrieve_owned(self): + response = self.client.get('/api/library/active/') + self.assertEqual(response.status_code, 200) + self.assertTrue(_response_contains(response, self.common)) + self.assertFalse(_response_contains(response, self.unowned)) + self.assertTrue(_response_contains(response, self.owned)) + + class TestRSFormViewset(APITestCase): ''' Testing RSForm view. ''' def setUp(self): @@ -109,56 +213,34 @@ class TestRSFormViewset(APITestCase): self.user = User.objects.create(username='UserTest') self.client = APIClient() self.client.force_authenticate(user=self.user) - self.rsform_owned = RSForm.objects.create(title='Test', alias='T1', owner=self.user) - self.rsform_unowned = RSForm.objects.create(title='Test2', alias='T2') + self.owned = RSForm.create(title='Test', alias='T1', owner=self.user) + self.unowned = RSForm.create(title='Test2', alias='T2') - def test_create_anonymous(self): - self.client.logout() - data = json.dumps({'title': 'Title'}) - response = self.client.post('/api/rsforms/', data=data, content_type='application/json') - self.assertEqual(response.status_code, 403) - - def test_create_populate_user(self): - data = json.dumps({'title': 'Title'}) - response = self.client.post('/api/rsforms/', data=data, content_type='application/json') - self.assertEqual(response.status_code, 201) - self.assertEqual(response.data['title'], 'Title') - self.assertEqual(response.data['owner'], self.user.id) - - def test_update(self): - data = json.dumps({'id': self.rsform_owned.id, 'title': 'New title'}) - response = self.client.patch(f'/api/rsforms/{self.rsform_owned.id}/', - data=data, content_type='application/json') + def test_list(self): + non_schema = LibraryItem.objects.create( + item_type=LibraryItemType.OPERATIONS_SCHEMA, + title='Test3' + ) + response = self.client.get('/api/rsforms/') self.assertEqual(response.status_code, 200) - self.assertEqual(response.data['title'], 'New title') - self.assertEqual(response.data['alias'], self.rsform_owned.alias) + self.assertFalse(_response_contains(response, non_schema)) + self.assertTrue(_response_contains(response, self.unowned.item)) + self.assertTrue(_response_contains(response, self.owned.item)) - def test_update_unowned(self): - data = json.dumps({'id': self.rsform_unowned.id, 'title': 'New title'}) - response = self.client.patch(f'/api/rsforms/{self.rsform_unowned.id}/', - data=data, content_type='application/json') - self.assertEqual(response.status_code, 403) - - def test_destroy(self): - response = self.client.delete(f'/api/rsforms/{self.rsform_owned.id}/') - self.assertTrue(response.status_code in [202, 204]) - - def test_destroy_admin_override(self): - response = self.client.delete(f'/api/rsforms/{self.rsform_unowned.id}/') - self.assertEqual(response.status_code, 403) - self.user.is_staff = True - self.user.save() - response = self.client.delete(f'/api/rsforms/{self.rsform_unowned.id}/') - self.assertTrue(response.status_code in [202, 204]) + response = self.client.get('/api/library/') + self.assertEqual(response.status_code, 200) + self.assertTrue(_response_contains(response, non_schema)) + self.assertTrue(_response_contains(response, self.unowned.item)) + self.assertTrue(_response_contains(response, self.owned.item)) def test_contents(self): - schema = RSForm.objects.create(title='Title1') + schema = RSForm.create(title='Title1') schema.insert_last(alias='X1', insert_type=CstType.BASE) - response = self.client.get(f'/api/rsforms/{schema.id}/contents/') + response = self.client.get(f'/api/rsforms/{schema.item.id}/contents/') self.assertEqual(response.status_code, 200) def test_details(self): - schema = RSForm.objects.create(title='Test') + schema = RSForm.create(title='Test') x1 = schema.insert_at(1, 'X1', CstType.BASE) x2 = schema.insert_at(2, 'X2', CstType.BASE) x1.term_raw = 'человек' @@ -168,7 +250,7 @@ class TestRSFormViewset(APITestCase): x1.save() x2.save() - response = self.client.get(f'/api/rsforms/{schema.id}/details/') + response = self.client.get(f'/api/rsforms/{schema.item.id}/details/') self.assertEqual(response.status_code, 200) self.assertEqual(response.data['title'], 'Test') @@ -182,10 +264,10 @@ class TestRSFormViewset(APITestCase): self.assertEqual(response.data['items'][1]['term']['resolved'], x2.term_resolved) def test_check(self): - schema = RSForm.objects.create(title='Test') + schema = RSForm.create(title='Test') schema.insert_at(1, 'X1', CstType.BASE) data = json.dumps({'expression': 'X1=X1'}) - response = self.client.post(f'/api/rsforms/{schema.id}/check/', data=data, content_type='application/json') + response = self.client.post(f'/api/rsforms/{schema.item.id}/check/', data=data, content_type='application/json') self.assertEqual(response.status_code, 200) self.assertEqual(response.data['parseResult'], True) self.assertEqual(response.data['syntax'], Syntax.MATH) @@ -194,12 +276,12 @@ class TestRSFormViewset(APITestCase): self.assertEqual(response.data['valueClass'], 'value') def test_resolve(self): - schema = RSForm.objects.create(title='Test') + schema = RSForm.create(title='Test') x1 = schema.insert_at(1, 'X1', CstType.BASE) x1.term_resolved = 'синий слон' x1.save() data = json.dumps({'text': '@{1|редкий} @{X1|plur,datv}'}) - response = self.client.post(f'/api/rsforms/{schema.id}/resolve/', data=data, content_type='application/json') + response = self.client.post(f'/api/rsforms/{schema.item.id}/resolve/', data=data, content_type='application/json') self.assertEqual(response.status_code, 200) self.assertEqual(response.data['input'], '@{1|редкий} @{X1|plur,datv}') self.assertEqual(response.data['output'], 'редким синим слонам') @@ -231,9 +313,9 @@ class TestRSFormViewset(APITestCase): self.assertTrue(response.data['title'] != '') def test_export_trs(self): - schema = RSForm.objects.create(title='Test') + schema = RSForm.create(title='Test') schema.insert_at(1, 'X1', CstType.BASE) - response = self.client.get(f'/api/rsforms/{schema.id}/export-trs/') + response = self.client.get(f'/api/rsforms/{schema.item.id}/export-trs/') self.assertEqual(response.status_code, 200) self.assertEqual(response.headers['Content-Disposition'], 'attachment; filename=Schema.trs') with io.BytesIO(response.content) as stream: @@ -241,29 +323,16 @@ class TestRSFormViewset(APITestCase): self.assertIsNone(zipped_file.testzip()) self.assertIn('document.json', zipped_file.namelist()) - def test_claim(self): - response = self.client.post(f'/api/rsforms/{self.rsform_owned.id}/claim/') - self.assertEqual(response.status_code, 304) - response = self.client.post(f'/api/rsforms/{self.rsform_unowned.id}/claim/') - self.assertEqual(response.status_code, 200) - self.rsform_unowned.refresh_from_db() - self.assertEqual(self.rsform_unowned.owner, self.user) - - def test_claim_anonymous(self): - self.client.logout() - response = self.client.post(f'/api/rsforms/{self.rsform_owned.id}/claim/') - self.assertEqual(response.status_code, 403) - def test_create_constituenta(self): data = json.dumps({'alias': 'X3', 'cst_type': 'basic'}) - response = self.client.post(f'/api/rsforms/{self.rsform_unowned.id}/cst-create/', + response = self.client.post(f'/api/rsforms/{self.unowned.item.id}/cst-create/', data=data, content_type='application/json') self.assertEqual(response.status_code, 403) - schema = self.rsform_owned - Constituenta.objects.create(schema=schema, alias='X1', cst_type='basic', order=1) - x2 = Constituenta.objects.create(schema=schema, alias='X2', cst_type='basic', order=2) - response = self.client.post(f'/api/rsforms/{schema.id}/cst-create/', + item = self.owned.item + Constituenta.objects.create(schema=item, alias='X1', cst_type='basic', order=1) + x2 = Constituenta.objects.create(schema=item, alias='X2', cst_type='basic', order=2) + response = self.client.post(f'/api/rsforms/{item.id}/cst-create/', data=data, content_type='application/json') self.assertEqual(response.status_code, 201) self.assertEqual(response.data['new_cst']['alias'], 'X3') @@ -271,7 +340,7 @@ class TestRSFormViewset(APITestCase): self.assertEqual(x3.order, 3) data = json.dumps({'alias': 'X4', 'cst_type': 'basic', 'insert_after': x2.id}) - response = self.client.post(f'/api/rsforms/{schema.id}/cst-create/', + response = self.client.post(f'/api/rsforms/{item.id}/cst-create/', data=data, content_type='application/json') self.assertEqual(response.status_code, 201) self.assertEqual(response.data['new_cst']['alias'], 'X4') @@ -280,34 +349,34 @@ class TestRSFormViewset(APITestCase): def test_rename_constituenta(self): self.cst1 = Constituenta.objects.create( - alias='X1', schema=self.rsform_owned, order=1, convention='Test', + alias='X1', schema=self.owned.item, order=1, convention='Test', term_raw='Test1', term_resolved='Test1', term_forms=[{'text':'form1', 'tags':'sing,datv'}]) self.cst2 = Constituenta.objects.create( - alias='X2', schema=self.rsform_unowned, order=1, convention='Test1', + alias='X2', schema=self.unowned.item, order=1, convention='Test1', term_raw='Test2', term_resolved='Test2') self.cst3 = Constituenta.objects.create( - alias='X3', schema=self.rsform_owned, order=2, + alias='X3', schema=self.owned.item, order=2, term_raw='Test3', term_resolved='Test3', definition_raw='Test1', definition_resolved='Test2') data = json.dumps({'alias': 'D2', 'cst_type': 'term', 'id': self.cst2.pk}) - response = self.client.patch(f'/api/rsforms/{self.rsform_unowned.id}/cst-rename/', + response = self.client.patch(f'/api/rsforms/{self.unowned.item.id}/cst-rename/', data=data, content_type='application/json') self.assertEqual(response.status_code, 403) - response = self.client.patch(f'/api/rsforms/{self.rsform_owned.id}/cst-rename/', + response = self.client.patch(f'/api/rsforms/{self.owned.item.id}/cst-rename/', data=data, content_type='application/json') self.assertEqual(response.status_code, 400) data = json.dumps({'alias': self.cst1.alias, 'cst_type': 'term', 'id': self.cst1.pk}) - response = self.client.patch(f'/api/rsforms/{self.rsform_owned.id}/cst-rename/', + response = self.client.patch(f'/api/rsforms/{self.owned.item.id}/cst-rename/', data=data, content_type='application/json') self.assertEqual(response.status_code, 400) data = json.dumps({'alias': 'D2', 'cst_type': 'term', 'id': self.cst1.pk}) - schema = self.rsform_owned - d1 = Constituenta.objects.create(schema=schema, alias='D1', cst_type='term', order=4) + item = self.owned.item + d1 = Constituenta.objects.create(schema=item, alias='D1', cst_type='term', order=4) d1.term_raw = '@{X1|plur}' d1.definition_formal = 'X1' d1.save() @@ -315,7 +384,7 @@ class TestRSFormViewset(APITestCase): self.assertEqual(self.cst1.order, 1) self.assertEqual(self.cst1.alias, 'X1') self.assertEqual(self.cst1.cst_type, CstType.BASE) - response = self.client.patch(f'/api/rsforms/{schema.id}/cst-rename/', + response = self.client.patch(f'/api/rsforms/{item.id}/cst-rename/', data=data, content_type='application/json') self.assertEqual(response.status_code, 200) self.assertEqual(response.data['new_cst']['alias'], 'D2') @@ -337,8 +406,8 @@ class TestRSFormViewset(APITestCase): 'definition_formal': '3', 'definition_raw': '4' }) - schema = self.rsform_owned - response = self.client.post(f'/api/rsforms/{schema.id}/cst-create/', + item = self.owned.item + response = self.client.post(f'/api/rsforms/{item.id}/cst-create/', data=data, content_type='application/json') self.assertEqual(response.status_code, 201) self.assertEqual(response.data['new_cst']['alias'], 'X3') @@ -351,66 +420,66 @@ class TestRSFormViewset(APITestCase): self.assertEqual(response.data['new_cst']['definition_resolved'], '4') def test_delete_constituenta(self): - schema = self.rsform_owned + schema = self.owned data = json.dumps({'items': [{'id': 1337}]}) - response = self.client.patch(f'/api/rsforms/{schema.id}/cst-multidelete/', + response = self.client.patch(f'/api/rsforms/{schema.item.id}/cst-multidelete/', data=data, content_type='application/json') self.assertEqual(response.status_code, 400) - x1 = Constituenta.objects.create(schema=schema, alias='X1', cst_type='basic', order=1) - x2 = Constituenta.objects.create(schema=schema, alias='X2', cst_type='basic', order=2) + x1 = Constituenta.objects.create(schema=schema.item, alias='X1', cst_type='basic', order=1) + x2 = Constituenta.objects.create(schema=schema.item, alias='X2', cst_type='basic', order=2) data = json.dumps({'items': [{'id': x1.id}]}) - response = self.client.patch(f'/api/rsforms/{schema.id}/cst-multidelete/', + response = self.client.patch(f'/api/rsforms/{schema.item.id}/cst-multidelete/', data=data, content_type='application/json') x2.refresh_from_db() - schema.refresh_from_db() + schema.item.refresh_from_db() self.assertEqual(response.status_code, 202) self.assertEqual(len(response.data['items']), 1) self.assertEqual(schema.constituents().count(), 1) self.assertEqual(x2.alias, 'X2') self.assertEqual(x2.order, 1) - x3 = Constituenta.objects.create(schema=self.rsform_unowned, alias='X1', cst_type='basic', order=1) + x3 = Constituenta.objects.create(schema=self.unowned.item, alias='X1', cst_type='basic', order=1) data = json.dumps({'items': [{'id': x3.id}]}) - response = self.client.patch(f'/api/rsforms/{schema.id}/cst-multidelete/', + response = self.client.patch(f'/api/rsforms/{schema.item.id}/cst-multidelete/', data=data, content_type='application/json') self.assertEqual(response.status_code, 400) def test_move_constituenta(self): - schema = self.rsform_owned + item = self.owned.item data = json.dumps({'items': [{'id': 1337}], 'move_to': 1}) - response = self.client.patch(f'/api/rsforms/{schema.id}/cst-moveto/', + response = self.client.patch(f'/api/rsforms/{item.id}/cst-moveto/', data=data, content_type='application/json') self.assertEqual(response.status_code, 400) - x1 = Constituenta.objects.create(schema=schema, alias='X1', cst_type='basic', order=1) - x2 = Constituenta.objects.create(schema=schema, alias='X2', cst_type='basic', order=2) + x1 = Constituenta.objects.create(schema=item, alias='X1', cst_type='basic', order=1) + x2 = Constituenta.objects.create(schema=item, alias='X2', cst_type='basic', order=2) data = json.dumps({'items': [{'id': x2.id}], 'move_to': 1}) - response = self.client.patch(f'/api/rsforms/{schema.id}/cst-moveto/', + response = self.client.patch(f'/api/rsforms/{item.id}/cst-moveto/', data=data, content_type='application/json') x1.refresh_from_db() x2.refresh_from_db() self.assertEqual(response.status_code, 200) - self.assertEqual(response.data['id'], schema.id) + self.assertEqual(response.data['id'], item.id) self.assertEqual(x1.order, 2) self.assertEqual(x2.order, 1) - x3 = Constituenta.objects.create(schema=self.rsform_unowned, alias='X1', cst_type='basic', order=1) + x3 = Constituenta.objects.create(schema=self.unowned.item, alias='X1', cst_type='basic', order=1) data = json.dumps({'items': [{'id': x3.id}], 'move_to': 1}) - response = self.client.patch(f'/api/rsforms/{schema.id}/cst-moveto/', + response = self.client.patch(f'/api/rsforms/{item.id}/cst-moveto/', data=data, content_type='application/json') self.assertEqual(response.status_code, 400) def test_reset_aliases(self): - schema = self.rsform_owned - response = self.client.patch(f'/api/rsforms/{schema.id}/reset-aliases/') + item = self.owned.item + response = self.client.patch(f'/api/rsforms/{item.id}/reset-aliases/') self.assertEqual(response.status_code, 200) - self.assertEqual(response.data['id'], schema.id) + self.assertEqual(response.data['id'], item.id) - x2 = Constituenta.objects.create(schema=schema, alias='X2', cst_type='basic', order=1) - x1 = Constituenta.objects.create(schema=schema, alias='X1', cst_type='basic', order=2) - d11 = Constituenta.objects.create(schema=schema, alias='D11', cst_type='term', order=3) - response = self.client.patch(f'/api/rsforms/{schema.id}/reset-aliases/') + x2 = Constituenta.objects.create(schema=item, alias='X2', cst_type='basic', order=1) + x1 = Constituenta.objects.create(schema=item, alias='X1', cst_type='basic', order=2) + d11 = Constituenta.objects.create(schema=item, alias='D11', cst_type='term', order=3) + response = self.client.patch(f'/api/rsforms/{item.id}/reset-aliases/') x1.refresh_from_db() x2.refresh_from_db() d11.refresh_from_db() @@ -422,31 +491,31 @@ class TestRSFormViewset(APITestCase): self.assertEqual(d11.order, 3) self.assertEqual(d11.alias, 'D1') - response = self.client.patch(f'/api/rsforms/{schema.id}/reset-aliases/') + response = self.client.patch(f'/api/rsforms/{item.id}/reset-aliases/') self.assertEqual(response.status_code, 200) def test_load_trs(self): - schema = self.rsform_owned - schema.title = 'Testt11' - schema.save() - x1 = Constituenta.objects.create(schema=schema, alias='X1', cst_type='basic', order=1) + schema = self.owned + schema.item.title = 'Testt11' + schema.item.save() + x1 = Constituenta.objects.create(schema=schema.item, alias='X1', cst_type='basic', order=1) work_dir = os.path.dirname(os.path.abspath(__file__)) with open(f'{work_dir}/data/sample-rsform.trs', 'rb') as file: data = {'file': file, 'load_metadata': False} - response = self.client.patch(f'/api/rsforms/{schema.id}/load-trs/', data=data, format='multipart') - schema.refresh_from_db() + response = self.client.patch(f'/api/rsforms/{schema.item.id}/load-trs/', data=data, format='multipart') + schema.item.refresh_from_db() self.assertEqual(response.status_code, 200) - self.assertEqual(schema.title, 'Testt11') + self.assertEqual(schema.item.title, 'Testt11') self.assertEqual(len(response.data['items']), 25) self.assertEqual(schema.constituents().count(), 25) self.assertFalse(Constituenta.objects.all().filter(pk=x1.id).exists()) def test_clone(self): - schema = self.rsform_owned - schema.title = 'Testt11' - schema.save() - x1 = Constituenta.objects.create(schema=schema, alias='X12', cst_type='basic', order=1) - d1 = Constituenta.objects.create(schema=schema, alias='D2', cst_type='term', order=1) + item = self.owned.item + item.title = 'Testt11' + item.save() + x1 = Constituenta.objects.create(schema=item, alias='X12', cst_type='basic', order=1) + d1 = Constituenta.objects.create(schema=item, alias='D2', cst_type='term', order=1) x1.term_raw = 'человек' x1.term_resolved = 'человек' d1.term_raw = '@{X12|plur}' @@ -455,7 +524,7 @@ class TestRSFormViewset(APITestCase): d1.save() data = json.dumps({'title': 'Title'}) - response = self.client.post(f'/api/rsforms/{schema.id}/clone/', data=data, content_type='application/json') + response = self.client.post(f'/api/library/{item.id}/clone/', data=data, content_type='application/json') self.assertEqual(response.status_code, 201) self.assertEqual(response.data['title'], 'Title') @@ -536,29 +605,3 @@ class TestFunctionalViews(APITestCase): response = parse_expression(request) self.assertEqual(response.status_code, 400) self.assertIsInstance(response.data['expression'][0], ErrorDetail) - - -class TestLibraryAPI(APITestCase): - def setUp(self): - self.factory = APIRequestFactory() - self.user = User.objects.create(username='UserTest') - self.client = APIClient() - self.client.force_authenticate(user=self.user) - self.rsform_owned = RSForm.objects.create(title='Test', alias='T1', owner=self.user) - self.rsform_unowned = RSForm.objects.create(title='Test2', alias='T2') - self.rsform_common = RSForm.objects.create(title='Test3', alias='T3', is_common=True) - - def test_retrieve_common(self): - self.client.logout() - response = self.client.get('/api/library/') - self.assertEqual(response.status_code, 200) - self.assertTrue(_response_contains(response, self.rsform_common)) - self.assertFalse(_response_contains(response, self.rsform_unowned)) - self.assertFalse(_response_contains(response, self.rsform_owned)) - - def test_retrieve_owned(self): - response = self.client.get('/api/library/') - self.assertEqual(response.status_code, 200) - self.assertTrue(_response_contains(response, self.rsform_common)) - self.assertFalse(_response_contains(response, self.rsform_unowned)) - self.assertTrue(_response_contains(response, self.rsform_owned)) diff --git a/rsconcept/backend/apps/rsform/urls.py b/rsconcept/backend/apps/rsform/urls.py index 28264267..289c1f98 100644 --- a/rsconcept/backend/apps/rsform/urls.py +++ b/rsconcept/backend/apps/rsform/urls.py @@ -3,16 +3,17 @@ from django.urls import path, include from rest_framework import routers from . import views -rsform_router = routers.SimpleRouter() -rsform_router.register(r'rsforms', views.RSFormViewSet) +library_router = routers.SimpleRouter() +library_router.register('library', views.LibraryViewSet) +library_router.register('rsforms', views.RSFormViewSet) urlpatterns = [ - path('library/', views.LibraryView.as_view(), name='library'), + path('library/active/', views.LibraryActiveView.as_view(), name='library'), path('constituents//', views.ConstituentAPIView.as_view(), name='constituenta-detail'), path('rsforms/import-trs/', views.TrsImportView.as_view()), path('rsforms/create-detailed/', views.create_rsform), path('func/parse-expression/', views.parse_expression), path('func/to-ascii/', views.convert_to_ascii), path('func/to-math/', views.convert_to_math), - path('', include(rsform_router.urls)), + path('', include(library_router.urls)), ] diff --git a/rsconcept/backend/apps/rsform/utils.py b/rsconcept/backend/apps/rsform/utils.py index e59af10f..819dfdaa 100644 --- a/rsconcept/backend/apps/rsform/utils.py +++ b/rsconcept/backend/apps/rsform/utils.py @@ -3,7 +3,7 @@ import json from io import BytesIO import re from zipfile import ZipFile -from rest_framework.permissions import BasePermission +from rest_framework.permissions import BasePermission, IsAuthenticated class ObjectOwnerOrAdmin(BasePermission): @@ -16,6 +16,14 @@ class ObjectOwnerOrAdmin(BasePermission): return request.user.is_staff # type: ignore +class IsClaimable(IsAuthenticated): + ''' Permission for object ownership restriction ''' + def has_object_permission(self, request, view, obj): + if not super().has_permission(request, view): + return False + return obj.is_common + + class SchemaOwnerOrAdmin(BasePermission): ''' Permission for object ownership restriction ''' def has_object_permission(self, request, view, obj): diff --git a/rsconcept/backend/apps/rsform/views.py b/rsconcept/backend/apps/rsform/views.py index 2bf36586..9dd0e311 100644 --- a/rsconcept/backend/apps/rsform/views.py +++ b/rsconcept/backend/apps/rsform/views.py @@ -1,5 +1,6 @@ ''' REST API: RSForms for conceptual schemas. ''' import json +from typing import cast from django.db import transaction from django.http import HttpResponse from django_filters.rest_framework import DjangoFilterBackend @@ -10,28 +11,28 @@ from rest_framework.response import Response from rest_framework.decorators import api_view import pyconcept -from . import models -from . import serializers +from . import models as m +from . import serializers as s from . import utils -class LibraryView(generics.ListAPIView): +class LibraryActiveView(generics.ListAPIView): ''' Endpoint: Get list of rsforms available for active user. ''' permission_classes = (permissions.AllowAny,) - serializer_class = serializers.RSFormMetaSerializer + serializer_class = s.LibraryItemSerializer def get_queryset(self): user = self.request.user if not user.is_anonymous: - return models.RSForm.objects.filter(Q(is_common=True) | Q(owner=user)) + return m.LibraryItem.objects.filter(Q(is_common=True) | Q(owner=user)) else: - return models.RSForm.objects.filter(is_common=True) + return m.LibraryItem.objects.filter(is_common=True) class ConstituentAPIView(generics.RetrieveUpdateAPIView): ''' Endpoint: Get / Update Constituenta. ''' - queryset = models.Constituenta.objects.all() - serializer_class = serializers.ConstituentaSerializer + queryset = m.Constituenta.objects.all() + serializer_class = s.ConstituentaSerializer def get_permissions(self): result = super().get_permissions() @@ -41,21 +42,17 @@ class ConstituentAPIView(generics.RetrieveUpdateAPIView): result.append(utils.SchemaOwnerOrAdmin()) return result - # pylint: disable=too-many-ancestors -class RSFormViewSet(viewsets.ModelViewSet): - ''' Endpoint: RSForm operations. ''' - queryset = models.RSForm.objects.all() - serializer_class = serializers.RSFormMetaSerializer +class LibraryViewSet(viewsets.ModelViewSet): + ''' Endpoint: Library operations. ''' + queryset = m.LibraryItem.objects.all() + serializer_class = s.LibraryItemSerializer filter_backends = (DjangoFilterBackend, filters.OrderingFilter) - filterset_fields = ['owner', 'is_common'] - ordering_fields = ('owner', 'title', 'time_update') + filterset_fields = ['item_type', 'owner', 'is_common', 'is_canonical'] + ordering_fields = ('item_type', 'owner', 'title', 'time_update') ordering = '-time_update' - def _get_schema(self) -> models.RSForm: - return self.get_object() # type: ignore - def perform_create(self, serializer): if not self.request.user.is_anonymous and 'owner' not in self.request.POST: return serializer.save(owner=self.request.user) @@ -63,11 +60,64 @@ class RSFormViewSet(viewsets.ModelViewSet): return serializer.save() def get_permissions(self): - if self.action in ['update', 'destroy', 'partial_update', 'load_trs', - 'cst_create', 'cst_multidelete', 'reset_aliases', 'cst_rename']: + if self.action in ['update', 'destroy', 'partial_update']: permission_classes = [utils.ObjectOwnerOrAdmin] - elif self.action in ['create', 'claim', 'clone']: + elif self.action in ['create', 'clone']: permission_classes = [permissions.IsAuthenticated] + elif self.action in ['claim']: + permission_classes = [utils.IsClaimable] + else: + permission_classes = [permissions.AllowAny] + return [permission() for permission in permission_classes] + + @transaction.atomic + @action(detail=True, methods=['post'], url_path='clone') + def clone(self, request, pk): + ''' Endpoint: Create deep copy of library item. ''' + serializer = s.LibraryItemSerializer(data=request.data) + serializer.is_valid(raise_exception=True) + item = cast(m.LibraryItem, self.get_object()) + if item.item_type == m.LibraryItemType.RSFORM: + schema = m.RSForm(item) + clone_data = s.RSFormTRSSerializer(schema).data + clone_data['item_type'] = item.item_type + clone_data['owner'] = self.request.user + clone_data['title'] = serializer.validated_data['title'] + clone_data['alias'] = serializer.validated_data.get('alias', '') + clone_data['comment'] = serializer.validated_data.get('comment', '') + clone_data['is_common'] = serializer.validated_data.get('is_common', False) + clone_data['is_canonical'] = serializer.validated_data.get('is_canonical', False) + clone = s.RSFormTRSSerializer(data=clone_data, context={'load_meta': True}) + clone.is_valid(raise_exception=True) + new_schema = clone.save() + return Response(status=201, data=m.PyConceptAdapter(new_schema).full()) + return Response(status=404) + + @action(detail=True, methods=['post']) + def claim(self, request, pk=None): + ''' Endpoint: Claim ownership of LibraryItem. ''' + item = cast(m.LibraryItem, self.get_object()) + if item.owner == self.request.user: + return Response(status=304) + else: + item.owner = self.request.user + item.save() + return Response(status=200, data=s.LibraryItemSerializer(item).data) + + +class RSFormViewSet(viewsets.GenericViewSet, generics.ListAPIView, generics.RetrieveAPIView): + ''' Endpoint: RSForm operations. ''' + queryset = m.LibraryItem.objects.all().filter(item_type=m.LibraryItemType.RSFORM) + serializer_class = s.LibraryItemSerializer + + def _get_schema(self) -> m.RSForm: + return m.RSForm(self.get_object()) # type: ignore + + def get_permissions(self): + ''' Determine permission class. ''' + if self.action in ['load_trs', 'cst_create', 'cst_multidelete', + 'reset_aliases', 'cst_rename']: + permission_classes = [utils.ObjectOwnerOrAdmin] else: permission_classes = [permissions.AllowAny] return [permission() for permission in permission_classes] @@ -76,14 +126,14 @@ class RSFormViewSet(viewsets.ModelViewSet): def cst_create(self, request, pk): ''' Create new constituenta. ''' schema = self._get_schema() - serializer = serializers.CstCreateSerializer(data=request.data) + serializer = s.CstCreateSerializer(data=request.data) serializer.is_valid(raise_exception=True) data = serializer.validated_data new_cst = schema.create_cst(data, data['insert_after'] if 'insert_after' in data else None) - schema.refresh_from_db() + schema.item.refresh_from_db() response = Response(status=201, data={ - 'new_cst': serializers.ConstituentaSerializer(new_cst).data, - 'schema': models.PyConceptAdapter(schema).full() + 'new_cst': s.ConstituentaSerializer(new_cst).data, + 'schema': m.PyConceptAdapter(schema).full() }) response['Location'] = new_cst.get_absolute_url() return response @@ -93,109 +143,80 @@ class RSFormViewSet(viewsets.ModelViewSet): def cst_rename(self, request, pk): ''' Rename constituenta possibly changing type. ''' schema = self._get_schema() - serializer = serializers.CstRenameSerializer(data=request.data, context={'schema': schema}) + serializer = s.CstRenameSerializer(data=request.data, context={'schema': schema}) serializer.is_valid(raise_exception=True) - old_alias = models.Constituenta.objects.get(pk=request.data['id']).alias + old_alias = m.Constituenta.objects.get(pk=request.data['id']).alias serializer.save() mapping = { old_alias: serializer.validated_data['alias'] } schema.apply_mapping(mapping, change_aliases=False) schema.update_order() - schema.refresh_from_db() - cst = models.Constituenta.objects.get(pk=serializer.validated_data['id']) + schema.item.refresh_from_db() + cst = m.Constituenta.objects.get(pk=serializer.validated_data['id']) return Response(status=200, data={ - 'new_cst': serializers.ConstituentaSerializer(cst).data, - 'schema': models.PyConceptAdapter(schema).full() + 'new_cst': s.ConstituentaSerializer(cst).data, + 'schema': m.PyConceptAdapter(schema).full() }) @action(detail=True, methods=['patch'], url_path='cst-multidelete') def cst_multidelete(self, request, pk): ''' Endpoint: Delete multiple constituents. ''' schema = self._get_schema() - serializer = serializers.CstListSerializer(data=request.data, context={'schema': schema}) + serializer = s.CstListSerializer(data=request.data, context={'schema': schema}) serializer.is_valid(raise_exception=True) schema.delete_cst(serializer.validated_data['constituents']) - schema.refresh_from_db() - return Response(status=202, data=models.PyConceptAdapter(schema).full()) + schema.item.refresh_from_db() + return Response(status=202, data=m.PyConceptAdapter(schema).full()) @action(detail=True, methods=['patch'], url_path='cst-moveto') def cst_moveto(self, request, pk): ''' Endpoint: Move multiple constituents. ''' schema = self._get_schema() - serializer = serializers.CstMoveSerializer(data=request.data, context={'schema': schema}) + serializer = s.CstMoveSerializer(data=request.data, context={'schema': schema}) serializer.is_valid(raise_exception=True) schema.move_cst(serializer.validated_data['constituents'], serializer.validated_data['move_to']) - schema.refresh_from_db() - return Response(status=200, data=models.PyConceptAdapter(schema).full()) + schema.item.refresh_from_db() + return Response(status=200, data=m.PyConceptAdapter(schema).full()) @action(detail=True, methods=['patch'], url_path='reset-aliases') def reset_aliases(self, request, pk): ''' Endpoint: Recreate all aliases based on order. ''' schema = self._get_schema() schema.reset_aliases() - return Response(status=200, data=models.PyConceptAdapter(schema).full()) + return Response(status=200, data=m.PyConceptAdapter(schema).full()) @action(detail=True, methods=['patch'], url_path='load-trs') def load_trs(self, request, pk): ''' Endpoint: Load data from file and replace current schema. ''' - serializer = serializers.RSFormUploadSerializer(data=request.data) + serializer = s.RSFormUploadSerializer(data=request.data) serializer.is_valid(raise_exception=True) schema = self._get_schema() load_metadata = serializer.validated_data['load_metadata'] data = utils.read_trs(request.FILES['file'].file) - data['id'] = schema.pk + data['id'] = schema.item.pk - serializer = serializers.RSFormTRSSerializer(data=data, context={'load_meta': load_metadata}) + serializer = s.RSFormTRSSerializer(data=data, context={'load_meta': load_metadata}) serializer.is_valid(raise_exception=True) schema = serializer.save() - return Response(status=200, data=models.PyConceptAdapter(schema).full()) - - @action(detail=True, methods=['post'], url_path='clone') - def clone(self, request, pk): - ''' Endpoint: Clone RSForm constituents and create new schema using new metadata. ''' - serializer = serializers.RSFormMetaSerializer(data=request.data) - serializer.is_valid(raise_exception=True) - - clone_data = serializers.RSFormTRSSerializer(self._get_schema()).data - clone_data['owner'] = self.request.user - clone_data['title'] = serializer.validated_data['title'] - clone_data['alias'] = serializer.validated_data.get('alias', '') - clone_data['comment'] = serializer.validated_data.get('comment', '') - clone_data['is_common'] = serializer.validated_data.get('is_common', False) - - clone = serializers.RSFormTRSSerializer(data=clone_data, context={'load_meta': True}) - clone.is_valid(raise_exception=True) - new_schema = clone.save() - return Response(status=201, data=models.PyConceptAdapter(new_schema).full()) - - @action(detail=True, methods=['post']) - def claim(self, request, pk=None): - ''' Endpoint: Claim ownership of RSForm. ''' - schema = self._get_schema() - if schema.owner == self.request.user: - return Response(status=304) - else: - schema.owner = self.request.user - schema.save() - return Response(status=200, data=serializers.RSFormMetaSerializer(schema).data) + return Response(status=200, data=m.PyConceptAdapter(schema).full()) @action(detail=True, methods=['get']) def contents(self, request, pk): ''' Endpoint: View schema db contents (including constituents). ''' - schema = serializers.RSFormContentsSerializer(self._get_schema()).data + schema = s.RSFormSerializer(self._get_schema()).data return Response(schema) @action(detail=True, methods=['get']) def details(self, request, pk): ''' Endpoint: Detailed schema view including statuses and parse. ''' schema = self._get_schema() - serializer = models.PyConceptAdapter(schema) + serializer = m.PyConceptAdapter(schema) return Response(serializer.full()) @action(detail=True, methods=['post']) def check(self, request, pk): ''' Endpoint: Check RSLang expression against schema context. ''' - schema = models.PyConceptAdapter(self._get_schema()) - serializer = serializers.ExpressionSerializer(data=request.data) + schema = m.PyConceptAdapter(self._get_schema()) + serializer = s.ExpressionSerializer(data=request.data) serializer.is_valid(raise_exception=True) expression = serializer.validated_data['expression'] result = pyconcept.check_expression(json.dumps(schema.data), expression) @@ -205,19 +226,19 @@ class RSFormViewSet(viewsets.ModelViewSet): def resolve(self, request, pk): ''' Endpoint: Resolve refenrces in text against schema terms context. ''' schema = self._get_schema() - serializer = serializers.TextSerializer(data=request.data) + serializer = s.TextSerializer(data=request.data) serializer.is_valid(raise_exception=True) text = serializer.validated_data['text'] resolver = schema.resolver() resolver.resolve(text) - return Response(status=200, data=serializers.ResolverSerializer(resolver).data) + return Response(status=200, data=s.ResolverSerializer(resolver).data) @action(detail=True, methods=['get'], url_path='export-trs') def export_trs(self, request, pk): ''' Endpoint: Download Exteor compatible file. ''' - schema = serializers.RSFormTRSSerializer(self._get_schema()).data + schema = s.RSFormTRSSerializer(self._get_schema()).data trs = utils.write_trs(schema) - filename = self._get_schema().alias + filename = self._get_schema().item.alias if filename == '' or not filename.isascii(): # Note: non-ascii symbols in Content-Disposition # are not supported by some browsers @@ -231,7 +252,7 @@ class RSFormViewSet(viewsets.ModelViewSet): class TrsImportView(views.APIView): ''' Endpoint: Upload RS form in Exteor format. ''' - serializer_class = serializers.FileSerializer + serializer_class = s.FileSerializer def post(self, request): data = utils.read_trs(request.FILES['file'].file) @@ -239,10 +260,10 @@ class TrsImportView(views.APIView): if owner.is_anonymous: owner = None _prepare_rsform_data(data, request, owner) - serializer = serializers.RSFormTRSSerializer(data=data, context={'load_meta': True}) + serializer = s.RSFormTRSSerializer(data=data, context={'load_meta': True}) serializer.is_valid(raise_exception=True) schema = serializer.save() - result = serializers.RSFormMetaSerializer(schema) + result = s.LibraryItemSerializer(schema.item) return Response(status=201, data=result.data) @@ -253,25 +274,27 @@ def create_rsform(request): if owner.is_anonymous: owner = None if 'file' not in request.FILES: - serializer = serializers.RSFormMetaSerializer(data=request.data) + serializer = s.LibraryItemSerializer(data=request.data) serializer.is_valid(raise_exception=True) - schema = models.RSForm.objects.create( + schema = m.RSForm.create( title=serializer.validated_data['title'], owner=owner, alias=serializer.validated_data.get('alias', ''), comment=serializer.validated_data.get('comment', ''), is_common=serializer.validated_data.get('is_common', False), + is_canonical=serializer.validated_data.get('is_canonical', False), ) else: data = utils.read_trs(request.FILES['file'].file) _prepare_rsform_data(data, request, owner) - serializer = serializers.RSFormTRSSerializer(data=data, context={'load_meta': True}) + serializer = s.RSFormTRSSerializer(data=data, context={'load_meta': True}) serializer.is_valid(raise_exception=True) schema = serializer.save() - result = serializers.RSFormMetaSerializer(schema) + result = s.LibraryItemSerializer(schema.item) return Response(status=201, data=result.data) -def _prepare_rsform_data(data: dict, request, owner: models.User): +def _prepare_rsform_data(data: dict, request, owner: m.User): + data['owner'] = owner if 'title' in request.data and request.data['title'] != '': data['title'] = request.data['title'] if data['title'] == '': @@ -280,16 +303,21 @@ def _prepare_rsform_data(data: dict, request, owner: models.User): data['alias'] = request.data['alias'] if 'comment' in request.data and request.data['comment'] != '': data['comment'] = request.data['comment'] + is_common = True if 'is_common' in request.data: is_common = request.data['is_common'] == 'true' data['is_common'] = is_common - data['owner'] = owner + + is_canonical = False + if 'is_canonical' in request.data: + is_canonical = request.data['is_canonical'] == 'true' + data['is_canonical'] = is_canonical @api_view(['POST']) def parse_expression(request): ''' Endpoint: Parse RS expression. ''' - serializer = serializers.ExpressionSerializer(data=request.data) + serializer = s.ExpressionSerializer(data=request.data) serializer.is_valid(raise_exception=True) expression = serializer.validated_data['expression'] result = pyconcept.parse_expression(expression) @@ -299,7 +327,7 @@ def parse_expression(request): @api_view(['POST']) def convert_to_ascii(request): ''' Endpoint: Convert expression to ASCII syntax. ''' - serializer = serializers.ExpressionSerializer(data=request.data) + serializer = s.ExpressionSerializer(data=request.data) serializer.is_valid(raise_exception=True) expression = serializer.validated_data['expression'] result = pyconcept.convert_to_ascii(expression) @@ -309,7 +337,7 @@ def convert_to_ascii(request): @api_view(['POST']) def convert_to_math(request): ''' Endpoint: Convert expression to MATH syntax. ''' - serializer = serializers.ExpressionSerializer(data=request.data) + serializer = s.ExpressionSerializer(data=request.data) serializer.is_valid(raise_exception=True) expression = serializer.validated_data['expression'] result = pyconcept.convert_to_math(expression) diff --git a/rsconcept/backend/fixtures/InitialData.json b/rsconcept/backend/fixtures/InitialData.json new file mode 100644 index 00000000..3c07aa53 --- /dev/null +++ b/rsconcept/backend/fixtures/InitialData.json @@ -0,0 +1,10513 @@ +[ +{ + "model": "rsform.libraryitem", + "pk": 1, + "fields": { + "item_type": "rsform", + "owner": null, + "title": "Функционально-методное отношение", + "alias": "K0001", + "comment": "", + "is_common": true, + "is_canonical": true, + "time_create": "2023-08-25T19:03:39.786Z", + "time_update": "2023-08-25T19:03:39.787Z" + } +}, +{ + "model": "rsform.libraryitem", + "pk": 2, + "fields": { + "item_type": "rsform", + "owner": null, + "title": "Сеть процессов", + "alias": "K0002", + "comment": "", + "is_common": true, + "is_canonical": true, + "time_create": "2023-08-25T19:03:39.839Z", + "time_update": "2023-08-25T19:03:39.840Z" + } +}, +{ + "model": "rsform.libraryitem", + "pk": 3, + "fields": { + "item_type": "rsform", + "owner": null, + "title": "Объект-аспектное отношение", + "alias": "K0003", + "comment": "", + "is_common": true, + "is_canonical": true, + "time_create": "2023-08-25T19:03:39.876Z", + "time_update": "2023-08-25T19:03:39.876Z" + } +}, +{ + "model": "rsform.libraryitem", + "pk": 4, + "fields": { + "item_type": "rsform", + "owner": null, + "title": "Граф термов", + "alias": "K0004", + "comment": "", + "is_common": true, + "is_canonical": true, + "time_create": "2023-08-25T19:03:39.915Z", + "time_update": "2023-08-25T19:03:39.915Z" + } +}, +{ + "model": "rsform.libraryitem", + "pk": 5, + "fields": { + "item_type": "rsform", + "owner": null, + "title": "Полифакторструктура", + "alias": "K0005", + "comment": "", + "is_common": true, + "is_canonical": true, + "time_create": "2023-08-25T19:03:39.933Z", + "time_update": "2023-08-25T19:03:39.933Z" + } +}, +{ + "model": "rsform.libraryitem", + "pk": 6, + "fields": { + "item_type": "rsform", + "owner": null, + "title": "Факторструктура", + "alias": "K0006", + "comment": "", + "is_common": true, + "is_canonical": true, + "time_create": "2023-08-25T19:03:39.989Z", + "time_update": "2023-08-25T19:03:39.989Z" + } +}, +{ + "model": "rsform.libraryitem", + "pk": 7, + "fields": { + "item_type": "rsform", + "owner": null, + "title": "Выделенное подмножество", + "alias": "M0001", + "comment": "", + "is_common": true, + "is_canonical": true, + "time_create": "2023-08-25T19:03:40.018Z", + "time_update": "2023-08-25T19:03:40.018Z" + } +}, +{ + "model": "rsform.libraryitem", + "pk": 8, + "fields": { + "item_type": "rsform", + "owner": null, + "title": "Абстрактный выбор", + "alias": "M0002", + "comment": "", + "is_common": true, + "is_canonical": true, + "time_create": "2023-08-25T19:03:40.024Z", + "time_update": "2023-08-25T19:03:40.024Z" + } +}, +{ + "model": "rsform.libraryitem", + "pk": 9, + "fields": { + "item_type": "rsform", + "owner": null, + "title": "Разбиение", + "alias": "M0003", + "comment": "", + "is_common": true, + "is_canonical": true, + "time_create": "2023-08-25T19:03:40.033Z", + "time_update": "2023-08-25T19:03:40.034Z" + } +}, +{ + "model": "rsform.libraryitem", + "pk": 10, + "fields": { + "item_type": "rsform", + "owner": null, + "title": "Отношение эквивалентности", + "alias": "M0004", + "comment": "", + "is_common": true, + "is_canonical": true, + "time_create": "2023-08-25T19:03:40.041Z", + "time_update": "2023-08-25T19:03:40.041Z" + } +}, +{ + "model": "rsform.libraryitem", + "pk": 11, + "fields": { + "item_type": "rsform", + "owner": null, + "title": "Порядковые отношения", + "alias": "M0005", + "comment": "", + "is_common": true, + "is_canonical": true, + "time_create": "2023-08-25T19:03:40.052Z", + "time_update": "2023-08-25T19:03:40.052Z" + } +}, +{ + "model": "rsform.libraryitem", + "pk": 12, + "fields": { + "item_type": "rsform", + "owner": null, + "title": "Индуцированные порядки", + "alias": "M0006", + "comment": "", + "is_common": true, + "is_canonical": true, + "time_create": "2023-08-25T19:03:40.066Z", + "time_update": "2023-08-25T19:03:40.066Z" + } +}, +{ + "model": "rsform.libraryitem", + "pk": 13, + "fields": { + "item_type": "rsform", + "owner": null, + "title": "Графы", + "alias": "M0007", + "comment": "", + "is_common": true, + "is_canonical": true, + "time_create": "2023-08-25T19:03:40.077Z", + "time_update": "2023-08-25T19:03:40.077Z" + } +}, +{ + "model": "rsform.libraryitem", + "pk": 14, + "fields": { + "item_type": "rsform", + "owner": null, + "title": "Функциональные отношения", + "alias": "M0008", + "comment": "", + "is_common": true, + "is_canonical": true, + "time_create": "2023-08-25T19:03:40.081Z", + "time_update": "2023-08-25T19:03:40.081Z" + } +}, +{ + "model": "rsform.libraryitem", + "pk": 15, + "fields": { + "item_type": "rsform", + "owner": null, + "title": "Цепочка", + "alias": "M0009", + "comment": "", + "is_common": true, + "is_canonical": true, + "time_create": "2023-08-25T19:03:40.094Z", + "time_update": "2023-08-25T19:03:40.095Z" + } +}, +{ + "model": "rsform.libraryitem", + "pk": 16, + "fields": { + "item_type": "rsform", + "owner": null, + "title": "Последовательность", + "alias": "M0010", + "comment": "", + "is_common": true, + "is_canonical": true, + "time_create": "2023-08-25T19:03:40.118Z", + "time_update": "2023-08-25T19:03:40.118Z" + } +}, +{ + "model": "rsform.libraryitem", + "pk": 17, + "fields": { + "item_type": "rsform", + "owner": null, + "title": "Группа", + "alias": "M0011", + "comment": "", + "is_common": true, + "is_canonical": true, + "time_create": "2023-08-25T19:03:40.132Z", + "time_update": "2023-08-25T19:03:40.132Z" + } +}, +{ + "model": "rsform.libraryitem", + "pk": 18, + "fields": { + "item_type": "rsform", + "owner": null, + "title": "Решетка (бинарное отношение)", + "alias": "M0012", + "comment": "", + "is_common": true, + "is_canonical": true, + "time_create": "2023-08-25T19:03:40.152Z", + "time_update": "2023-08-25T19:03:40.152Z" + } +}, +{ + "model": "rsform.libraryitem", + "pk": 19, + "fields": { + "item_type": "rsform", + "owner": null, + "title": "Решетка", + "alias": "M0013", + "comment": "", + "is_common": true, + "is_canonical": true, + "time_create": "2023-08-25T19:03:40.167Z", + "time_update": "2023-08-25T19:03:40.168Z" + } +}, +{ + "model": "rsform.libraryitem", + "pk": 20, + "fields": { + "item_type": "rsform", + "owner": null, + "title": "Топологическое пространство", + "alias": "M0014", + "comment": "", + "is_common": true, + "is_canonical": true, + "time_create": "2023-08-25T19:03:40.196Z", + "time_update": "2023-08-25T19:03:40.196Z" + } +}, +{ + "model": "rsform.libraryitem", + "pk": 21, + "fields": { + "item_type": "rsform", + "owner": null, + "title": "Поле", + "alias": "M0015", + "comment": "", + "is_common": true, + "is_canonical": true, + "time_create": "2023-08-25T19:03:40.207Z", + "time_update": "2023-08-25T19:03:40.207Z" + } +}, +{ + "model": "rsform.libraryitem", + "pk": 22, + "fields": { + "item_type": "rsform", + "owner": null, + "title": "Операция замыкания", + "alias": "M0016", + "comment": "", + "is_common": true, + "is_canonical": true, + "time_create": "2023-08-25T19:03:40.258Z", + "time_update": "2023-08-25T19:03:40.258Z" + } +}, +{ + "model": "rsform.libraryitem", + "pk": 23, + "fields": { + "item_type": "rsform", + "owner": null, + "title": "Генеалогия", + "alias": "D0001", + "comment": "", + "is_common": true, + "is_canonical": true, + "time_create": "2023-08-25T19:03:40.275Z", + "time_update": "2023-08-25T19:03:40.275Z" + } +}, +{ + "model": "rsform.libraryitem", + "pk": 24, + "fields": { + "item_type": "rsform", + "owner": null, + "title": "Мелодии", + "alias": "D0002", + "comment": "", + "is_common": true, + "is_canonical": true, + "time_create": "2023-08-25T19:03:40.459Z", + "time_update": "2023-08-25T19:03:40.460Z" + } +}, +{ + "model": "rsform.libraryitem", + "pk": 25, + "fields": { + "item_type": "rsform", + "owner": null, + "title": "Друзья и враги", + "alias": "D0003", + "comment": "", + "is_common": true, + "is_canonical": true, + "time_create": "2023-08-25T19:03:40.487Z", + "time_update": "2023-08-25T19:03:40.487Z" + } +}, +{ + "model": "rsform.libraryitem", + "pk": 26, + "fields": { + "item_type": "rsform", + "owner": null, + "title": "Начальники-подчиненные", + "alias": "D0004", + "comment": "", + "is_common": true, + "is_canonical": true, + "time_create": "2023-08-25T19:03:40.564Z", + "time_update": "2023-08-25T19:03:40.564Z" + } +}, +{ + "model": "rsform.libraryitem", + "pk": 27, + "fields": { + "item_type": "rsform", + "owner": null, + "title": "Теория субъектов", + "alias": "D0005", + "comment": "", + "is_common": true, + "is_canonical": true, + "time_create": "2023-08-25T19:03:40.601Z", + "time_update": "2023-08-25T19:03:40.602Z" + } +}, +{ + "model": "rsform.constituenta", + "pk": 1, + "fields": { + "schema": 1, + "order": 1, + "alias": "X1", + "cst_type": "basic", + "convention": "Функция - регулярная осознанная потребность субъекта в получении некоторого результата или достижения определенной цели, требующая повторяющегося удовлетворения.", + "term_raw": "функции", + "term_resolved": "функции", + "term_forms": [], + "definition_formal": "", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 2, + "fields": { + "schema": 1, + "order": 2, + "alias": "X2", + "cst_type": "basic", + "convention": "Для реализации функций используются специальным образом созданные процессы, обобщенно именуемые методами", + "term_raw": "методы", + "term_resolved": "методы", + "term_forms": [], + "definition_formal": "", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 3, + "fields": { + "schema": 1, + "order": 3, + "alias": "S1", + "cst_type": "structure", + "convention": "Декомпозиция функции может быть проведена не единственным образом. В таких случаях проявляется альтернативность декомпозиции функций", + "term_raw": "декомпозиции", + "term_resolved": "декомпозиции", + "term_forms": [], + "definition_formal": "ℬ(X1×ℬ(X1))", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 4, + "fields": { + "schema": 1, + "order": 4, + "alias": "S2", + "cst_type": "structure", + "convention": "Для функции может найтись несколько различных методов ее реализации, то есть имеет место альтернативность методов реализации функции", + "term_raw": "функционально-методное отношение", + "term_resolved": "функционально-методное отношение", + "term_forms": [], + "definition_formal": "ℬ(X1×X2)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 5, + "fields": { + "schema": 1, + "order": 5, + "alias": "S3", + "cst_type": "structure", + "convention": "Метод может иметь нежелательные свойства, препятствующие регулярной реализации целевой функции или вызывающие побочные негативные эффекты. Такие свойства компенсируются за счет реализации других, вторичных функций", + "term_raw": "отношение вторичной функции", + "term_resolved": "отношение вторичной функции", + "term_forms": [], + "definition_formal": "ℬ(X2×X1)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 6, + "fields": { + "schema": 1, + "order": 6, + "alias": "S4", + "cst_type": "structure", + "convention": "Исходя из решаемой задачи задается набор функций, которые называются первичными функциями", + "term_raw": "первичные функции", + "term_resolved": "первичные функции", + "term_forms": [], + "definition_formal": "ℬ(X1)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 7, + "fields": { + "schema": 1, + "order": 7, + "alias": "D1", + "cst_type": "term", + "convention": "", + "term_raw": "декомпозируемые @{X1|nomn,plur}", + "term_resolved": "декомпозируемые функции", + "term_forms": [], + "definition_formal": "Pr1(S1)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 8, + "fields": { + "schema": 1, + "order": 8, + "alias": "D2", + "cst_type": "term", + "convention": "", + "term_raw": "альтернативы декомпозиции", + "term_resolved": "альтернативы декомпозиции", + "term_forms": [ + { + "text": "альтернативу декомпозиции", + "tags": "sing,ablt" + } + ], + "definition_formal": "Pr2(S1)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 9, + "fields": { + "schema": 1, + "order": 9, + "alias": "D3", + "cst_type": "term", + "convention": "", + "term_raw": "декомпозирующие @{X1|nomn,plur}", + "term_resolved": "декомпозирующие функции", + "term_forms": [], + "definition_formal": "red(Pr2(S1))", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 10, + "fields": { + "schema": 1, + "order": 10, + "alias": "F1", + "cst_type": "function", + "convention": "", + "term_raw": "@{D3|nomn,plur} набора @{X1|gent,plur}", + "term_resolved": "декомпозирующие функции набора функций", + "term_forms": [], + "definition_formal": "[α∈ℬ(X1)] red(Pr2(Fi1[α](S1)))", + "definition_raw": "@{X1|nomn,plur}, входящие в хотя бы одну @{D2|accs,sing} хотя бы одной @{X1|nomn,plur} из данного набора", + "definition_resolved": "функции, входящие в хотя бы одну альтернативу декомпозиции хотя бы одной функции из данного набора" + } +}, +{ + "model": "rsform.constituenta", + "pk": 11, + "fields": { + "schema": 1, + "order": 11, + "alias": "F2", + "cst_type": "function", + "convention": "", + "term_raw": "@{D3|nomn,plur} @{X1|gent,sing}", + "term_resolved": "декомпозирующие функции функции", + "term_forms": [], + "definition_formal": "[α∈X1] F1[{α}]", + "definition_raw": "@{X1|nomn,plur}, входящие в хотя бы одну @{D2|accs,sing} данного @{X1|nomn,plur}", + "definition_resolved": "функции, входящие в хотя бы одну альтернативу декомпозиции данного функции" + } +}, +{ + "model": "rsform.constituenta", + "pk": 12, + "fields": { + "schema": 1, + "order": 12, + "alias": "D4", + "cst_type": "term", + "convention": "", + "term_raw": "реализуемые напрямую @{X1|nomn,plur}", + "term_resolved": "реализуемые напрямую функции", + "term_forms": [], + "definition_formal": "Pr1(S2)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 13, + "fields": { + "schema": 1, + "order": 13, + "alias": "F3", + "cst_type": "function", + "convention": "", + "term_raw": "@{X1|gent,sing}, реализуемые @{X2|ablt,sing} напрямую", + "term_resolved": "функции, реализуемые методом напрямую", + "term_forms": [], + "definition_formal": "[α∈X2] Pr1(Fi2[{α}](S2))", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 14, + "fields": { + "schema": 1, + "order": 14, + "alias": "D5", + "cst_type": "term", + "convention": "", + "term_raw": "реализующие @{X2|nomn,plur}", + "term_resolved": "реализующие методы", + "term_forms": [], + "definition_formal": "Pr2(S2)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 15, + "fields": { + "schema": 1, + "order": 15, + "alias": "D6", + "cst_type": "term", + "convention": "", + "term_raw": "вторичная @{X1|nomn,sing}", + "term_resolved": "вторичная функция", + "term_forms": [], + "definition_formal": "Pr2(S3)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 16, + "fields": { + "schema": 1, + "order": 16, + "alias": "F4", + "cst_type": "function", + "convention": "", + "term_raw": "@{D6|nomn,plur} набора @{X2|gent,plur}", + "term_resolved": "вторичные функции набора методов", + "term_forms": [], + "definition_formal": "[α∈ℬ(X2)] Pr2(Fi1[α](S3))", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 17, + "fields": { + "schema": 1, + "order": 17, + "alias": "A1", + "cst_type": "axiom", + "convention": "", + "term_raw": "непустота декомпозиции", + "term_resolved": "непустота декомпозиции", + "term_forms": [], + "definition_formal": "∀α∈D2 α≠∅", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 18, + "fields": { + "schema": 1, + "order": 18, + "alias": "F5", + "cst_type": "function", + "convention": "", + "term_raw": "опосредованно @{D3|nomn,plur}", + "term_resolved": "опосредованно декомпозирующие функции", + "term_forms": [], + "definition_formal": "[α∈X1] R{ξ:=F2[α] | ξ∪F1[ξ]}", + "definition_raw": "@{X1|nomn,plur}, участвующие в @{D2|loct,plur} данной @{X1|gent,sing} или других @{F5|gent,plur}", + "definition_resolved": "функции, участвующие в альтернативах декомпозиции данной функции или других опосредованно декомпозирующих функций" + } +}, +{ + "model": "rsform.constituenta", + "pk": 19, + "fields": { + "schema": 1, + "order": 19, + "alias": "A2", + "cst_type": "axiom", + "convention": "", + "term_raw": "ацикличность @{S1|gent,sing}", + "term_resolved": "ацикличность декомпозиции", + "term_forms": [], + "definition_formal": "∀ξ∈D1 ξ∉F5[ξ]", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 20, + "fields": { + "schema": 1, + "order": 20, + "alias": "D7", + "cst_type": "term", + "convention": "", + "term_raw": "полифункциональные @{X2|nomn,plur}", + "term_resolved": "полифункциональные методы", + "term_forms": [], + "definition_formal": "D{ξ∈D5 | card(F3[ξ])>1}", + "definition_raw": "@{X2|nomn,plur}, реализующиее более 1 @{X1|nomn,plur}", + "definition_resolved": "методы, реализующиее более 1 функции" + } +}, +{ + "model": "rsform.constituenta", + "pk": 21, + "fields": { + "schema": 1, + "order": 21, + "alias": "P1", + "cst_type": "predicate", + "convention": "", + "term_raw": "непротиворечивый набор @{S1|gent,plur}", + "term_resolved": "непротиворечивый набор декомпозиций", + "term_forms": [], + "definition_formal": "[α∈ℬ(S1)] card(α)=card(Pr1(α))", + "definition_raw": "подмножество @{S1|gent,sing}, в котором для каждой @{X1|gent,sing} выбрана максимум одна @{D2|nomn,sing}", + "definition_resolved": "подмножество декомпозиции, в котором для каждой функции выбрана максимум одна альтернатива декомпозиции" + } +}, +{ + "model": "rsform.constituenta", + "pk": 22, + "fields": { + "schema": 1, + "order": 22, + "alias": "F6", + "cst_type": "function", + "convention": "", + "term_raw": "недекомпозируемые @{X1|nomn,plur} набора @{S1|gent,plur}", + "term_resolved": "недекомпозируемые функции набора декомпозиций", + "term_forms": [], + "definition_formal": "[α∈ℬ(S1)] red(Pr2(α))\\Pr1(α)", + "definition_raw": "@{X1|nomn,plur}, не являющиеся @{D1|ablt,plur} в рамках данного набора @{S1|gent,plur}", + "definition_resolved": "функции, не являющиеся декомпозируемыми функциями в рамках данного набора декомпозиций" + } +}, +{ + "model": "rsform.constituenta", + "pk": 23, + "fields": { + "schema": 1, + "order": 23, + "alias": "P2", + "cst_type": "predicate", + "convention": "", + "term_raw": "функциональная модель", + "term_resolved": "функциональная модель", + "term_forms": [], + "definition_formal": "[α∈ℬ(X1), σ∈ℬ(S1)] P1[σ] & F6[σ]⊆α & S4⊆Pr1(σ)∪α", + "definition_raw": "пара: предлагаемые @{D4|nomn,plur} и @{P1|nomn,sing}, которые обеспечивает логическую реализацию всех @{S4|gent,plur}", + "definition_resolved": "пара: предлагаемые реализуемые напрямую функции и непротиворечивый набор декомпозиций, которые обеспечивает логическую реализацию всех первичных функций" + } +}, +{ + "model": "rsform.constituenta", + "pk": 24, + "fields": { + "schema": 1, + "order": 24, + "alias": "P3", + "cst_type": "predicate", + "convention": "", + "term_raw": "методное замыкание", + "term_resolved": "методное замыкание", + "term_forms": [], + "definition_formal": "[α∈ℬ(S2), σ∈ℬ(S1)] P2[Pr1(α), σ] & F4[Pr2(α)]⊆Pr1(α)∪Pr1(σ)", + "definition_raw": "пара: подмножество @{S2|gent,sing} и @{P1|nomn,sing}, которые обеспечивает методную реализацию всех @{S4|gent,plur} и всех @{D6|gent,plur} @{D5|gent,plur}", + "definition_resolved": "пара: подмножество функционально-методного отношения и непротиворечивый набор декомпозиций, которые обеспечивает методную реализацию всех первичных функций и всех вторичных функций реализующих методов" + } +}, +{ + "model": "rsform.constituenta", + "pk": 25, + "fields": { + "schema": 2, + "order": 1, + "alias": "X1", + "cst_type": "basic", + "convention": "Элементы входов и выходов процессо", + "term_raw": "объекты", + "term_resolved": "объекты", + "term_forms": [], + "definition_formal": "", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 26, + "fields": { + "schema": 2, + "order": 2, + "alias": "S1", + "cst_type": "structure", + "convention": "", + "term_raw": "процессы", + "term_resolved": "процессы", + "term_forms": [], + "definition_formal": "ℬ(ℬ(X1)×ℬ(X1))", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 27, + "fields": { + "schema": 2, + "order": 3, + "alias": "D1", + "cst_type": "term", + "convention": "", + "term_raw": "полные @{D2|nomn,plur}", + "term_resolved": "полные входы", + "term_forms": [], + "definition_formal": "Pr1(S1)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 28, + "fields": { + "schema": 2, + "order": 4, + "alias": "D2", + "cst_type": "term", + "convention": "", + "term_raw": "входы", + "term_resolved": "входы", + "term_forms": [], + "definition_formal": "red(Pr1(S1))", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 29, + "fields": { + "schema": 2, + "order": 5, + "alias": "D3", + "cst_type": "term", + "convention": "", + "term_raw": "полные @{D4|nomn,plur}", + "term_resolved": "полные выходы", + "term_forms": [], + "definition_formal": "Pr2(S1)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 30, + "fields": { + "schema": 2, + "order": 6, + "alias": "D4", + "cst_type": "term", + "convention": "", + "term_raw": "выходы", + "term_resolved": "выходы", + "term_forms": [], + "definition_formal": "red(Pr2(S1))", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 31, + "fields": { + "schema": 2, + "order": 7, + "alias": "A1", + "cst_type": "axiom", + "convention": "", + "term_raw": "", + "term_resolved": "", + "term_forms": [], + "definition_formal": "∀α∈D1 α≠∅ & ∀β∈D3 β≠∅", + "definition_raw": "@{D1|nomn,sing} и @{D3|nomn,sing} @{S1|gent,sing} не пусты", + "definition_resolved": "полный вход и полный выход процесса не пусты" + } +}, +{ + "model": "rsform.constituenta", + "pk": 32, + "fields": { + "schema": 2, + "order": 8, + "alias": "F1", + "cst_type": "function", + "convention": "", + "term_raw": "зависящие от набора @{X1|gent,plur} @{S1|nomn,plur}", + "term_resolved": "зависящие от набора объектов процессы", + "term_forms": [], + "definition_formal": "[α∈ℬ(X1)] D{σ∈S1 | α⊆pr1(σ)}", + "definition_raw": "@{S1|nomn,plur}, @{D1|nomn,plur} которых содержат хотя бы один @{X1|nomn,sing} из данного набора", + "definition_resolved": "процессы, полные входы которых содержат хотя бы один объект из данного набора" + } +}, +{ + "model": "rsform.constituenta", + "pk": 33, + "fields": { + "schema": 2, + "order": 9, + "alias": "F2", + "cst_type": "function", + "convention": "", + "term_raw": "обеспечивающие набор @{X1|gent,plur} @{S1|nomn,plur}", + "term_resolved": "обеспечивающие набор объектов процессы", + "term_forms": [], + "definition_formal": "[α∈ℬ(X1)] D{σ∈S1 | α⊆pr2(σ)}", + "definition_raw": "@{S1|nomn,plur}, @{D3|nomn,plur} которых содержат хотя бы один @{X1|nomn,sing} из данного набора", + "definition_resolved": "процессы, полные выходы которых содержат хотя бы один объект из данного набора" + } +}, +{ + "model": "rsform.constituenta", + "pk": 34, + "fields": { + "schema": 2, + "order": 10, + "alias": "F3", + "cst_type": "function", + "convention": "", + "term_raw": "@{F4|nomn,plur} набором @{S1|gent,plur}", + "term_resolved": "обусловленные процессы набором процессов", + "term_forms": [], + "definition_formal": "[α∈ℬ(S1)] F1[red(Pr2(α))]", + "definition_raw": "@{S1|nomn,plur}, зависящие от @{D3|gent,sing} хотя бы одного из данного набора @{S1|gent,plur}", + "definition_resolved": "процессы, зависящие от полного выхода хотя бы одного из данного набора процессов" + } +}, +{ + "model": "rsform.constituenta", + "pk": 35, + "fields": { + "schema": 2, + "order": 11, + "alias": "F4", + "cst_type": "function", + "convention": "", + "term_raw": "обусловленные @{S1|nomn,plur}", + "term_resolved": "обусловленные процессы", + "term_forms": [], + "definition_formal": "[α∈S1] F1[pr2(α)]", + "definition_raw": "@{S1|nomn,plur}, зависящие от @{D3|gent,sing} данного @{S1|gent,sing}", + "definition_resolved": "процессы, зависящие от полного выхода данного процесса" + } +}, +{ + "model": "rsform.constituenta", + "pk": 36, + "fields": { + "schema": 2, + "order": 12, + "alias": "F5", + "cst_type": "function", + "convention": "", + "term_raw": "@{F6|nomn,plur} для набора @{S1|gent,plur}", + "term_resolved": "обуславливающие процессы для набора процессов", + "term_forms": [], + "definition_formal": "[α∈ℬ(S1)] F2[red(Pr1(α))]", + "definition_raw": "@{S1|nomn,plur}, обеспечивающие @{D2|nomn,plur} хотя бы одного из данного набора @{S1|gent,plur}", + "definition_resolved": "процессы, обеспечивающие входы хотя бы одного из данного набора процессов" + } +}, +{ + "model": "rsform.constituenta", + "pk": 37, + "fields": { + "schema": 2, + "order": 13, + "alias": "F6", + "cst_type": "function", + "convention": "", + "term_raw": "обуславливающие @{S1|nomn,plur}", + "term_resolved": "обуславливающие процессы", + "term_forms": [], + "definition_formal": "[α∈S1] F2[pr1(α)]", + "definition_raw": "@{S1|nomn,plur}, от @{D3|gent,sing} которых зависит данный @{S1|nomn,sing}", + "definition_resolved": "процессы, от полного выхода которых зависит данный процесс" + } +}, +{ + "model": "rsform.constituenta", + "pk": 38, + "fields": { + "schema": 2, + "order": 14, + "alias": "F7", + "cst_type": "function", + "convention": "", + "term_raw": "опосредованно связанные @{S1|nomn,plur}", + "term_resolved": "опосредованно связанные процессы", + "term_forms": [], + "definition_formal": "[α∈S1] R{ξ:=F4[α]∪F6[α] | ξ∪F3[ξ]∪F5[ξ]}", + "definition_raw": "@{S1|nomn,plur}, обусловленные данным @{S1|ablt,sing}, обуславливающие данный процесс или обуславлиающие/обусловленные другим @{F7|ablt,sing}", + "definition_resolved": "процессы, обусловленные данным процессом, обуславливающие данный процесс или обуславлиающие/обусловленные другим опосредованно связанным процессом" + } +}, +{ + "model": "rsform.constituenta", + "pk": 39, + "fields": { + "schema": 2, + "order": 15, + "alias": "P1", + "cst_type": "predicate", + "convention": "", + "term_raw": "сеть @{S1|gent,plur}", + "term_resolved": "сеть процессов", + "term_forms": [], + "definition_formal": "[α∈ℬ(S1)] ∀ξ∈α F7[ξ]=α", + "definition_raw": "связное по @{D2|datv,plur} и @{D4|datv,plur} множество @{S1|gent,plur}", + "definition_resolved": "связное по входам и выходам множество процессов" + } +}, +{ + "model": "rsform.constituenta", + "pk": 40, + "fields": { + "schema": 2, + "order": 16, + "alias": "F8", + "cst_type": "function", + "convention": "", + "term_raw": "@{D1|nomn,sing} @{P1|gent,sing}", + "term_resolved": "полный вход сети процессов", + "term_forms": [], + "definition_formal": "[α∈ℬ(S1)] red(Pr1(α))\\red(Pr2(α))", + "definition_raw": "совокупность @{D2|gent,plur} @{S1|gent,plur} @{P1|gent,sing}, не являющихся", + "definition_resolved": "совокупность входов процессов сети процессов, не являющихся" + } +}, +{ + "model": "rsform.constituenta", + "pk": 41, + "fields": { + "schema": 2, + "order": 17, + "alias": "F9", + "cst_type": "function", + "convention": "", + "term_raw": "@{D3|nomn,sing} @{P1|gent,sing}", + "term_resolved": "полный выход сети процессов", + "term_forms": [], + "definition_formal": "[α∈ℬ(S1)] red(Pr2(α))\\red(Pr1(α))", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 42, + "fields": { + "schema": 2, + "order": 18, + "alias": "F10", + "cst_type": "function", + "convention": "", + "term_raw": "граница @{P1|gent,sing}", + "term_resolved": "граница сети процессов", + "term_forms": [], + "definition_formal": "[α∈ℬ(S1)] (F8[α], F9[α])", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 43, + "fields": { + "schema": 2, + "order": 19, + "alias": "F11", + "cst_type": "function", + "convention": "", + "term_raw": "внутренние @{X1|nomn,plur} @{P1|gent,sing}", + "term_resolved": "внутренние объекты сети процессов", + "term_forms": [], + "definition_formal": "[α∈ℬ(S1)] red(Pr1(α))∩red(Pr2(α))", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 44, + "fields": { + "schema": 2, + "order": 20, + "alias": "P2", + "cst_type": "predicate", + "convention": "", + "term_raw": "альтернативность @{P1|gent,plur}", + "term_resolved": "альтернативность сетей процессов", + "term_forms": [], + "definition_formal": "[α∈ℬ(S1), β∈ℬ(S1)] F10[α] = F10[β]", + "definition_raw": "@{P1|gent,sing}, границы которых совпадают", + "definition_resolved": "сети процессов, границы которых совпадают" + } +}, +{ + "model": "rsform.constituenta", + "pk": 45, + "fields": { + "schema": 3, + "order": 1, + "alias": "X1", + "cst_type": "basic", + "convention": "", + "term_raw": "Объекты", + "term_resolved": "Объекты", + "term_forms": [], + "definition_formal": "", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 46, + "fields": { + "schema": 3, + "order": 2, + "alias": "X2", + "cst_type": "basic", + "convention": "", + "term_raw": "Аспекты", + "term_resolved": "Аспекты", + "term_forms": [], + "definition_formal": "", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 47, + "fields": { + "schema": 3, + "order": 3, + "alias": "S1", + "cst_type": "structure", + "convention": "", + "term_raw": "Объект-аспектное отношение", + "term_resolved": "Объект-аспектное отношение", + "term_forms": [], + "definition_formal": "ℬ(X1×X2)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 48, + "fields": { + "schema": 3, + "order": 4, + "alias": "F1", + "cst_type": "function", + "convention": "", + "term_raw": "@{X1|nomn,plur} @{X2|gent,sing}", + "term_resolved": "Объекты Аспекта", + "term_forms": [], + "definition_formal": "[α∈X2] Pr1(Fi2[{α}](S1))", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 49, + "fields": { + "schema": 3, + "order": 5, + "alias": "D1", + "cst_type": "term", + "convention": "", + "term_raw": "Наблюдаемые @{X2|nomn,plur}", + "term_resolved": "Наблюдаемые Аспекты", + "term_forms": [], + "definition_formal": "Pr2(S1)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 50, + "fields": { + "schema": 3, + "order": 6, + "alias": "D2", + "cst_type": "term", + "convention": "", + "term_raw": "Аспекты без объектов", + "term_resolved": "Аспекты без объектов", + "term_forms": [], + "definition_formal": "D{ξ∈X2 | card(F1[ξ]) = 0}", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 51, + "fields": { + "schema": 3, + "order": 7, + "alias": "D3", + "cst_type": "term", + "convention": "", + "term_raw": "Аспекты без объектов-2", + "term_resolved": "Аспекты без объектов-2", + "term_forms": [], + "definition_formal": "X2\\D1", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 52, + "fields": { + "schema": 3, + "order": 8, + "alias": "D4", + "cst_type": "term", + "convention": "", + "term_raw": "Монообъектные аспекты", + "term_resolved": "Монообъектные аспекты", + "term_forms": [], + "definition_formal": "D{ξ∈X2 | card(F1[ξ]) = 1}", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 53, + "fields": { + "schema": 3, + "order": 9, + "alias": "F2", + "cst_type": "function", + "convention": "", + "term_raw": "Аспекты объекта", + "term_resolved": "Аспекты объекта", + "term_forms": [], + "definition_formal": "[α∈X1] Pr2(Fi1[{α}](S1))", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 54, + "fields": { + "schema": 3, + "order": 10, + "alias": "D5", + "cst_type": "term", + "convention": "", + "term_raw": "Объекты без аспектов", + "term_resolved": "Объекты без аспектов", + "term_forms": [], + "definition_formal": "X1\\Pr1(S1)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 55, + "fields": { + "schema": 3, + "order": 11, + "alias": "A1", + "cst_type": "axiom", + "convention": "", + "term_raw": "Все объекты имеют хотя бы один аспект", + "term_resolved": "Все объекты имеют хотя бы один аспект", + "term_forms": [], + "definition_formal": "D5=∅", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 56, + "fields": { + "schema": 3, + "order": 12, + "alias": "D6", + "cst_type": "term", + "convention": "", + "term_raw": "Объекты с одинаковым набором аспектов", + "term_resolved": "Объекты с одинаковым набором аспектов", + "term_forms": [], + "definition_formal": "D{(ξ1,ξ2)∈X1×X1 | F2[ξ1] = F2[ξ2] }", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 57, + "fields": { + "schema": 4, + "order": 1, + "alias": "X1", + "cst_type": "basic", + "convention": "", + "term_raw": "конституенты", + "term_resolved": "конституенты", + "term_forms": [], + "definition_formal": "", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 58, + "fields": { + "schema": 4, + "order": 2, + "alias": "S1", + "cst_type": "structure", + "convention": "", + "term_raw": "граф термов", + "term_resolved": "граф термов", + "term_forms": [], + "definition_formal": "ℬ(X1×X1)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 59, + "fields": { + "schema": 4, + "order": 3, + "alias": "S2", + "cst_type": "structure", + "convention": "", + "term_raw": "базовые понятия", + "term_resolved": "базовые понятия", + "term_forms": [], + "definition_formal": "ℬ(X1)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 60, + "fields": { + "schema": 4, + "order": 4, + "alias": "S3", + "cst_type": "structure", + "convention": "", + "term_raw": "ключевые понятия", + "term_resolved": "ключевые понятия", + "term_forms": [], + "definition_formal": "ℬ(X1)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 61, + "fields": { + "schema": 4, + "order": 5, + "alias": "S4", + "cst_type": "structure", + "convention": "", + "term_raw": "утверждения", + "term_resolved": "утверждения", + "term_forms": [], + "definition_formal": "ℬ(X1)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 62, + "fields": { + "schema": 4, + "order": 6, + "alias": "A1", + "cst_type": "axiom", + "convention": "", + "term_raw": "антирефлексивность", + "term_resolved": "антирефлексивность", + "term_forms": [], + "definition_formal": "∀α∈X1 (α,α)∉S1", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 63, + "fields": { + "schema": 4, + "order": 7, + "alias": "A2", + "cst_type": "axiom", + "convention": "", + "term_raw": "ацикличность", + "term_resolved": "ацикличность", + "term_forms": [], + "definition_formal": "∀ξ∈ℬ(S1) Pr1(ξ)≠Pr2(ξ)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 64, + "fields": { + "schema": 4, + "order": 8, + "alias": "D1", + "cst_type": "term", + "convention": "", + "term_raw": "корневые @{X1|plur,nomn} (базисные множества)", + "term_resolved": "корневые конституенты (базисные множества)", + "term_forms": [], + "definition_formal": "Pr1(S1)\\Pr2(S1)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 65, + "fields": { + "schema": 4, + "order": 9, + "alias": "D2", + "cst_type": "term", + "convention": "", + "term_raw": "листовые @{X1|plur,nomn}", + "term_resolved": "листовые конституенты", + "term_forms": [], + "definition_formal": "Pr2(S1)\\Pr1(S1)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 66, + "fields": { + "schema": 4, + "order": 10, + "alias": "A3", + "cst_type": "axiom", + "convention": "", + "term_raw": "листовые @{X1|plur,nomn} являются ключевыми или базовыми", + "term_resolved": "листовые конституенты являются ключевыми или базовыми", + "term_forms": [], + "definition_formal": "D2⊆(S3∪S2)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 67, + "fields": { + "schema": 4, + "order": 11, + "alias": "F1", + "cst_type": "function", + "convention": "", + "term_raw": "множество конституент, определяющих данный набор конституент", + "term_resolved": "множество конституент, определяющих данный набор конституент", + "term_forms": [], + "definition_formal": "[σ∈ℬ(X1)] Pr1(Fi2[σ](S1))", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 68, + "fields": { + "schema": 4, + "order": 12, + "alias": "F2", + "cst_type": "function", + "convention": "", + "term_raw": "выделение базиса", + "term_resolved": "выделение базиса", + "term_forms": [], + "definition_formal": "[σ∈ℬ(X1)] R{ ξ:=σ | ξ∪F1[ξ] }", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 69, + "fields": { + "schema": 4, + "order": 13, + "alias": "D3", + "cst_type": "term", + "convention": "", + "term_raw": "ядро концептуальной схемы", + "term_resolved": "ядро концептуальной схемы", + "term_forms": [], + "definition_formal": "S2∪F2[S4]", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 70, + "fields": { + "schema": 4, + "order": 14, + "alias": "D4", + "cst_type": "term", + "convention": "", + "term_raw": "тело теории", + "term_resolved": "тело теории", + "term_forms": [], + "definition_formal": "X1\\D3", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 71, + "fields": { + "schema": 5, + "order": 1, + "alias": "X1", + "cst_type": "basic", + "convention": "", + "term_raw": "имена", + "term_resolved": "имена", + "term_forms": [], + "definition_formal": "", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 72, + "fields": { + "schema": 5, + "order": 2, + "alias": "S1", + "cst_type": "structure", + "convention": "", + "term_raw": "факторизации", + "term_resolved": "факторизации", + "term_forms": [], + "definition_formal": "ℬℬ(X1×ℬ(X1))", + "definition_raw": "полифакторструктура", + "definition_resolved": "полифакторструктура" + } +}, +{ + "model": "rsform.constituenta", + "pk": 73, + "fields": { + "schema": 5, + "order": 3, + "alias": "D1", + "cst_type": "term", + "convention": "", + "term_raw": "отнесение имен к классам", + "term_resolved": "отнесение имен к классам", + "term_forms": [], + "definition_formal": "red(S1)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 74, + "fields": { + "schema": 5, + "order": 4, + "alias": "D2", + "cst_type": "term", + "convention": "", + "term_raw": "классы", + "term_resolved": "классы", + "term_forms": [], + "definition_formal": "Pr1(D1)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 75, + "fields": { + "schema": 5, + "order": 5, + "alias": "D3", + "cst_type": "term", + "convention": "", + "term_raw": "составы классов", + "term_resolved": "составы классов", + "term_forms": [ + { + "text": "состав класса", + "tags": "sing,nomn" + }, + { + "text": "состава класса", + "tags": "sing,gent" + }, + { + "text": "составу класса", + "tags": "sing,datv" + }, + { + "text": "составом класса", + "tags": "sing,ablt" + }, + { + "text": "состав класса", + "tags": "sing,accs" + }, + { + "text": "составе класса", + "tags": "sing,loct" + } + ], + "definition_formal": "Pr2(D1)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 76, + "fields": { + "schema": 5, + "order": 6, + "alias": "D4", + "cst_type": "term", + "convention": "", + "term_raw": "факторизуемые @{X1|plur,nomn}", + "term_resolved": "факторизуемые имена", + "term_forms": [], + "definition_formal": "red(Pr2(D1))", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 77, + "fields": { + "schema": 5, + "order": 7, + "alias": "D5", + "cst_type": "term", + "convention": "", + "term_raw": "исходные @{X1|plur,nomn}", + "term_resolved": "исходные имена", + "term_forms": [], + "definition_formal": "D4\\D2", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 78, + "fields": { + "schema": 5, + "order": 8, + "alias": "D6", + "cst_type": "term", + "convention": "", + "term_raw": "фактормножества", + "term_resolved": "фактормножества", + "term_forms": [], + "definition_formal": "I{σ | α:∈S1; σ:=F1[α]}", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 79, + "fields": { + "schema": 5, + "order": 9, + "alias": "D7", + "cst_type": "term", + "convention": "", + "term_raw": "факторизуемые множества @{X1|plur,gent}", + "term_resolved": "факторизуемые множества имён", + "term_forms": [], + "definition_formal": "I{σ | α:∈S1; σ:=F2[α]}", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 80, + "fields": { + "schema": 5, + "order": 10, + "alias": "A1", + "cst_type": "axiom", + "convention": "", + "term_raw": "каждая @{S1|sing,nomn} на более одного класса", + "term_resolved": "каждая факторизация на более одного класса", + "term_forms": [], + "definition_formal": "∀σ∈D6 card(σ)>1", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 81, + "fields": { + "schema": 5, + "order": 11, + "alias": "A2", + "cst_type": "axiom", + "convention": "", + "term_raw": "непустота каждого @{D3|sing,gent}", + "term_resolved": "непустота каждого состава классов", + "term_forms": [], + "definition_formal": "∀α∈D3 α≠∅", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 82, + "fields": { + "schema": 5, + "order": 12, + "alias": "F1", + "cst_type": "function", + "convention": "", + "term_raw": "@{D6|sing,nomn} данной @{S1|sing,gent}", + "term_resolved": "фактормножество данной факторизации", + "term_forms": [], + "definition_formal": "[σ∈S1] Pr1(σ)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 83, + "fields": { + "schema": 5, + "order": 13, + "alias": "F2", + "cst_type": "function", + "convention": "", + "term_raw": "@{D7|sing,nomn} данной @{S1|plur,nomn}", + "term_resolved": "факторизуемое множество имён данной факторизации", + "term_forms": [], + "definition_formal": "[σ∈S1] red(Pr2(σ))", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 84, + "fields": { + "schema": 5, + "order": 14, + "alias": "A3", + "cst_type": "axiom", + "convention": "", + "term_raw": "единственность @{D5|plur,gent}", + "term_resolved": "единственность исходных имён", + "term_forms": [], + "definition_formal": "∀σ∈D7 (σ=D5 ∨ σ∩D5=∅)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 85, + "fields": { + "schema": 5, + "order": 15, + "alias": "F3", + "cst_type": "function", + "convention": "", + "term_raw": "альтернативные составы данного @{D2|sing,gent}", + "term_resolved": "альтернативные составы данного класса", + "term_forms": [], + "definition_formal": "[α∈D2] Pr2(Fi1[{α}](D1))", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 86, + "fields": { + "schema": 5, + "order": 16, + "alias": "F4", + "cst_type": "function", + "convention": "", + "term_raw": "состав данного набора @{D2|plur,gent}", + "term_resolved": "состав данного набора классов", + "term_forms": [], + "definition_formal": "[α∈ℬ(D2)] red(Pr2(Fi1[α](D1)))", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 87, + "fields": { + "schema": 5, + "order": 17, + "alias": "F5", + "cst_type": "function", + "convention": "", + "term_raw": "@{D3|sing,nomn} данного @{D2|sing,gent}", + "term_resolved": "состав классов данного класса", + "term_forms": [], + "definition_formal": "[α∈D2] debool(F3[α])", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 88, + "fields": { + "schema": 5, + "order": 18, + "alias": "D8", + "cst_type": "term", + "convention": "", + "term_raw": "@{D2|plur,nomn} с альтернативами @{D3|sing,gent}", + "term_resolved": "классы с альтернативами состава классов", + "term_forms": [], + "definition_formal": "D{ξ∈D2 | card(F3[ξ])>1}", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 89, + "fields": { + "schema": 5, + "order": 19, + "alias": "A4", + "cst_type": "axiom", + "convention": "", + "term_raw": "единственность состава @{D2|sing,gent}", + "term_resolved": "единственность состава класса", + "term_forms": [], + "definition_formal": "D8=∅", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 90, + "fields": { + "schema": 5, + "order": 20, + "alias": "D9", + "cst_type": "term", + "convention": "", + "term_raw": "пары пересекающихся @{D6|plur,gent}", + "term_resolved": "пары пересекающихся фактормножеств", + "term_forms": [], + "definition_formal": "D{(α,β)∈D6×D6 | α≠β & α∩β≠∅}", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 91, + "fields": { + "schema": 5, + "order": 21, + "alias": "A5", + "cst_type": "axiom", + "convention": "", + "term_raw": "непересечение @{D6|plur,gent}", + "term_resolved": "непересечение фактормножеств", + "term_forms": [], + "definition_formal": "D9=∅", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 92, + "fields": { + "schema": 5, + "order": 22, + "alias": "D10", + "cst_type": "term", + "convention": "", + "term_raw": "отнесение @{D4|sing,gent} к @{D2|sing,datv}", + "term_resolved": "отнесение факторизуемого имени к классу", + "term_forms": [], + "definition_formal": "I{(β,α) | α:∈D2; σ:=F5[α]; β:∈σ}", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 93, + "fields": { + "schema": 5, + "order": 23, + "alias": "F6", + "cst_type": "function", + "convention": "", + "term_raw": "@{D2|plur,nomn}, к которым отнесено данное @{D4|sing,nomn}", + "term_resolved": "классы, к которым отнесено данное факторизуемое имя", + "term_forms": [], + "definition_formal": "[α∈D4] Pr1(Fi2[{α}](D10))", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 94, + "fields": { + "schema": 5, + "order": 24, + "alias": "D11", + "cst_type": "term", + "convention": "", + "term_raw": "пара @{D2|plur,gent}, пересекающихся по @{D3|sing,datv}", + "term_resolved": "пара классов, пересекающихся по составу классов", + "term_forms": [], + "definition_formal": "D{(α,β)∈D2×D2 | α≠β & F5[α]∩F5[β]≠∅}", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 95, + "fields": { + "schema": 5, + "order": 25, + "alias": "A6", + "cst_type": "axiom", + "convention": "", + "term_raw": "условие непересечения @{D3|plur,gent} для @{S1|plur,gent}", + "term_resolved": "условие непересечения составов классов для факторизаций", + "term_forms": [], + "definition_formal": "∀σ∈S1 (F1[σ]×F1[σ])∩D11=∅", + "definition_raw": "В рамках одной @{S1|sing,gent} @{D3|plur,nomn} не пересекаются", + "definition_resolved": "В рамках одной факторизации составы классов не пересекаются" + } +}, +{ + "model": "rsform.constituenta", + "pk": 96, + "fields": { + "schema": 5, + "order": 26, + "alias": "A7", + "cst_type": "axiom", + "convention": "", + "term_raw": "условие полноты @{S1|plur,gent}", + "term_resolved": "условие полноты факторизаций", + "term_forms": [], + "definition_formal": "∀σ∈S1 (F2[σ]∈D6 ∨ F2[σ]=D5)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 97, + "fields": { + "schema": 5, + "order": 27, + "alias": "D12", + "cst_type": "term", + "convention": "", + "term_raw": "отношение последовательных @{S1|plur,gent}", + "term_resolved": "отношение последовательных факторизаций", + "term_forms": [], + "definition_formal": "D{(α,β)∈S1×S1 | α≠β & F1[α]=F2[β] }", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 98, + "fields": { + "schema": 5, + "order": 28, + "alias": "T1", + "cst_type": "theorem", + "convention": "Следствие A3&A5", + "term_raw": "ацикличность разбиений между уровнями факторизации", + "term_resolved": "ацикличность разбиений между уровнями факторизации", + "term_forms": [], + "definition_formal": "∀σ∈ℬ(D12) Pr1(σ)≠Pr2(σ)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 99, + "fields": { + "schema": 5, + "order": 29, + "alias": "T2", + "cst_type": "theorem", + "convention": "", + "term_raw": "", + "term_resolved": "", + "term_forms": [], + "definition_formal": "card(D4)=card(D11)", + "definition_raw": "условие сведЕния полифакторструктуры к факторструктуре", + "definition_resolved": "условие сведЕния полифакторструктуры к факторструктуре" + } +}, +{ + "model": "rsform.constituenta", + "pk": 100, + "fields": { + "schema": 5, + "order": 30, + "alias": "D13", + "cst_type": "term", + "convention": "", + "term_raw": "исходные @{S1|plur,nomn}", + "term_resolved": "исходные факторизации", + "term_forms": [], + "definition_formal": "D{σ∈S1 | F2[σ]=D5}", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 101, + "fields": { + "schema": 5, + "order": 31, + "alias": "D14", + "cst_type": "term", + "convention": "", + "term_raw": "конечные @{S1|plur,nomn}", + "term_resolved": "конечные факторизации", + "term_forms": [], + "definition_formal": "D{σ∈S1 | F1[σ]∉D7}", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 102, + "fields": { + "schema": 5, + "order": 32, + "alias": "F7", + "cst_type": "function", + "convention": "", + "term_raw": "последующие @{S1|plur,nomn} за данными набором @{S1|plur,gent}", + "term_resolved": "последующие факторизации за данными набором факторизаций", + "term_forms": [], + "definition_formal": "[σ∈ℬ(S1)] Pr2(Fi1[σ](D12))", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 103, + "fields": { + "schema": 5, + "order": 33, + "alias": "F8", + "cst_type": "function", + "convention": "", + "term_raw": "\"потомки\" данной @{S1|plur,nomn}", + "term_resolved": "\"потомки\" данной факторизации", + "term_forms": [], + "definition_formal": "[α∈S1] R{ ξ:={α} | F7[ξ]≠∅ | ξ∪F7[ξ]} \\ {α}", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 104, + "fields": { + "schema": 5, + "order": 34, + "alias": "D15", + "cst_type": "term", + "convention": "", + "term_raw": "отношение достижимости @{S1|plur,gent}", + "term_resolved": "отношение достижимости факторизаций", + "term_forms": [], + "definition_formal": "I{ (α,β) | α:∈S1; σ:=F8[α]; β:∈σ }", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 105, + "fields": { + "schema": 5, + "order": 35, + "alias": "F9", + "cst_type": "function", + "convention": "", + "term_raw": "раскрытие классов факторизации на один уровень", + "term_resolved": "раскрытие классов факторизации на один уровень", + "term_forms": [], + "definition_formal": "[α∈ℬ(X1×ℬ(X1))] I{(ξ,γ) | σ:∈α; ξ:=pr1(σ); γ:=F4[pr2(σ)] }", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 106, + "fields": { + "schema": 5, + "order": 36, + "alias": "F10", + "cst_type": "function", + "convention": "", + "term_raw": "факторизация, аналогичная данной паре связанных факторизаций", + "term_resolved": "факторизация, аналогичная данной паре связанных факторизаций", + "term_forms": [], + "definition_formal": "[σ∈D15] R{ξ:=pr2(σ) | F1[pr1(σ)]≠F2[ξ] | F9[ξ] }", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 107, + "fields": { + "schema": 6, + "order": 1, + "alias": "X1", + "cst_type": "basic", + "convention": "", + "term_raw": "имена", + "term_resolved": "имена", + "term_forms": [], + "definition_formal": "", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 108, + "fields": { + "schema": 6, + "order": 2, + "alias": "S1", + "cst_type": "structure", + "convention": "", + "term_raw": "отнесение @{X1|sing,gent} к @{D1|sing,datv}", + "term_resolved": "отнесение имени к классу", + "term_forms": [], + "definition_formal": "ℬ(X1×X1)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 109, + "fields": { + "schema": 6, + "order": 3, + "alias": "D1", + "cst_type": "term", + "convention": "", + "term_raw": "классы", + "term_resolved": "классы", + "term_forms": [], + "definition_formal": "Pr1(S1)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 110, + "fields": { + "schema": 6, + "order": 4, + "alias": "D2", + "cst_type": "term", + "convention": "", + "term_raw": "@{X1|plur,nomn}, входящие в @{D1|plur,nomn}", + "term_resolved": "имена, входящие в классы", + "term_forms": [], + "definition_formal": "Pr2(S1)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 111, + "fields": { + "schema": 6, + "order": 5, + "alias": "A1", + "cst_type": "axiom", + "convention": "", + "term_raw": "обратная однозначность @{S1|sing,gent}", + "term_resolved": "обратная однозначность отнесения имени к классу", + "term_forms": [], + "definition_formal": "card(S1)=card(D2)", + "definition_raw": "у каждого @{X1|sing,gent} может быть не более одного @{D1|sing,gent}", + "definition_resolved": "у каждого имени может быть не более одного класса" + } +}, +{ + "model": "rsform.constituenta", + "pk": 112, + "fields": { + "schema": 6, + "order": 6, + "alias": "A2", + "cst_type": "axiom", + "convention": "", + "term_raw": "антисимметричность и антирефлексивность @{S1|sing,gent}", + "term_resolved": "антисимметричность и антирефлексивность отнесения имени к классу", + "term_forms": [], + "definition_formal": "∀(α,β)∈S1 (β,α)∉S1", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 113, + "fields": { + "schema": 6, + "order": 7, + "alias": "D3", + "cst_type": "term", + "convention": "", + "term_raw": "исходные элементы @{D6|sing,gent}", + "term_resolved": "исходные элементы факторструктуры", + "term_forms": [], + "definition_formal": "D2\\D1", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 114, + "fields": { + "schema": 6, + "order": 8, + "alias": "D4", + "cst_type": "term", + "convention": "", + "term_raw": "вершины факторструктуры", + "term_resolved": "вершины факторструктуры", + "term_forms": [], + "definition_formal": "D1\\D2", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 115, + "fields": { + "schema": 6, + "order": 9, + "alias": "F1", + "cst_type": "function", + "convention": "", + "term_raw": "\"родительские\" @{D1|plur,nomn} данного набора @{X1|plur,gent}", + "term_resolved": "\"родительские\" классы данного набора имён", + "term_forms": [], + "definition_formal": "[α∈ℬ(D2)] Pr2(Fi1[α](S1))", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 116, + "fields": { + "schema": 6, + "order": 10, + "alias": "F2", + "cst_type": "function", + "convention": "", + "term_raw": "@{X1|plur,nomn}, отнесенные к одному из @{D1|plur,gent} данного набора @{D1|plur,gent}", + "term_resolved": "имена, отнесенные к одному из классов данного набора классов", + "term_forms": [], + "definition_formal": "[α∈ℬ(D1)] Pr1(Fi2[α](S1))", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 117, + "fields": { + "schema": 6, + "order": 11, + "alias": "F3", + "cst_type": "function", + "convention": "", + "term_raw": "\"предковые\" @{D1|plur,nomn} данного @{X1|sing,gent}", + "term_resolved": "\"предковые\" классы данного имени", + "term_forms": [], + "definition_formal": "[α∈X1] R{ξ:=F1[{α}] | ξ∪F1[ξ]}", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 118, + "fields": { + "schema": 6, + "order": 12, + "alias": "D5", + "cst_type": "term", + "convention": "технический терм, определяющий структуру уровней факторструктуры. Интерпретация терма - всегда пустое множество, заданной типизиации", + "term_raw": "структура факторструктуры", + "term_resolved": "структура факторструктуры", + "term_forms": [], + "definition_formal": "I{ σ | α:∈X1; σ:={(α,{α})}; 1≠1}", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 119, + "fields": { + "schema": 6, + "order": 13, + "alias": "F4", + "cst_type": "function", + "convention": "", + "term_raw": "сборка \"потомковых\" @{X1|plur,gent} для @{D1|plur,gent} данного набора @{D1|plur,gent}", + "term_resolved": "сборка \"потомковых\" имён для классов данного набора классов", + "term_forms": [], + "definition_formal": "[α∈ℬ(X1)] I{ (ξ,σ) | ξ:∈α; σ:=F2[{ξ}] }", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 120, + "fields": { + "schema": 6, + "order": 14, + "alias": "D6", + "cst_type": "term", + "convention": "", + "term_raw": "факторструктура", + "term_resolved": "факторструктура", + "term_forms": [], + "definition_formal": "pr2(R{(ξ, σ):=(D3, D5) | F1[ξ]≠∅ | (F1[ξ], σ∪{F4[F1[ξ]]})})", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 121, + "fields": { + "schema": 6, + "order": 15, + "alias": "D7", + "cst_type": "term", + "convention": "", + "term_raw": "фактормножества", + "term_resolved": "фактормножества", + "term_forms": [], + "definition_formal": "I{α | σ:∈D6; α:=Pr1(σ) }", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 122, + "fields": { + "schema": 6, + "order": 16, + "alias": "D8", + "cst_type": "term", + "convention": "", + "term_raw": "количество уровней @{D6|sing,gent}", + "term_resolved": "количество уровней факторструктуры", + "term_forms": [], + "definition_formal": "card(D6)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 123, + "fields": { + "schema": 6, + "order": 17, + "alias": "A3", + "cst_type": "axiom", + "convention": "", + "term_raw": "", + "term_resolved": "", + "term_forms": [], + "definition_formal": "∀α∈D3 card(F3[α])=D8", + "definition_raw": "для каждого исходного элемента количество \"предковых\" классов равно @{D8|sing,gent}", + "definition_resolved": "для каждого исходного элемента количество \"предковых\" классов равно количества уровней факторструктуры" + } +}, +{ + "model": "rsform.constituenta", + "pk": 124, + "fields": { + "schema": 6, + "order": 18, + "alias": "A4", + "cst_type": "axiom", + "convention": "", + "term_raw": "", + "term_resolved": "", + "term_forms": [], + "definition_formal": "card(D4)>1", + "definition_raw": "вершин больше одной", + "definition_resolved": "вершин больше одной" + } +}, +{ + "model": "rsform.constituenta", + "pk": 125, + "fields": { + "schema": 6, + "order": 19, + "alias": "D9", + "cst_type": "term", + "convention": "", + "term_raw": "отношение следования фактормножеств", + "term_resolved": "отношение следования фактормножеств", + "term_forms": [], + "definition_formal": "pr2(R{(ξ, σ):=(F1[D3],{(D3, F1[D3])}) | F1[ξ]≠∅ | (F1[ξ], σ∪{(ξ, F1[ξ])})})", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 126, + "fields": { + "schema": 7, + "order": 1, + "alias": "X1", + "cst_type": "basic", + "convention": "", + "term_raw": "элементы", + "term_resolved": "элементы", + "term_forms": [], + "definition_formal": "", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 127, + "fields": { + "schema": 7, + "order": 2, + "alias": "S1", + "cst_type": "structure", + "convention": "", + "term_raw": "выделенные @{X1|plur,nomn}", + "term_resolved": "выделенные элементы", + "term_forms": [], + "definition_formal": "ℬ(X1)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 128, + "fields": { + "schema": 7, + "order": 3, + "alias": "D1", + "cst_type": "term", + "convention": "", + "term_raw": "невыделенные @{X1|plur,nomn}", + "term_resolved": "невыделенные элементы", + "term_forms": [], + "definition_formal": "X1\\S1", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 129, + "fields": { + "schema": 8, + "order": 1, + "alias": "X1", + "cst_type": "basic", + "convention": "", + "term_raw": "элементы", + "term_resolved": "элементы", + "term_forms": [], + "definition_formal": "", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 130, + "fields": { + "schema": 8, + "order": 2, + "alias": "S1", + "cst_type": "structure", + "convention": "", + "term_raw": "предъявленные @{X1|plur,nomn}", + "term_resolved": "предъявленные элементы", + "term_forms": [], + "definition_formal": "ℬ(X1)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 131, + "fields": { + "schema": 8, + "order": 3, + "alias": "S2", + "cst_type": "structure", + "convention": "", + "term_raw": "выбранный элемент", + "term_resolved": "выбранный элемент", + "term_forms": [], + "definition_formal": "X1", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 132, + "fields": { + "schema": 8, + "order": 4, + "alias": "D1", + "cst_type": "term", + "convention": "", + "term_raw": "непредъявленные @{X1|plur,nomn}", + "term_resolved": "непредъявленные элементы", + "term_forms": [], + "definition_formal": "X1\\S1", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 133, + "fields": { + "schema": 8, + "order": 5, + "alias": "D2", + "cst_type": "term", + "convention": "", + "term_raw": "невыбранные @{X1|plur,nomn}", + "term_resolved": "невыбранные элементы", + "term_forms": [], + "definition_formal": "S1\\{S2}", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 134, + "fields": { + "schema": 8, + "order": 6, + "alias": "A1", + "cst_type": "axiom", + "convention": "", + "term_raw": "выбор осуществляется из @{S1|plur,gent}", + "term_resolved": "выбор осуществляется из предъявленных элементов", + "term_forms": [], + "definition_formal": "S2∈S1", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 135, + "fields": { + "schema": 9, + "order": 1, + "alias": "X1", + "cst_type": "basic", + "convention": "", + "term_raw": "элементы", + "term_resolved": "элементы", + "term_forms": [], + "definition_formal": "", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 136, + "fields": { + "schema": 9, + "order": 2, + "alias": "S1", + "cst_type": "structure", + "convention": "", + "term_raw": "фактор-множества", + "term_resolved": "фактор-множества", + "term_forms": [], + "definition_formal": "ℬℬ(X1)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 137, + "fields": { + "schema": 9, + "order": 3, + "alias": "A1", + "cst_type": "axiom", + "convention": "", + "term_raw": "полнота покрытия", + "term_resolved": "полнота покрытия", + "term_forms": [], + "definition_formal": "red(S1)=X1", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 138, + "fields": { + "schema": 9, + "order": 4, + "alias": "A2", + "cst_type": "axiom", + "convention": "", + "term_raw": "", + "term_resolved": "", + "term_forms": [], + "definition_formal": "∀α,β∈S1 (α≠β ⇒ α∩β=∅)", + "definition_raw": "@{S1|plur,nomn} не пересекаются", + "definition_resolved": "фактор-множества не пересекаются" + } +}, +{ + "model": "rsform.constituenta", + "pk": 139, + "fields": { + "schema": 10, + "order": 1, + "alias": "X1", + "cst_type": "basic", + "convention": "АБСТРАКТНЫЙ", + "term_raw": "элементы", + "term_resolved": "элементы", + "term_forms": [], + "definition_formal": "", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 140, + "fields": { + "schema": 10, + "order": 2, + "alias": "S1", + "cst_type": "structure", + "convention": "АБСТРАКТНЫЙ", + "term_raw": "отношение эквивалентности", + "term_resolved": "отношение эквивалентности", + "term_forms": [], + "definition_formal": "ℬ(X1×X1)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 141, + "fields": { + "schema": 10, + "order": 3, + "alias": "A1", + "cst_type": "axiom", + "convention": "", + "term_raw": "всюдуоопределенность", + "term_resolved": "всюдуоопределенность", + "term_forms": [], + "definition_formal": "Pr1(S1)=X1", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 142, + "fields": { + "schema": 10, + "order": 4, + "alias": "A2", + "cst_type": "axiom", + "convention": "", + "term_raw": "симметричность", + "term_resolved": "симметричность", + "term_forms": [], + "definition_formal": "∀(ξ1,ξ2)∈S1 (ξ2,ξ1)∈S1", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 143, + "fields": { + "schema": 10, + "order": 5, + "alias": "A3", + "cst_type": "axiom", + "convention": "", + "term_raw": "рефлексивность", + "term_resolved": "рефлексивность", + "term_forms": [], + "definition_formal": "∀ξ∈Pr1(S1)∪Pr2(S1) (ξ,ξ)∈S1", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 144, + "fields": { + "schema": 10, + "order": 6, + "alias": "A4", + "cst_type": "axiom", + "convention": "", + "term_raw": "транзитивность", + "term_resolved": "транзитивность", + "term_forms": [], + "definition_formal": "∀(α1,α2),(β1,β2)∈S1 (α2=β1 ⇒ (α1,β2)∈S1)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 145, + "fields": { + "schema": 10, + "order": 7, + "alias": "F1", + "cst_type": "function", + "convention": "", + "term_raw": "Фактор-множество данного @{X1|gent,sing}", + "term_resolved": "Фактор-множество данного элемента", + "term_forms": [], + "definition_formal": "[α∈X1] Pr2(Fi1[{α}](S1))", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 146, + "fields": { + "schema": 10, + "order": 8, + "alias": "D1", + "cst_type": "term", + "convention": "", + "term_raw": "Разбиение на классы эквивалентности", + "term_resolved": "Разбиение на классы эквивалентности", + "term_forms": [], + "definition_formal": "I{ σ | ξ:∈Pr1(S1); σ:=F1[ξ] }", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 147, + "fields": { + "schema": 11, + "order": 1, + "alias": "X1", + "cst_type": "basic", + "convention": "", + "term_raw": "элементы", + "term_resolved": "элементы", + "term_forms": [], + "definition_formal": "", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 148, + "fields": { + "schema": 11, + "order": 2, + "alias": "S1", + "cst_type": "structure", + "convention": "", + "term_raw": "отношение порядка", + "term_resolved": "отношение порядка", + "term_forms": [], + "definition_formal": "ℬ(X1×X1)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 149, + "fields": { + "schema": 11, + "order": 3, + "alias": "A1", + "cst_type": "axiom", + "convention": "", + "term_raw": "рефлексивность", + "term_resolved": "рефлексивность", + "term_forms": [], + "definition_formal": "∀α∈Pr1(S1) (α,α)∈S1", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 150, + "fields": { + "schema": 11, + "order": 4, + "alias": "A2", + "cst_type": "axiom", + "convention": "", + "term_raw": "антирефлексивность", + "term_resolved": "антирефлексивность", + "term_forms": [], + "definition_formal": "∀α∈Pr1(S1) (α,α)∉S1", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 151, + "fields": { + "schema": 11, + "order": 5, + "alias": "A3", + "cst_type": "axiom", + "convention": "", + "term_raw": "симметричность", + "term_resolved": "симметричность", + "term_forms": [], + "definition_formal": "∀(α,β)∈S1 (β,α)∈S1", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 152, + "fields": { + "schema": 11, + "order": 6, + "alias": "A4", + "cst_type": "axiom", + "convention": "", + "term_raw": "антисимметричность", + "term_resolved": "антисимметричность", + "term_forms": [], + "definition_formal": "∀(α,β)∈S1 (α≠β ⇒ (β,α)∉S1)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 153, + "fields": { + "schema": 11, + "order": 7, + "alias": "A5", + "cst_type": "axiom", + "convention": "", + "term_raw": "транзитивность", + "term_resolved": "транзитивность", + "term_forms": [], + "definition_formal": "∀(α,β),(γ,δ)∈S1 (β=γ ⇒ (α,δ)∈S1)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 154, + "fields": { + "schema": 11, + "order": 8, + "alias": "A6", + "cst_type": "axiom", + "convention": "", + "term_raw": "линейность", + "term_resolved": "линейность", + "term_forms": [], + "definition_formal": "∀α∈X1 ∀β∈X1\\{α} ((α,β)∈S1 ∨ (β,α)∈S1)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 155, + "fields": { + "schema": 11, + "order": 9, + "alias": "D1", + "cst_type": "term", + "convention": "", + "term_raw": "минимальные элементы", + "term_resolved": "минимальные элементы", + "term_forms": [], + "definition_formal": "D{α∈X1 | ∀β∈X1\\{α} (β,α)∉S1}", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 156, + "fields": { + "schema": 11, + "order": 10, + "alias": "D2", + "cst_type": "term", + "convention": "", + "term_raw": "наименьшие элементы", + "term_resolved": "наименьшие элементы", + "term_forms": [], + "definition_formal": "D{α∈X1 | ∀β∈X1 (α=β ∨ (α,β)∈S1)}", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 157, + "fields": { + "schema": 11, + "order": 11, + "alias": "F1", + "cst_type": "function", + "convention": "", + "term_raw": "нижние грани по подмножеству", + "term_resolved": "нижние грани по подмножеству", + "term_forms": [], + "definition_formal": "[σ∈ℬ(X1)] D{α∈X1 | ∀β∈σ (α=β ∨ (α,β)∈S1)}", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 158, + "fields": { + "schema": 12, + "order": 1, + "alias": "X1", + "cst_type": "basic", + "convention": "", + "term_raw": "элементы", + "term_resolved": "элементы", + "term_forms": [], + "definition_formal": "", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 159, + "fields": { + "schema": 12, + "order": 2, + "alias": "X2", + "cst_type": "basic", + "convention": "", + "term_raw": "аспекты", + "term_resolved": "аспекты", + "term_forms": [], + "definition_formal": "", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 160, + "fields": { + "schema": 12, + "order": 3, + "alias": "S1", + "cst_type": "structure", + "convention": "", + "term_raw": "подмножество1", + "term_resolved": "подмножество1", + "term_forms": [], + "definition_formal": "ℬ(X1)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 161, + "fields": { + "schema": 12, + "order": 4, + "alias": "S2", + "cst_type": "structure", + "convention": "", + "term_raw": "подмножество2", + "term_resolved": "подмножество2", + "term_forms": [], + "definition_formal": "ℬ(X1)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 162, + "fields": { + "schema": 12, + "order": 5, + "alias": "S3", + "cst_type": "structure", + "convention": "", + "term_raw": "порядок на подмножестве1", + "term_resolved": "порядок на подмножестве1", + "term_forms": [], + "definition_formal": "ℬ(S1×S1)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 163, + "fields": { + "schema": 12, + "order": 6, + "alias": "S4", + "cst_type": "structure", + "convention": "", + "term_raw": "порядок на подмножестве2", + "term_resolved": "порядок на подмножестве2", + "term_forms": [], + "definition_formal": "ℬ(S2×S2)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 164, + "fields": { + "schema": 12, + "order": 7, + "alias": "F1", + "cst_type": "function", + "convention": "", + "term_raw": "порядок на подмножестве", + "term_resolved": "порядок на подмножестве", + "term_forms": [], + "definition_formal": "[σ∈ℬ(X1)] Fi1,2[σ, σ](S3)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 165, + "fields": { + "schema": 12, + "order": 8, + "alias": "D1", + "cst_type": "term", + "convention": "", + "term_raw": "порядок на объединении", + "term_resolved": "порядок на объединении", + "term_forms": [], + "definition_formal": "", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 166, + "fields": { + "schema": 13, + "order": 1, + "alias": "X1", + "cst_type": "basic", + "convention": "", + "term_raw": "вершины", + "term_resolved": "вершины", + "term_forms": [], + "definition_formal": "", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 167, + "fields": { + "schema": 13, + "order": 2, + "alias": "S1", + "cst_type": "structure", + "convention": "", + "term_raw": "ребра", + "term_resolved": "ребра", + "term_forms": [], + "definition_formal": "ℬ(X1×X1)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 168, + "fields": { + "schema": 14, + "order": 1, + "alias": "X1", + "cst_type": "basic", + "convention": "", + "term_raw": "объекты", + "term_resolved": "объекты", + "term_forms": [], + "definition_formal": "", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 169, + "fields": { + "schema": 14, + "order": 2, + "alias": "X2", + "cst_type": "basic", + "convention": "", + "term_raw": "аспекты", + "term_resolved": "аспекты", + "term_forms": [], + "definition_formal": "", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 170, + "fields": { + "schema": 14, + "order": 3, + "alias": "S1", + "cst_type": "structure", + "convention": "", + "term_raw": "бинарное отношение", + "term_resolved": "бинарное отношение", + "term_forms": [], + "definition_formal": "ℬ(X1×X2)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 171, + "fields": { + "schema": 14, + "order": 4, + "alias": "A1", + "cst_type": "axiom", + "convention": "", + "term_raw": "всюдуопределенность", + "term_resolved": "всюдуопределенность", + "term_forms": [], + "definition_formal": "Pr1(S1)=X1", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 172, + "fields": { + "schema": 14, + "order": 5, + "alias": "A2", + "cst_type": "axiom", + "convention": "", + "term_raw": "всюдузначность", + "term_resolved": "всюдузначность", + "term_forms": [], + "definition_formal": "Pr2(S1)=X2", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 173, + "fields": { + "schema": 14, + "order": 6, + "alias": "A3", + "cst_type": "axiom", + "convention": "", + "term_raw": "прямая однозначность", + "term_resolved": "прямая однозначность", + "term_forms": [], + "definition_formal": "card(Pr1(S1))=card(S1)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 174, + "fields": { + "schema": 14, + "order": 7, + "alias": "A4", + "cst_type": "axiom", + "convention": "", + "term_raw": "обратная однозначность", + "term_resolved": "обратная однозначность", + "term_forms": [], + "definition_formal": "card(Pr2(S1))=card(S1)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 175, + "fields": { + "schema": 14, + "order": 8, + "alias": "F1", + "cst_type": "function", + "convention": "", + "term_raw": "образ множества", + "term_resolved": "образ множества", + "term_forms": [], + "definition_formal": "[σ∈ℬ(X1)] Pr2(Fi1[σ](S1))", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 176, + "fields": { + "schema": 14, + "order": 9, + "alias": "F2", + "cst_type": "function", + "convention": "", + "term_raw": "образ элемента", + "term_resolved": "образ элемента", + "term_forms": [], + "definition_formal": "[α∈X1] debool(F1[{α}])", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 177, + "fields": { + "schema": 14, + "order": 10, + "alias": "D1", + "cst_type": "term", + "convention": "", + "term_raw": "обратная функция", + "term_resolved": "обратная функция", + "term_forms": [], + "definition_formal": "I{(pr2(σ), pr1(σ)) | σ:∈S1 }", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 178, + "fields": { + "schema": 15, + "order": 1, + "alias": "X1", + "cst_type": "basic", + "convention": "АБСТРАКТНЫЙ", + "term_raw": "элементы", + "term_resolved": "элементы", + "term_forms": [], + "definition_formal": "", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 179, + "fields": { + "schema": 15, + "order": 2, + "alias": "S1", + "cst_type": "structure", + "convention": "АБСТРАКТНЫЙ", + "term_raw": "отношение следования", + "term_resolved": "отношение следования", + "term_forms": [], + "definition_formal": "ℬ(X1×X1)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 180, + "fields": { + "schema": 15, + "order": 3, + "alias": "D1", + "cst_type": "term", + "convention": "", + "term_raw": "предыдущие @{X1|nomn,plur}", + "term_resolved": "предыдущие элементы", + "term_forms": [], + "definition_formal": "Pr1(S1)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 181, + "fields": { + "schema": 15, + "order": 4, + "alias": "D2", + "cst_type": "term", + "convention": "", + "term_raw": "последующие @{X1|nomn,plur}", + "term_resolved": "последующие элементы", + "term_forms": [], + "definition_formal": "Pr2(S1)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 182, + "fields": { + "schema": 15, + "order": 5, + "alias": "A1", + "cst_type": "axiom", + "convention": "", + "term_raw": "единственность @{D3|sing,gent}", + "term_resolved": "единственность конечного элемента", + "term_forms": [], + "definition_formal": "card(X1\\D1) = 1", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 183, + "fields": { + "schema": 15, + "order": 6, + "alias": "A2", + "cst_type": "axiom", + "convention": "", + "term_raw": "единственность @{D4|sing,gent}", + "term_resolved": "единственность начального элемента", + "term_forms": [], + "definition_formal": "card(X1\\D2) = 1", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 184, + "fields": { + "schema": 15, + "order": 7, + "alias": "D3", + "cst_type": "term", + "convention": "", + "term_raw": "конечный @{X1|nomn,sing}", + "term_resolved": "конечный элемент", + "term_forms": [], + "definition_formal": "debool(X1\\D1)", + "definition_raw": "@{X1|nomn,sing}, не @{-1|имеющий} @{D2|gent,plur}", + "definition_resolved": "элемент, не имеющий последующих элементов" + } +}, +{ + "model": "rsform.constituenta", + "pk": 185, + "fields": { + "schema": 15, + "order": 8, + "alias": "D4", + "cst_type": "term", + "convention": "", + "term_raw": "начальный @{X1|nomn,sing}", + "term_resolved": "начальный элемент", + "term_forms": [], + "definition_formal": "debool(X1\\D2)", + "definition_raw": "@{X1|nomn,sing}, не @{-1|имеющий} @{D1|gent,plur}", + "definition_resolved": "элемент, не имеющий предыдущих элементов" + } +}, +{ + "model": "rsform.constituenta", + "pk": 186, + "fields": { + "schema": 15, + "order": 9, + "alias": "A3", + "cst_type": "axiom", + "convention": "", + "term_raw": "единственность @{D2|gent,sing}", + "term_resolved": "единственность последующего элемента", + "term_forms": [], + "definition_formal": "∀ξ∈D1 card(Fi1[{ξ}](S1))=1", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 187, + "fields": { + "schema": 15, + "order": 10, + "alias": "F1", + "cst_type": "function", + "convention": "", + "term_raw": "@{D2|nomn,sing} для данного @{X1|gent,sing}", + "term_resolved": "последующий элемент для данного элемента", + "term_forms": [], + "definition_formal": "[α∈D1] pr2(debool(Fi1[{α}](S1)))", + "definition_raw": "@{X1|nomn,sing}, @{-1|следующий} за @{1|данным} @{X1|ablt,sing}", + "definition_resolved": "элемент, следующий за данным элементом" + } +}, +{ + "model": "rsform.constituenta", + "pk": 188, + "fields": { + "schema": 15, + "order": 11, + "alias": "F2", + "cst_type": "function", + "convention": "", + "term_raw": "@{D1|nomn,sing} для данного @{X1|gent,sing}", + "term_resolved": "предыдущий элемент для данного элемента", + "term_forms": [], + "definition_formal": "[α∈D1] pr2(debool(Fi1[{α}](S1)))", + "definition_raw": "@{X1|nomn,sing}, @{-1|предшествующий} @{1|данному} @{X1|datv,sing}", + "definition_resolved": "элемент, предшествующий данному элементу" + } +}, +{ + "model": "rsform.constituenta", + "pk": 189, + "fields": { + "schema": 16, + "order": 1, + "alias": "X1", + "cst_type": "basic", + "convention": "", + "term_raw": "символы", + "term_resolved": "символы", + "term_forms": [], + "definition_formal": "", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 190, + "fields": { + "schema": 16, + "order": 2, + "alias": "C1", + "cst_type": "constant", + "convention": "", + "term_raw": "позиции", + "term_resolved": "позиции", + "term_forms": [], + "definition_formal": "", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 191, + "fields": { + "schema": 16, + "order": 3, + "alias": "S1", + "cst_type": "structure", + "convention": "", + "term_raw": "слова", + "term_resolved": "слова", + "term_forms": [], + "definition_formal": "ℬℬ(X1×C1)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 192, + "fields": { + "schema": 16, + "order": 4, + "alias": "F1", + "cst_type": "function", + "convention": "", + "term_raw": "длина слова", + "term_resolved": "длина слова", + "term_forms": [], + "definition_formal": "[σ∈S1] card(S1)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 193, + "fields": { + "schema": 16, + "order": 5, + "alias": "A1", + "cst_type": "axiom", + "convention": "", + "term_raw": "Корректность слов", + "term_resolved": "Корректность слов", + "term_forms": [], + "definition_formal": "∀σ∈S1 (card(σ)=card(Pr2(σ)) & ∀ξ∈Pr2(σ) ξ1 & red(β)=α & ∀ξ1∈β (ξ1≠∅ & ∀ξ2∈β\\{ξ1} ξ1∩ξ2=∅)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 301, + "fields": { + "schema": 23, + "order": 7, + "alias": "A1", + "cst_type": "axiom", + "convention": "", + "term_raw": "@{P1|nomn,sing} @{X1|gent,plur} на @{S1|gent,plur} и @{S2|gent,plur}", + "term_resolved": "условие разбиения индивидов на мужчин и женщин", + "term_forms": [], + "definition_formal": "P1[X1, {S1,S2}]", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 302, + "fields": { + "schema": 23, + "order": 8, + "alias": "D1", + "cst_type": "term", + "convention": "", + "term_raw": "дети", + "term_resolved": "дети", + "term_forms": [], + "definition_formal": "Pr2(S3)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 303, + "fields": { + "schema": 23, + "order": 9, + "alias": "A2", + "cst_type": "axiom", + "convention": "", + "term_raw": "", + "term_resolved": "", + "term_forms": [], + "definition_formal": "card(S3)=card(D1)", + "definition_raw": "@{D1|nomn,sing} рождается единожды", + "definition_resolved": "ребёнок рождается единожды" + } +}, +{ + "model": "rsform.constituenta", + "pk": 304, + "fields": { + "schema": 23, + "order": 10, + "alias": "D2", + "cst_type": "term", + "convention": "", + "term_raw": "пары родителей", + "term_resolved": "пары родителей", + "term_forms": [], + "definition_formal": "Pr1(S3)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 305, + "fields": { + "schema": 23, + "order": 11, + "alias": "D3", + "cst_type": "term", + "convention": "", + "term_raw": "родители", + "term_resolved": "родители", + "term_forms": [], + "definition_formal": "Pr1(D2)∪Pr2(D2)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 306, + "fields": { + "schema": 23, + "order": 12, + "alias": "D4", + "cst_type": "term", + "convention": "", + "term_raw": "отцы", + "term_resolved": "отцы", + "term_forms": [], + "definition_formal": "Pr1(Pr1(S3))", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 307, + "fields": { + "schema": 23, + "order": 13, + "alias": "D5", + "cst_type": "term", + "convention": "", + "term_raw": "матери", + "term_resolved": "матери", + "term_forms": [ + { + "text": "мать", + "tags": "sing,nomn" + } + ], + "definition_formal": "Pr2(Pr1(S3))", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 308, + "fields": { + "schema": 23, + "order": 14, + "alias": "F1", + "cst_type": "function", + "convention": "", + "term_raw": "@{D2|nomn,sing} @{D1|gent,sing}", + "term_resolved": "пара родителей ребёнка", + "term_forms": [], + "definition_formal": "[α∈D1] debool(Pr1(Fi2[{α}](S3)))", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 309, + "fields": { + "schema": 23, + "order": 15, + "alias": "F2", + "cst_type": "function", + "convention": "", + "term_raw": "@{D3|nomn,plur} @{D1|gent,sing}", + "term_resolved": "родители ребёнка", + "term_forms": [], + "definition_formal": "[α∈D1] {pr1(F1[α]), pr2(F1[α])}", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 310, + "fields": { + "schema": 23, + "order": 16, + "alias": "F3", + "cst_type": "function", + "convention": "", + "term_raw": "@{D4|nomn,sing} @{D1|gent,sing}", + "term_resolved": "отец ребёнка", + "term_forms": [], + "definition_formal": "[α∈D1] pr1(F1[α])", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 311, + "fields": { + "schema": 23, + "order": 17, + "alias": "F4", + "cst_type": "function", + "convention": "", + "term_raw": "@{D5|nomn,sing} @{D1|gent,sing}", + "term_resolved": "мать ребёнка", + "term_forms": [], + "definition_formal": "[α∈D1] pr2(F1[α])", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 312, + "fields": { + "schema": 23, + "order": 18, + "alias": "F5", + "cst_type": "function", + "convention": "", + "term_raw": "@{D1|nomn,plur} @{D2|gent,sing}", + "term_resolved": "дети пары родителей", + "term_forms": [], + "definition_formal": "[α∈D2] Pr2(Fi1[{α}](S3))", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 313, + "fields": { + "schema": 23, + "order": 19, + "alias": "D6", + "cst_type": "term", + "convention": "", + "term_raw": "отношение @{D3|nomn,sing} - @{D1|nomn,sing}", + "term_resolved": "отношение родитель - ребёнок", + "term_forms": [], + "definition_formal": "I{(π,ξ) | ξ:∈D1; π:∈F2[ξ]}", + "definition_raw": "множество пар: @{D3|nomn,sing} и его @{D1|nomn,sing}", + "definition_resolved": "множество пар: родитель и его ребёнок" + } +}, +{ + "model": "rsform.constituenta", + "pk": 314, + "fields": { + "schema": 23, + "order": 20, + "alias": "F6", + "cst_type": "function", + "convention": "", + "term_raw": "@{D1|nomn,plur} группы @{X1|gent,plur}", + "term_resolved": "дети группы индивидов", + "term_forms": [], + "definition_formal": "[α∈ℬ(X1)] Pr2(Fi1[α](D6))", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 315, + "fields": { + "schema": 23, + "order": 21, + "alias": "F7", + "cst_type": "function", + "convention": "", + "term_raw": "@{D1|nomn,plur} @{X1|gent,sing}", + "term_resolved": "дети индивида", + "term_forms": [], + "definition_formal": "[α∈X1] F6[{α}]", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 316, + "fields": { + "schema": 23, + "order": 22, + "alias": "F8", + "cst_type": "function", + "convention": "", + "term_raw": "@{F9|nomn,plur} группы @{X1|gent,plur}", + "term_resolved": "потомки группы индивидов", + "term_forms": [], + "definition_formal": "[α∈ℬ(X1)] R{ξ:=F6[α] | ξ∪F6[ξ]}", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 317, + "fields": { + "schema": 23, + "order": 23, + "alias": "F9", + "cst_type": "function", + "convention": "", + "term_raw": "потомки", + "term_resolved": "потомки", + "term_forms": [], + "definition_formal": "[α∈X1] F8[{α}]", + "definition_raw": "@{D3|nomn,plur} или @{D3|nomn,plur} @{F9|gent,plur}", + "definition_resolved": "родители или родители потомков" + } +}, +{ + "model": "rsform.constituenta", + "pk": 318, + "fields": { + "schema": 23, + "order": 24, + "alias": "A3", + "cst_type": "axiom", + "convention": "", + "term_raw": "ацикличность @{S3|gent,plur}", + "term_resolved": "ацикличность рождений", + "term_forms": [], + "definition_formal": "∀ξ∈D3 ξ∉F9[ξ]", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 319, + "fields": { + "schema": 23, + "order": 25, + "alias": "F10", + "cst_type": "function", + "convention": "", + "term_raw": "@{F11|nomn,plur} группы @{X1|gent,plur}", + "term_resolved": "сыновья группы индивидов", + "term_forms": [], + "definition_formal": "[α∈ℬ(X1)] F6[α]∩S1", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 320, + "fields": { + "schema": 23, + "order": 26, + "alias": "F11", + "cst_type": "function", + "convention": "", + "term_raw": "сыновья", + "term_resolved": "сыновья", + "term_forms": [ + { + "text": "сыновей", + "tags": "plur,gent" + } + ], + "definition_formal": "[α∈X1] F10[{α}]", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 321, + "fields": { + "schema": 23, + "order": 27, + "alias": "F12", + "cst_type": "function", + "convention": "", + "term_raw": "@{F13|nomn,plur} группы @{X1|gent,plur}", + "term_resolved": "дочери группы индивидов", + "term_forms": [], + "definition_formal": "[α∈ℬ(X1)] F6[α]∩S2", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 322, + "fields": { + "schema": 23, + "order": 28, + "alias": "F13", + "cst_type": "function", + "convention": "", + "term_raw": "дочери", + "term_resolved": "дочери", + "term_forms": [], + "definition_formal": "[α∈X1] F12[{α}]", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 323, + "fields": { + "schema": 23, + "order": 29, + "alias": "F14", + "cst_type": "function", + "convention": "", + "term_raw": "@{D3|nomn,plur} группы @{X1|gent,plur}", + "term_resolved": "родители группы индивидов", + "term_forms": [], + "definition_formal": "[α∈ℬ(X1)] Pr1(Fi2[α](D6))", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 324, + "fields": { + "schema": 23, + "order": 30, + "alias": "F15", + "cst_type": "function", + "convention": "", + "term_raw": "@{D3|nomn,plur} @{X1|gent,sing}", + "term_resolved": "родители индивида", + "term_forms": [], + "definition_formal": "[α∈X1] F14[{α}]", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 325, + "fields": { + "schema": 23, + "order": 31, + "alias": "F16", + "cst_type": "function", + "convention": "", + "term_raw": "@{D4|nomn,plur} группы @{X1|gent,plur}", + "term_resolved": "отцы группы индивидов", + "term_forms": [], + "definition_formal": "[α∈ℬ(X1)] F14[α]∩S1", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 326, + "fields": { + "schema": 23, + "order": 32, + "alias": "F17", + "cst_type": "function", + "convention": "", + "term_raw": "@{D5|nomn,plur} группы @{X1|gent,plur}", + "term_resolved": "матери группы индивидов", + "term_forms": [], + "definition_formal": "[α∈ℬ(X1)] F14[α]∩S2", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 327, + "fields": { + "schema": 23, + "order": 33, + "alias": "F18", + "cst_type": "function", + "convention": "", + "term_raw": "прадети", + "term_resolved": "прадети", + "term_forms": [], + "definition_formal": "[α∈X1] F6[F7[α]]", + "definition_raw": "@{D1|nomn,plur} @{F7|gent,plur}", + "definition_resolved": "дети детей индивида" + } +}, +{ + "model": "rsform.constituenta", + "pk": 328, + "fields": { + "schema": 23, + "order": 34, + "alias": "F19", + "cst_type": "function", + "convention": "", + "term_raw": "внуки", + "term_resolved": "внуки", + "term_forms": [], + "definition_formal": "[α∈X1] F10[F7[α]]", + "definition_raw": "@{F11|nomn,plur} @{D1|gent,plur}", + "definition_resolved": "сыновья детей" + } +}, +{ + "model": "rsform.constituenta", + "pk": 329, + "fields": { + "schema": 23, + "order": 35, + "alias": "F20", + "cst_type": "function", + "convention": "", + "term_raw": "внучки", + "term_resolved": "внучки", + "term_forms": [], + "definition_formal": "[α∈X1] F12[F7[α]]", + "definition_raw": "@{F13|nomn,plur} @{D1|gent,plur}", + "definition_resolved": "дочери детей" + } +}, +{ + "model": "rsform.constituenta", + "pk": 330, + "fields": { + "schema": 23, + "order": 36, + "alias": "F21", + "cst_type": "function", + "convention": "", + "term_raw": "прародители", + "term_resolved": "прародители", + "term_forms": [], + "definition_formal": "[α∈X1] F14[F15[α]]", + "definition_raw": "@{D3|nomn,plur} @{D3|gent,plur}", + "definition_resolved": "родители родителей" + } +}, +{ + "model": "rsform.constituenta", + "pk": 331, + "fields": { + "schema": 23, + "order": 37, + "alias": "F22", + "cst_type": "function", + "convention": "", + "term_raw": "дедушки", + "term_resolved": "дедушки", + "term_forms": [], + "definition_formal": "[α∈X1] F16[F15[α]]", + "definition_raw": "@{D4|nomn,plur} @{D3|gent,plur}", + "definition_resolved": "отцы родителей" + } +}, +{ + "model": "rsform.constituenta", + "pk": 332, + "fields": { + "schema": 23, + "order": 38, + "alias": "F23", + "cst_type": "function", + "convention": "", + "term_raw": "бабушки", + "term_resolved": "бабушки", + "term_forms": [], + "definition_formal": "[α∈X1] F17[F15[α]]", + "definition_raw": "@{D5|nomn,plur} @{D3|gent,plur}", + "definition_resolved": "матери родителей" + } +}, +{ + "model": "rsform.constituenta", + "pk": 333, + "fields": { + "schema": 23, + "order": 39, + "alias": "F24", + "cst_type": "function", + "convention": "", + "term_raw": "@{F25|nomn,plur} группы @{X1|gent,plur}", + "term_resolved": "сиблинги группы индивидов", + "term_forms": [], + "definition_formal": "[α∈ℬ(X1)] Pr2(Fi1[F14[α]](D6))\\α", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 334, + "fields": { + "schema": 23, + "order": 40, + "alias": "F25", + "cst_type": "function", + "convention": "", + "term_raw": "сиблинги", + "term_resolved": "сиблинги", + "term_forms": [ + { + "text": "сиблингов", + "tags": "plur,gent" + } + ], + "definition_formal": "[α∈X1] F24[{α}]", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 335, + "fields": { + "schema": 23, + "order": 41, + "alias": "F26", + "cst_type": "function", + "convention": "", + "term_raw": "@{F27|nomn,plur} группы @{X1|gent,plur}", + "term_resolved": "братья группы индивидов", + "term_forms": [], + "definition_formal": "[α∈ℬ(X1)] F24[α]∩S1", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 336, + "fields": { + "schema": 23, + "order": 42, + "alias": "F27", + "cst_type": "function", + "convention": "", + "term_raw": "братья", + "term_resolved": "братья", + "term_forms": [ + { + "text": "братьев", + "tags": "plur,gent" + } + ], + "definition_formal": "[α∈X1] F26[{α}]", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 337, + "fields": { + "schema": 23, + "order": 43, + "alias": "F28", + "cst_type": "function", + "convention": "", + "term_raw": "@{F29|nomn,plur} группы @{X1|gent,plur}", + "term_resolved": "сёстры группы индивидов", + "term_forms": [], + "definition_formal": "[α∈ℬ(X1)] F24[α]∩S2", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 338, + "fields": { + "schema": 23, + "order": 44, + "alias": "F29", + "cst_type": "function", + "convention": "", + "term_raw": "сёстры", + "term_resolved": "сёстры", + "term_forms": [], + "definition_formal": "[α∈X1] F28[{α}]", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 339, + "fields": { + "schema": 23, + "order": 45, + "alias": "F30", + "cst_type": "function", + "convention": "", + "term_raw": "полнородные @{F25|nomn,plur}", + "term_resolved": "полнородные сиблинги", + "term_forms": [], + "definition_formal": "[α∈X1] D{ξ∈F25[α] | F1[α]=F1[ξ] }", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 340, + "fields": { + "schema": 23, + "order": 46, + "alias": "F31", + "cst_type": "function", + "convention": "", + "term_raw": "полнородные @{F27|nomn,plur} @{X1|gent,sing}", + "term_resolved": "полнородные братья индивида", + "term_forms": [], + "definition_formal": "[α∈X1] F30[α]∩S1", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 341, + "fields": { + "schema": 23, + "order": 47, + "alias": "F32", + "cst_type": "function", + "convention": "", + "term_raw": "полнородные @{F29|nomn,plur} @{X1|gent,sing}", + "term_resolved": "полнородные сёстры индивида", + "term_forms": [], + "definition_formal": "[α∈X1] F30[α]∩S2", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 342, + "fields": { + "schema": 23, + "order": 48, + "alias": "F33", + "cst_type": "function", + "convention": "", + "term_raw": "единокровные @{F25|nomn,plur}", + "term_resolved": "единокровные сиблинги", + "term_forms": [], + "definition_formal": "[α∈X1] D{ξ∈F25[α] | F3[α]=F3[ξ] & F4[α]≠F4[ξ] }", + "definition_raw": "@{F25|nomn,plur}, у которых @{1|общий} @{D4|nomn,sing}, но разные @{D5|nomn,plur}", + "definition_resolved": "сиблинги, у которых общие отец, но разные матери" + } +}, +{ + "model": "rsform.constituenta", + "pk": 343, + "fields": { + "schema": 23, + "order": 49, + "alias": "F34", + "cst_type": "function", + "convention": "", + "term_raw": "единокровные @{F27|nomn,plur}", + "term_resolved": "единокровные братья", + "term_forms": [], + "definition_formal": "[α∈X1] F33[α]∩S1", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 344, + "fields": { + "schema": 23, + "order": 50, + "alias": "F35", + "cst_type": "function", + "convention": "", + "term_raw": "единокровные @{F29|nomn,plur}", + "term_resolved": "единокровные сёстры", + "term_forms": [], + "definition_formal": "[α∈X1] F33[α]∩S2", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 345, + "fields": { + "schema": 23, + "order": 51, + "alias": "F36", + "cst_type": "function", + "convention": "", + "term_raw": "единоутробные @{F25|nomn,plur}", + "term_resolved": "единоутробные сиблинги", + "term_forms": [], + "definition_formal": "[α∈X1] D{ξ∈F25[α] | F3[α]≠F3[ξ] & F4[α]=F4[ξ] }", + "definition_raw": "@{F25|nomn,plur}, у которых @{1|общий} @{D5|nomn,sing}, но разные @{D4|nomn,plur}", + "definition_resolved": "сиблинги, у которых общие мать, но разные отцы" + } +}, +{ + "model": "rsform.constituenta", + "pk": 346, + "fields": { + "schema": 23, + "order": 52, + "alias": "F37", + "cst_type": "function", + "convention": "", + "term_raw": "единоутробные @{F27|nomn,plur}", + "term_resolved": "единоутробные братья", + "term_forms": [], + "definition_formal": "[α∈X1] F36[α]∩F27[α]", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 347, + "fields": { + "schema": 23, + "order": 53, + "alias": "F38", + "cst_type": "function", + "convention": "", + "term_raw": "единоутробные @{F29|nomn,plur}", + "term_resolved": "единоутробные сёстры", + "term_forms": [], + "definition_formal": "[α∈X1] F36[α]∩F29[α]", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 348, + "fields": { + "schema": 23, + "order": 54, + "alias": "F39", + "cst_type": "function", + "convention": "", + "term_raw": "@{F40|nomn,plur} группы @{X1|gent,plur}", + "term_resolved": "двоюродные сиблинги группы индивидов", + "term_forms": [], + "definition_formal": "[α∈ℬ(X1)] F8[F24[F14[α]]]", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 349, + "fields": { + "schema": 23, + "order": 55, + "alias": "F40", + "cst_type": "function", + "convention": "", + "term_raw": "двоюродные @{F25|nomn,plur}", + "term_resolved": "двоюродные сиблинги", + "term_forms": [ + { + "text": "двоюродных сиблингов", + "tags": "plur,gent" + } + ], + "definition_formal": "[α∈X1] F39[{α}]", + "definition_raw": "@{D1|nomn,plur} @{F25|gent,plur} @{D3|gent,plur}", + "definition_resolved": "дети сиблингов родителей" + } +}, +{ + "model": "rsform.constituenta", + "pk": 350, + "fields": { + "schema": 23, + "order": 56, + "alias": "F41", + "cst_type": "function", + "convention": "", + "term_raw": "@{F40|nomn,plur} по @{D4|datv,sing}", + "term_resolved": "двоюродные сиблинги по отцу", + "term_forms": [], + "definition_formal": "[α∈D1] F8[F25[F3[α]]]", + "definition_raw": "@{D1|nomn,plur} @{F25|gent,plur} @{D4|gent,sing}", + "definition_resolved": "дети сиблингов отца" + } +}, +{ + "model": "rsform.constituenta", + "pk": 351, + "fields": { + "schema": 23, + "order": 57, + "alias": "F42", + "cst_type": "function", + "convention": "", + "term_raw": "@{F40|nomn,plur} по @{D5|datv,sing}", + "term_resolved": "двоюродные сиблинги по матери", + "term_forms": [], + "definition_formal": "[α∈D1] F8[F25[F4[α]]]", + "definition_raw": "@{D1|nomn,plur} @{F25|gent,plur} @{D5|gent,sing}", + "definition_resolved": "дети сиблингов матери" + } +}, +{ + "model": "rsform.constituenta", + "pk": 352, + "fields": { + "schema": 23, + "order": 58, + "alias": "F43", + "cst_type": "function", + "convention": "", + "term_raw": "@{F44|nomn,plur} группы @{X1|gent,plur}", + "term_resolved": "двоюродные братья группы индивидов", + "term_forms": [], + "definition_formal": "[α∈ℬ(X1)] F10[F24[F14[α]]]", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 353, + "fields": { + "schema": 23, + "order": 59, + "alias": "F44", + "cst_type": "function", + "convention": "", + "term_raw": "двоюродные @{F27|nomn,plur}", + "term_resolved": "двоюродные братья", + "term_forms": [ + { + "text": "двоюродных братьев", + "tags": "plur,gent" + } + ], + "definition_formal": "[α∈X1] F43[{α}]", + "definition_raw": "@{F40|nomn,plur}, являющиеся @{S1|ablt,plur}", + "definition_resolved": "двоюродные сиблинги, являющиеся мужчинами" + } +}, +{ + "model": "rsform.constituenta", + "pk": 354, + "fields": { + "schema": 23, + "order": 60, + "alias": "F45", + "cst_type": "function", + "convention": "", + "term_raw": "@{F46|nomn,plur} группы @{X1|gent,plur}", + "term_resolved": "двоюродные сёстры группы индивидов", + "term_forms": [], + "definition_formal": "[α∈ℬ(X1)] F12[F24[F14[α]]]", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 355, + "fields": { + "schema": 23, + "order": 61, + "alias": "F46", + "cst_type": "function", + "convention": "", + "term_raw": "двоюродные @{F29|nomn,plur}", + "term_resolved": "двоюродные сёстры", + "term_forms": [], + "definition_formal": "[α∈X1] F45[{α}]", + "definition_raw": "@{F40|nomn,plur}, являющиеся @{S2|ablt,plur}", + "definition_resolved": "двоюродные сиблинги, являющиеся женщинами" + } +}, +{ + "model": "rsform.constituenta", + "pk": 356, + "fields": { + "schema": 23, + "order": 62, + "alias": "F47", + "cst_type": "function", + "convention": "", + "term_raw": "стрыйчичи", + "term_resolved": "стрыйчичи", + "term_forms": [], + "definition_formal": "[α∈X1] F44[α]∩F41[α]", + "definition_raw": "@{F44|nomn,plur} по @{D4|datv,sing}", + "definition_resolved": "двоюродные братья по отцу" + } +}, +{ + "model": "rsform.constituenta", + "pk": 357, + "fields": { + "schema": 23, + "order": 63, + "alias": "F48", + "cst_type": "function", + "convention": "", + "term_raw": "стрыечки", + "term_resolved": "стрыечки", + "term_forms": [], + "definition_formal": "[α∈X1] F46[α]∩F41[α]", + "definition_raw": "@{F46|nomn,plur} по @{D4|datv,sing}", + "definition_resolved": "двоюродные сёстры по отцу" + } +}, +{ + "model": "rsform.constituenta", + "pk": 358, + "fields": { + "schema": 23, + "order": 64, + "alias": "F49", + "cst_type": "function", + "convention": "", + "term_raw": "уйчичи", + "term_resolved": "уйчичи", + "term_forms": [], + "definition_formal": "[α∈X1] F44[α]∩F42[α]", + "definition_raw": "@{F44|nomn,plur} по @{D5|datv,sing}", + "definition_resolved": "двоюродные братья по матери" + } +}, +{ + "model": "rsform.constituenta", + "pk": 359, + "fields": { + "schema": 23, + "order": 65, + "alias": "F50", + "cst_type": "function", + "convention": "", + "term_raw": "дяди", + "term_resolved": "дяди", + "term_forms": [], + "definition_formal": "[α∈X1] F26[F15[α]]", + "definition_raw": "@{F27|nomn,plur} @{D3|gent,plur}", + "definition_resolved": "братья родителей" + } +}, +{ + "model": "rsform.constituenta", + "pk": 360, + "fields": { + "schema": 23, + "order": 66, + "alias": "F51", + "cst_type": "function", + "convention": "", + "term_raw": "стрыи", + "term_resolved": "стрыи", + "term_forms": [], + "definition_formal": "[α∈D1] F27[F3[α]]", + "definition_raw": "@{F27|nomn,plur} @{D4|gent,sing}", + "definition_resolved": "братья отца" + } +}, +{ + "model": "rsform.constituenta", + "pk": 361, + "fields": { + "schema": 23, + "order": 67, + "alias": "F52", + "cst_type": "function", + "convention": "", + "term_raw": "вуи", + "term_resolved": "вуи", + "term_forms": [ + { + "text": "вуй", + "tags": "sing,nomn" + }, + { + "text": "вуя", + "tags": "sing,gent" + }, + { + "text": "вую", + "tags": "sing,datv" + }, + { + "text": "вуёв", + "tags": "plur,gent" + } + ], + "definition_formal": "[α∈D1] F27[F4[α]]", + "definition_raw": "@{F27|nomn,plur} @{D5|gent,sing}", + "definition_resolved": "братья матери" + } +}, +{ + "model": "rsform.constituenta", + "pk": 362, + "fields": { + "schema": 23, + "order": 68, + "alias": "F53", + "cst_type": "function", + "convention": "", + "term_raw": "тёти", + "term_resolved": "тёти", + "term_forms": [], + "definition_formal": "[α∈X1] F28[F15[α]]", + "definition_raw": "@{F29|nomn,plur} @{D3|gent,plur}", + "definition_resolved": "сёстры родителей" + } +}, +{ + "model": "rsform.constituenta", + "pk": 363, + "fields": { + "schema": 23, + "order": 69, + "alias": "F54", + "cst_type": "function", + "convention": "", + "term_raw": "стрыйны", + "term_resolved": "стрыйны", + "term_forms": [], + "definition_formal": "[α∈D1] F29[F3[α]]", + "definition_raw": "@{F29|nomn,plur} @{D4|gent,sing}", + "definition_resolved": "сёстры отца" + } +}, +{ + "model": "rsform.constituenta", + "pk": 364, + "fields": { + "schema": 23, + "order": 70, + "alias": "F55", + "cst_type": "function", + "convention": "", + "term_raw": "вуйны", + "term_resolved": "вуйны", + "term_forms": [], + "definition_formal": "[α∈D1] F29[F4[α]]", + "definition_raw": "@{F29|nomn,plur} @{D5|gent,sing}", + "definition_resolved": "сёстры матери" + } +}, +{ + "model": "rsform.constituenta", + "pk": 365, + "fields": { + "schema": 23, + "order": 71, + "alias": "F56", + "cst_type": "function", + "convention": "", + "term_raw": "племянники", + "term_resolved": "племянники", + "term_forms": [], + "definition_formal": "[α∈X1] F10[F25[α]]", + "definition_raw": "@{F11|nomn,plur} @{F25|gent,plur}", + "definition_resolved": "сыновья сиблингов" + } +}, +{ + "model": "rsform.constituenta", + "pk": 366, + "fields": { + "schema": 23, + "order": 72, + "alias": "F57", + "cst_type": "function", + "convention": "", + "term_raw": "братычи", + "term_resolved": "братычи", + "term_forms": [], + "definition_formal": "[α∈X1] F10[F27[α]]", + "definition_raw": "@{F11|nomn,plur} @{F27|gent,plur}", + "definition_resolved": "сыновья братьев" + } +}, +{ + "model": "rsform.constituenta", + "pk": 367, + "fields": { + "schema": 23, + "order": 73, + "alias": "F58", + "cst_type": "function", + "convention": "", + "term_raw": "сестричи", + "term_resolved": "сестричи", + "term_forms": [], + "definition_formal": "[α∈X1] F10[F29[α]]", + "definition_raw": "@{F11|nomn,plur} @{F29|gent,plur}", + "definition_resolved": "сыновья сестёр" + } +}, +{ + "model": "rsform.constituenta", + "pk": 368, + "fields": { + "schema": 23, + "order": 74, + "alias": "F59", + "cst_type": "function", + "convention": "", + "term_raw": "племянницы", + "term_resolved": "племянницы", + "term_forms": [], + "definition_formal": "[α∈X1] F12[F25[α]]", + "definition_raw": "@{F13|gent,sing} @{F25|gent,plur}", + "definition_resolved": "дочери сиблингов" + } +}, +{ + "model": "rsform.constituenta", + "pk": 369, + "fields": { + "schema": 23, + "order": 75, + "alias": "F60", + "cst_type": "function", + "convention": "", + "term_raw": "братанины", + "term_resolved": "братанины", + "term_forms": [], + "definition_formal": "[α∈X1] F12[F27[α]]", + "definition_raw": "@{F13|gent,sing} @{F27|gent,plur}", + "definition_resolved": "дочери братьев" + } +}, +{ + "model": "rsform.constituenta", + "pk": 370, + "fields": { + "schema": 23, + "order": 76, + "alias": "F61", + "cst_type": "function", + "convention": "", + "term_raw": "сестрины", + "term_resolved": "сестрины", + "term_forms": [], + "definition_formal": "[α∈X1] F12[F29[α]]", + "definition_raw": "@{F13|gent,sing} @{F29|gent,plur}", + "definition_resolved": "дочери сестёр" + } +}, +{ + "model": "rsform.constituenta", + "pk": 371, + "fields": { + "schema": 23, + "order": 77, + "alias": "F62", + "cst_type": "function", + "convention": "", + "term_raw": "двоюродные @{F50|nomn,plur}", + "term_resolved": "двоюродные дяди", + "term_forms": [], + "definition_formal": "[α∈X1] F43[F15[α]]", + "definition_raw": "@{F44|nomn,plur} @{D3|gent,plur}", + "definition_resolved": "двоюродные братья родителей" + } +}, +{ + "model": "rsform.constituenta", + "pk": 372, + "fields": { + "schema": 23, + "order": 78, + "alias": "F63", + "cst_type": "function", + "convention": "", + "term_raw": "двоюродные @{F53|nomn,plur}", + "term_resolved": "двоюродные тёти", + "term_forms": [], + "definition_formal": "[α∈X1] F45[F15[α]]", + "definition_raw": "@{F46|nomn,plur} @{D3|gent,plur}", + "definition_resolved": "двоюродные сёстры родителей" + } +}, +{ + "model": "rsform.constituenta", + "pk": 373, + "fields": { + "schema": 23, + "order": 79, + "alias": "F64", + "cst_type": "function", + "convention": "", + "term_raw": "двоюродные @{F56|nomn,plur}", + "term_resolved": "двоюродные племянники", + "term_forms": [], + "definition_formal": "[α∈X1] F10[F40[α]]", + "definition_raw": "@{F11|nomn,plur} @{F40|gent,plur}", + "definition_resolved": "сыновья двоюродных сиблингов" + } +}, +{ + "model": "rsform.constituenta", + "pk": 374, + "fields": { + "schema": 23, + "order": 80, + "alias": "F65", + "cst_type": "function", + "convention": "", + "term_raw": "дщеричи", + "term_resolved": "дщеричи", + "term_forms": [], + "definition_formal": "[α∈X1] F10[F46[α]]", + "definition_raw": "@{F56|nomn,plur} по @{F53|datv,sing}", + "definition_resolved": "племянники по тёте" + } +}, +{ + "model": "rsform.constituenta", + "pk": 375, + "fields": { + "schema": 23, + "order": 81, + "alias": "F66", + "cst_type": "function", + "convention": "", + "term_raw": "двоюродные @{F59|nomn,plur}", + "term_resolved": "двоюродные племянницы", + "term_forms": [], + "definition_formal": "[α∈X1] F12[F40[α]]", + "definition_raw": "@{F13|nomn,plur} @{F40|gent,plur}", + "definition_resolved": "дочери двоюродных сиблингов" + } +}, +{ + "model": "rsform.constituenta", + "pk": 376, + "fields": { + "schema": 23, + "order": 82, + "alias": "F67", + "cst_type": "function", + "convention": "", + "term_raw": "дщерши", + "term_resolved": "дщерши", + "term_forms": [], + "definition_formal": "[α∈X1] F12[F46[α]]", + "definition_raw": "@{F13|nomn,plur} @{F46|gent,plur}", + "definition_resolved": "дочери двоюродных сестёр" + } +}, +{ + "model": "rsform.constituenta", + "pk": 377, + "fields": { + "schema": 23, + "order": 83, + "alias": "F68", + "cst_type": "function", + "convention": "альтернативное определение: великий дядя - дядя родителя", + "term_raw": "двоюродные @{F22|nomn,plur}", + "term_resolved": "двоюродные дедушки", + "term_forms": [], + "definition_formal": "[α∈X1] F26[F21[α]]", + "definition_raw": "@{F27|nomn,plur} @{F21|gent,plur}", + "definition_resolved": "братья прародителей" + } +}, +{ + "model": "rsform.constituenta", + "pk": 378, + "fields": { + "schema": 23, + "order": 84, + "alias": "F69", + "cst_type": "function", + "convention": "", + "term_raw": "двоюродные @{F23|nomn,plur}", + "term_resolved": "двоюродные бабушки", + "term_forms": [], + "definition_formal": "[α∈X1] F28[F21[α]]", + "definition_raw": "@{F29|nomn,plur} @{F21|gent,plur}", + "definition_resolved": "сёстры прародителей" + } +}, +{ + "model": "rsform.constituenta", + "pk": 379, + "fields": { + "schema": 23, + "order": 85, + "alias": "F70", + "cst_type": "function", + "convention": "альтернативное определение: внук родного брата или сестры", + "term_raw": "внучатые @{F56|nomn,plur}", + "term_resolved": "внучатые племянники", + "term_forms": [], + "definition_formal": "[α∈X1] F10[F56[α]∪F59[α]]", + "definition_raw": "@{F11|nomn,plur} @{F56|gent,plur} и @{F59|gent,plur}", + "definition_resolved": "сыновья племянников и племянниц" + } +}, +{ + "model": "rsform.constituenta", + "pk": 380, + "fields": { + "schema": 23, + "order": 86, + "alias": "F71", + "cst_type": "function", + "convention": "", + "term_raw": "внучатые @{F59|nomn,plur}", + "term_resolved": "внучатые племянницы", + "term_forms": [], + "definition_formal": "[α∈X1] F12[F56[α]∪F59[α]]", + "definition_raw": "@{F13|nomn,plur} @{F56|gent,plur} и @{F59|gent,plur}", + "definition_resolved": "дочери племянников и племянниц" + } +}, +{ + "model": "rsform.constituenta", + "pk": 381, + "fields": { + "schema": 23, + "order": 87, + "alias": "D7", + "cst_type": "term", + "convention": "", + "term_raw": "мужья", + "term_resolved": "мужья", + "term_forms": [], + "definition_formal": "Pr1(S4)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 382, + "fields": { + "schema": 23, + "order": 88, + "alias": "D8", + "cst_type": "term", + "convention": "", + "term_raw": "жены", + "term_resolved": "жены", + "term_forms": [], + "definition_formal": "Pr2(S4)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 383, + "fields": { + "schema": 23, + "order": 89, + "alias": "D9", + "cst_type": "term", + "convention": "", + "term_raw": "супруги", + "term_resolved": "супруги", + "term_forms": [], + "definition_formal": "I{ξ | σ:∈S4; ξ:={pr1(σ),pr2(σ)} }", + "definition_raw": "множество множеств @{X1|gent,plur}, состоящих в @{S4|loct,sing}", + "definition_resolved": "множество множеств индивидов, состоящих в браке" + } +}, +{ + "model": "rsform.constituenta", + "pk": 384, + "fields": { + "schema": 23, + "order": 90, + "alias": "A4", + "cst_type": "axiom", + "convention": "", + "term_raw": "единственность @{S4|gent,plur}", + "term_resolved": "единственность браков", + "term_forms": [], + "definition_formal": "card(S4)=card(D7) & card(S4)=card(D8)", + "definition_raw": "каждый @{X1|nomn,sing} может состоять только в одном @{S4|loct,sing}", + "definition_resolved": "каждый индивид может состоять только в одном браке" + } +}, +{ + "model": "rsform.constituenta", + "pk": 385, + "fields": { + "schema": 23, + "order": 91, + "alias": "F72", + "cst_type": "function", + "convention": "", + "term_raw": "@{D7|nomn,plur} группы @{X1|gent,plur}", + "term_resolved": "мужья группы индивидов", + "term_forms": [], + "definition_formal": "[α∈ℬ(X1)] Pr1(Fi2[α](S4))", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 386, + "fields": { + "schema": 23, + "order": 92, + "alias": "F73", + "cst_type": "function", + "convention": "", + "term_raw": "@{D8|nomn,plur} группы @{X1|gent,plur}", + "term_resolved": "жены группы индивидов", + "term_forms": [], + "definition_formal": "[α∈ℬ(X1)] Pr2(Fi1[α](S4))", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 387, + "fields": { + "schema": 23, + "order": 93, + "alias": "F74", + "cst_type": "function", + "convention": "", + "term_raw": "@{D9|nomn,plur} группы @{X1|gent,plur}", + "term_resolved": "супруги группы индивидов", + "term_forms": [], + "definition_formal": "[α∈ℬ(X1)] F72[α]∪F73[α]", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 388, + "fields": { + "schema": 23, + "order": 94, + "alias": "F75", + "cst_type": "function", + "convention": "", + "term_raw": "@{D7|nomn,sing} @{D8|gent,sing}", + "term_resolved": "муж жены", + "term_forms": [], + "definition_formal": "[α∈D8] debool(F72[{α}])", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 389, + "fields": { + "schema": 23, + "order": 95, + "alias": "F76", + "cst_type": "function", + "convention": "", + "term_raw": "@{D8|nomn,sing} @{D7|gent,sing}", + "term_resolved": "жена мужа", + "term_forms": [], + "definition_formal": "[α∈D7] debool(F73[{α}])", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 390, + "fields": { + "schema": 23, + "order": 96, + "alias": "F77", + "cst_type": "function", + "convention": "", + "term_raw": "свёкр", + "term_resolved": "свёкр", + "term_forms": [], + "definition_formal": "[α∈D8] F3[F75[α]]", + "definition_raw": "@{D4|nomn,sing} @{D7|gent,sing}", + "definition_resolved": "отец мужа" + } +}, +{ + "model": "rsform.constituenta", + "pk": 391, + "fields": { + "schema": 23, + "order": 97, + "alias": "F78", + "cst_type": "function", + "convention": "", + "term_raw": "свекровь", + "term_resolved": "свекровь", + "term_forms": [], + "definition_formal": "[α∈D8] F4[F75[α]]", + "definition_raw": "@{D5|nomn,sing} @{D7|gent,sing}", + "definition_resolved": "мать мужа" + } +}, +{ + "model": "rsform.constituenta", + "pk": 392, + "fields": { + "schema": 23, + "order": 98, + "alias": "F79", + "cst_type": "function", + "convention": "", + "term_raw": "тесть", + "term_resolved": "тесть", + "term_forms": [], + "definition_formal": "[α∈D7] F3[F76[α]]", + "definition_raw": "@{D4|nomn,sing} @{D8|gent,sing}", + "definition_resolved": "отец жены" + } +}, +{ + "model": "rsform.constituenta", + "pk": 393, + "fields": { + "schema": 23, + "order": 99, + "alias": "F80", + "cst_type": "function", + "convention": "", + "term_raw": "тёща", + "term_resolved": "тёща", + "term_forms": [], + "definition_formal": "[α∈D7] F4[F76[α]]", + "definition_raw": "@{D5|nomn,sing} @{D8|gent,sing}", + "definition_resolved": "мать жены" + } +}, +{ + "model": "rsform.constituenta", + "pk": 394, + "fields": { + "schema": 23, + "order": 100, + "alias": "F81", + "cst_type": "function", + "convention": "", + "term_raw": "сваты", + "term_resolved": "сваты", + "term_forms": [], + "definition_formal": "[α∈X1] F16[F74[F7[α]]]", + "definition_raw": "@{D4|nomn,plur} @{D9|gent,plur} @{D1|gent,plur}", + "definition_resolved": "отцы супругов детей" + } +}, +{ + "model": "rsform.constituenta", + "pk": 395, + "fields": { + "schema": 23, + "order": 101, + "alias": "F82", + "cst_type": "function", + "convention": "", + "term_raw": "сватьи", + "term_resolved": "сватьи", + "term_forms": [], + "definition_formal": "[α∈X1] F17[F74[F7[α]]]", + "definition_raw": "@{D5|gent,sing} @{D9|gent,plur} @{D1|gent,plur}", + "definition_resolved": "матери супругов детей" + } +}, +{ + "model": "rsform.constituenta", + "pk": 396, + "fields": { + "schema": 23, + "order": 102, + "alias": "F83", + "cst_type": "function", + "convention": "", + "term_raw": "девери", + "term_resolved": "девери", + "term_forms": [], + "definition_formal": "[α∈D8] F27[F75[α]]", + "definition_raw": "@{F27|nomn,plur} @{D7|gent,sing}", + "definition_resolved": "братья мужа" + } +}, +{ + "model": "rsform.constituenta", + "pk": 397, + "fields": { + "schema": 23, + "order": 103, + "alias": "F84", + "cst_type": "function", + "convention": "", + "term_raw": "золовки", + "term_resolved": "золовки", + "term_forms": [], + "definition_formal": "[α∈D8] F29[F75[α]]", + "definition_raw": "@{F29|nomn,plur} @{D7|gent,sing}", + "definition_resolved": "сёстры мужа" + } +}, +{ + "model": "rsform.constituenta", + "pk": 398, + "fields": { + "schema": 23, + "order": 104, + "alias": "F85", + "cst_type": "function", + "convention": "", + "term_raw": "шурины", + "term_resolved": "шурины", + "term_forms": [], + "definition_formal": "[α∈D7] F27[F76[α]]", + "definition_raw": "@{F27|nomn,plur} @{D8|gent,sing}", + "definition_resolved": "братья жены" + } +}, +{ + "model": "rsform.constituenta", + "pk": 399, + "fields": { + "schema": 23, + "order": 105, + "alias": "F86", + "cst_type": "function", + "convention": "", + "term_raw": "свояченицы", + "term_resolved": "свояченицы", + "term_forms": [], + "definition_formal": "[α∈D7] F29[F76[α]]", + "definition_raw": "@{F29|nomn,plur} @{D8|gent,sing}", + "definition_resolved": "сёстры жены" + } +}, +{ + "model": "rsform.constituenta", + "pk": 400, + "fields": { + "schema": 23, + "order": 106, + "alias": "F87", + "cst_type": "function", + "convention": "", + "term_raw": "шуричи", + "term_resolved": "шуричи", + "term_forms": [], + "definition_formal": "[α∈D7] F10[F85[α]]", + "definition_raw": "@{F11|nomn,plur} @{F85|gent,plur}", + "definition_resolved": "сыновья шуринов" + } +}, +{ + "model": "rsform.constituenta", + "pk": 401, + "fields": { + "schema": 23, + "order": 107, + "alias": "F88", + "cst_type": "function", + "convention": "", + "term_raw": "снохи", + "term_resolved": "снохи", + "term_forms": [], + "definition_formal": "[α∈X1] F73[F11[α]]", + "definition_raw": "@{D8|nomn,plur} @{F11|gent,plur}", + "definition_resolved": "жены сыновей" + } +}, +{ + "model": "rsform.constituenta", + "pk": 402, + "fields": { + "schema": 23, + "order": 108, + "alias": "F89", + "cst_type": "function", + "convention": "", + "term_raw": "свояки", + "term_resolved": "свояки", + "term_forms": [], + "definition_formal": "[α∈D7] F72[F86[α]]", + "definition_raw": "@{D7|nomn,plur} @{F86|gent,plur}", + "definition_resolved": "мужья своячениц" + } +}, +{ + "model": "rsform.constituenta", + "pk": 403, + "fields": { + "schema": 23, + "order": 109, + "alias": "F90", + "cst_type": "function", + "convention": "", + "term_raw": "ятровки", + "term_resolved": "ятровки", + "term_forms": [], + "definition_formal": "[α∈D8] F73[F83[α]]", + "definition_raw": "@{D8|nomn,plur} @{F83|gent,plur}", + "definition_resolved": "жены деверей" + } +}, +{ + "model": "rsform.constituenta", + "pk": 404, + "fields": { + "schema": 23, + "order": 110, + "alias": "F91", + "cst_type": "function", + "convention": "", + "term_raw": "зятья", + "term_resolved": "зятья", + "term_forms": [], + "definition_formal": "[α∈X1] F72[F13[α]∪F29[α]∪F84[α]∪F59[α]]", + "definition_raw": "@{D7|nomn,plur} @{F13|gent,plur}, @{F29|gent,plur}, @{F84|gent,plur} или @{F59|gent,plur}", + "definition_resolved": "мужья дочерей, сестёр, золовок или племянниц" + } +}, +{ + "model": "rsform.constituenta", + "pk": 405, + "fields": { + "schema": 23, + "order": 111, + "alias": "F92", + "cst_type": "function", + "convention": "", + "term_raw": "невестки", + "term_resolved": "невестки", + "term_forms": [], + "definition_formal": "[α∈X1] F73[F11[α]∪F27[α]∪F83[α]∪F56[α]]", + "definition_raw": "@{D8|nomn,plur} @{F11|gent,plur}, @{F27|gent,plur}, @{F83|gent,plur} или @{F56|gent,plur}", + "definition_resolved": "жены сыновей, братьев, деверей или племянников" + } +}, +{ + "model": "rsform.constituenta", + "pk": 406, + "fields": { + "schema": 23, + "order": 112, + "alias": "F93", + "cst_type": "function", + "convention": "", + "term_raw": "вуйки", + "term_resolved": "вуйки", + "term_forms": [], + "definition_formal": "[α∈X1] F73[F52[α]]", + "definition_raw": "@{D8|nomn,plur} @{F52|gent,plur}", + "definition_resolved": "жены вуи" + } +}, +{ + "model": "rsform.constituenta", + "pk": 407, + "fields": { + "schema": 23, + "order": 113, + "alias": "F94", + "cst_type": "function", + "convention": "", + "term_raw": "братанихи", + "term_resolved": "братанихи", + "term_forms": [], + "definition_formal": "[α∈X1] F73[F44[α]]", + "definition_raw": "@{D8|nomn,plur} @{F44|gent,plur}", + "definition_resolved": "жены двоюродных братьев" + } +}, +{ + "model": "rsform.constituenta", + "pk": 408, + "fields": { + "schema": 23, + "order": 114, + "alias": "D10", + "cst_type": "term", + "convention": "", + "term_raw": "законные @{D1|nomn,plur}", + "term_resolved": "законные дети", + "term_forms": [], + "definition_formal": "Pr2(Fi1[S4](S3))", + "definition_raw": "@{D1|nomn,plur}, @{D3|nomn,plur} которых состоят в @{S4|loct,sing}", + "definition_resolved": "дети, родители которых состоят в браке" + } +}, +{ + "model": "rsform.constituenta", + "pk": 409, + "fields": { + "schema": 23, + "order": 115, + "alias": "D11", + "cst_type": "term", + "convention": "", + "term_raw": "бастарды", + "term_resolved": "бастарды", + "term_forms": [], + "definition_formal": "D1\\D10", + "definition_raw": "@{D1|nomn,plur}, @{D3|nomn,plur} которых не состоят в @{S4|loct,sing}", + "definition_resolved": "дети, родители которых не состоят в браке" + } +}, +{ + "model": "rsform.constituenta", + "pk": 410, + "fields": { + "schema": 23, + "order": 116, + "alias": "F95", + "cst_type": "function", + "convention": "", + "term_raw": "сводные @{F25|nomn,plur}", + "term_resolved": "сводные сиблинги", + "term_forms": [], + "definition_formal": "[α∈X1] F6[F74[F15[α]]] \\ F25[α] \\ {α}", + "definition_raw": "@{D1|nomn,plur} @{D9|gent,plur} @{D3|gent,plur}, не являющиеся @{F25|ablt,plur}", + "definition_resolved": "дети супругов родителей, не являющиеся сиблингами" + } +}, +{ + "model": "rsform.constituenta", + "pk": 411, + "fields": { + "schema": 23, + "order": 117, + "alias": "F96", + "cst_type": "function", + "convention": "", + "term_raw": "сводные @{F27|nomn,plur}", + "term_resolved": "сводные братья", + "term_forms": [], + "definition_formal": "[α∈X1] F10[F74[F15[α]]] \\ F27[α] \\ {α}", + "definition_raw": "@{F11|nomn,plur} @{D9|gent,plur} @{D3|gent,plur}, не являющиеся @{F27|ablt,plur}", + "definition_resolved": "сыновья супругов родителей, не являющиеся братьями" + } +}, +{ + "model": "rsform.constituenta", + "pk": 412, + "fields": { + "schema": 23, + "order": 118, + "alias": "F97", + "cst_type": "function", + "convention": "", + "term_raw": "сводные @{F29|nomn,plur}", + "term_resolved": "сводные сёстры", + "term_forms": [], + "definition_formal": "[α∈X1] F12[F74[F15[α]]] \\ F29[α] \\ {α}", + "definition_raw": "@{F13|nomn,plur} @{D9|gent,plur} @{D3|gent,plur}, не являющиеся @{F29|ablt,plur}", + "definition_resolved": "дочери супругов родителей, не являющиеся сёстрами" + } +}, +{ + "model": "rsform.constituenta", + "pk": 413, + "fields": { + "schema": 23, + "order": 119, + "alias": "F98", + "cst_type": "function", + "convention": "", + "term_raw": "пасынки", + "term_resolved": "пасынки", + "term_forms": [], + "definition_formal": "[α∈X1] F10[F74[{α}]] \\ F11[α]", + "definition_raw": "@{F11|nomn,plur} @{D9|gent,sing}, не являющиеся @{D1|ablt,plur}", + "definition_resolved": "сыновья супруга, не являющиеся детьми" + } +}, +{ + "model": "rsform.constituenta", + "pk": 414, + "fields": { + "schema": 23, + "order": 120, + "alias": "F99", + "cst_type": "function", + "convention": "", + "term_raw": "падчерицы", + "term_resolved": "падчерицы", + "term_forms": [], + "definition_formal": "[α∈X1] F12[F74[{α}]] \\ F13[α]", + "definition_raw": "@{F13|nomn,plur} @{D9|gent,sing}, не являющиеся @{D1|ablt,plur}", + "definition_resolved": "дочери супруга, не являющиеся детьми" + } +}, +{ + "model": "rsform.constituenta", + "pk": 415, + "fields": { + "schema": 23, + "order": 121, + "alias": "F100", + "cst_type": "function", + "convention": "", + "term_raw": "отчимы", + "term_resolved": "отчимы", + "term_forms": [], + "definition_formal": "[α∈X1] F72[F17[{α}]] \\ F16[{α}]", + "definition_raw": "@{D7|nomn,sing} @{D5|gent,sing}, не являющийся @{D4|ablt,sing}", + "definition_resolved": "муж матери, не являющийся отцом" + } +}, +{ + "model": "rsform.constituenta", + "pk": 416, + "fields": { + "schema": 23, + "order": 122, + "alias": "F101", + "cst_type": "function", + "convention": "", + "term_raw": "мачехи", + "term_resolved": "мачехи", + "term_forms": [], + "definition_formal": "[α∈X1] F73[F16[{α}]] \\ F17[{α}]", + "definition_raw": "@{D8|nomn,sing} @{D4|gent,sing}, не являющаяся @{D5|ablt,sing}", + "definition_resolved": "жена отца, не являющаяся матерью" + } +}, +{ + "model": "rsform.constituenta", + "pk": 417, + "fields": { + "schema": 24, + "order": 1, + "alias": "X1", + "cst_type": "basic", + "convention": "", + "term_raw": "звуки", + "term_resolved": "звуки", + "term_forms": [], + "definition_formal": "", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 418, + "fields": { + "schema": 24, + "order": 2, + "alias": "C1", + "cst_type": "constant", + "convention": "", + "term_raw": "длительности", + "term_resolved": "длительности", + "term_forms": [], + "definition_formal": "", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 419, + "fields": { + "schema": 24, + "order": 3, + "alias": "C2", + "cst_type": "constant", + "convention": "", + "term_raw": "позиции", + "term_resolved": "позиции", + "term_forms": [], + "definition_formal": "", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 420, + "fields": { + "schema": 24, + "order": 4, + "alias": "S1", + "cst_type": "structure", + "convention": "", + "term_raw": "@{C1|plur,nomn} @{X1|plur,gent}", + "term_resolved": "длительности звуков", + "term_forms": [], + "definition_formal": "ℬ(X1×C1)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 421, + "fields": { + "schema": 24, + "order": 5, + "alias": "S2", + "cst_type": "structure", + "convention": "", + "term_raw": "базовые мелодии", + "term_resolved": "базовые мелодии", + "term_forms": [], + "definition_formal": "ℬℬ(C2×X1)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 422, + "fields": { + "schema": 24, + "order": 6, + "alias": "S3", + "cst_type": "structure", + "convention": "", + "term_raw": "максимум через родовую структуру", + "term_resolved": "максимум через родовую структуру", + "term_forms": [], + "definition_formal": "ℬ(ℬ(C1)×C1)", + "definition_raw": "функция максимум данного набора длительностей", + "definition_resolved": "функция максимум данного набора длительностей" + } +}, +{ + "model": "rsform.constituenta", + "pk": 423, + "fields": { + "schema": 24, + "order": 7, + "alias": "A1", + "cst_type": "axiom", + "convention": "", + "term_raw": "длительность звука есть функция от звука", + "term_resolved": "длительность звука есть функция от звука", + "term_forms": [], + "definition_formal": "Pr1(S1)=X1 & card(Pr1(S1))=card(S1)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 424, + "fields": { + "schema": 24, + "order": 8, + "alias": "A2", + "cst_type": "axiom", + "convention": "", + "term_raw": "ненулевая длительность звука", + "term_resolved": "ненулевая длительность звука", + "term_forms": [], + "definition_formal": "∀ν∈Pr2(S1) ν>0", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 425, + "fields": { + "schema": 24, + "order": 9, + "alias": "A3", + "cst_type": "axiom", + "convention": "", + "term_raw": "базовые мелодии являются корректными последовательностями звуков", + "term_resolved": "базовые мелодии являются корректными последовательностями звуков", + "term_forms": [], + "definition_formal": "S2⊆D1", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 426, + "fields": { + "schema": 24, + "order": 10, + "alias": "F1", + "cst_type": "function", + "convention": "", + "term_raw": "длительность звука", + "term_resolved": "длительность звука", + "term_forms": [], + "definition_formal": "[α∈X1] debool(Pr2(Fi1[{α}](S1)))", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 427, + "fields": { + "schema": 24, + "order": 11, + "alias": "P1", + "cst_type": "predicate", + "convention": "", + "term_raw": "мелодия - корректная последовательность звуков", + "term_resolved": "мелодия - корректная последовательность звуков", + "term_forms": [], + "definition_formal": "[σ∈ℬ(C2×X1)] card(Pr1(σ))=card(σ) & ∀α∈Pr1(σ) (α≠card(σ) ⇒ ∃γ∈σ pr1(γ)=α+1)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 428, + "fields": { + "schema": 24, + "order": 12, + "alias": "D1", + "cst_type": "term", + "convention": "", + "term_raw": "мелодии", + "term_resolved": "мелодии", + "term_forms": [], + "definition_formal": "D{σ∈ℬ(C2×X1) | P1[σ]}", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 429, + "fields": { + "schema": 24, + "order": 13, + "alias": "F2", + "cst_type": "function", + "convention": "", + "term_raw": "звук мелодии на данной позиции", + "term_resolved": "звук мелодии на данной позиции", + "term_forms": [], + "definition_formal": "[σ∈D1, α∈C2] debool(Pr2(Fi1[{α}](σ)))", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 430, + "fields": { + "schema": 24, + "order": 14, + "alias": "F3", + "cst_type": "function", + "convention": "", + "term_raw": "звуки данной длительности", + "term_resolved": "звуки данной длительности", + "term_forms": [], + "definition_formal": "[α∈C1] Pr1(Fi2[{α}](S1))", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 431, + "fields": { + "schema": 24, + "order": 15, + "alias": "F4", + "cst_type": "function", + "convention": "", + "term_raw": "длительность мелодии", + "term_resolved": "длительность мелодии", + "term_forms": [], + "definition_formal": "[σ∈D1] pr1(R{(α,β):=(0, 1) | βα}", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 436, + "fields": { + "schema": 24, + "order": 20, + "alias": "F9", + "cst_type": "function", + "convention": "", + "term_raw": "максимум через определение натуральных чисел", + "term_resolved": "максимум через определение натуральных чисел", + "term_forms": [], + "definition_formal": "[σ∈ℬ(Z)] red(σ)+1", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 437, + "fields": { + "schema": 24, + "order": 21, + "alias": "F10", + "cst_type": "function", + "convention": "", + "term_raw": "максимум через функцию выбора элемента", + "term_resolved": "максимум через функцию выбора элемента", + "term_forms": [], + "definition_formal": "[σ∈ℬ(C1)] \nR{ (α, μ, ξ):=(σ\\σ, 0, CHOOSE[σ]) | α≠σ | (α∪{ξ}, F8[ξ,μ], CHOOSE[σ\\α\\{ξ}])}", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 438, + "fields": { + "schema": 25, + "order": 1, + "alias": "X1", + "cst_type": "basic", + "convention": "", + "term_raw": "люди", + "term_resolved": "люди", + "term_forms": [], + "definition_formal": "", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 439, + "fields": { + "schema": 25, + "order": 2, + "alias": "S1", + "cst_type": "structure", + "convention": "", + "term_raw": "отношение \"быть другом\"", + "term_resolved": "отношение \"быть другом\"", + "term_forms": [ + { + "text": "отношения \"быть другом\"", + "tags": "sing,gent" + } + ], + "definition_formal": "ℬ(X1×X1)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 440, + "fields": { + "schema": 25, + "order": 3, + "alias": "S2", + "cst_type": "structure", + "convention": "понимается в смысле фактической вражды - активных действий, не путать с потенциальной враждой и восприятием субъектом своих врагов", + "term_raw": "отношение \"быть врагом\"", + "term_resolved": "отношение \"быть врагом\"", + "term_forms": [], + "definition_formal": "ℬ(X1×X1)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 441, + "fields": { + "schema": 25, + "order": 4, + "alias": "P1", + "cst_type": "predicate", + "convention": "", + "term_raw": "антирефлексивность", + "term_resolved": "антирефлексивность", + "term_forms": [], + "definition_formal": "[σ∈ℬ(R1×R1)] ∀ξ∈Pr1(σ) (ξ,ξ)∉σ", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 442, + "fields": { + "schema": 25, + "order": 5, + "alias": "P2", + "cst_type": "predicate", + "convention": "", + "term_raw": "симметричность", + "term_resolved": "симметричность", + "term_forms": [], + "definition_formal": "[σ∈ℬ(R1×R1)] ∀(ξ1,ξ2)∈σ (ξ1≠ξ1 ⇒ (ξ2,ξ1)∈σ)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 443, + "fields": { + "schema": 25, + "order": 6, + "alias": "F1", + "cst_type": "function", + "convention": "", + "term_raw": "сечение по первому сомножителю", + "term_resolved": "сечение по первому сомножителю", + "term_forms": [], + "definition_formal": "[α∈ℬ(R1), σ∈ℬ(R1×R2)] Pr2(Fi1[α](σ))", + "definition_raw": "элементы второй проекции, состоящие в отношении с элементами данного подмножества первой проекции", + "definition_resolved": "элементы второй проекции, состоящие в отношении с элементами данного подмножества первой проекции" + } +}, +{ + "model": "rsform.constituenta", + "pk": 444, + "fields": { + "schema": 25, + "order": 7, + "alias": "F2", + "cst_type": "function", + "convention": "", + "term_raw": "сечение по второму сомножителю", + "term_resolved": "сечение по второму сомножителю", + "term_forms": [], + "definition_formal": "[α∈ℬ(R1), σ∈ℬ(R2×R1)] Pr1(Fi2[α](σ))", + "definition_raw": "элементы первой проекции, состоящие в отношении с элементами данного подмножества второй проекции", + "definition_resolved": "элементы первой проекции, состоящие в отношении с элементами данного подмножества второй проекции" + } +}, +{ + "model": "rsform.constituenta", + "pk": 445, + "fields": { + "schema": 25, + "order": 8, + "alias": "F3", + "cst_type": "function", + "convention": "", + "term_raw": "множество-пересечение", + "term_resolved": "множество-пересечение", + "term_forms": [], + "definition_formal": "[σ∈ℬℬ(R1)] D{ξ∈red(σ) | ∀α∈σ ξ∈α}", + "definition_raw": "элементы, состоящие во всех подмножествах данного множества подмножеств", + "definition_resolved": "элементы, состоящие во всех подмножествах данного множества подмножеств" + } +}, +{ + "model": "rsform.constituenta", + "pk": 446, + "fields": { + "schema": 25, + "order": 9, + "alias": "F4", + "cst_type": "function", + "convention": "", + "term_raw": "симметричное ядро", + "term_resolved": "симметричное ядро", + "term_forms": [], + "definition_formal": "[σ∈ℬ(R1×R1)] D{(ξ1,ξ2)∈σ | (ξ2,ξ1)∈σ}", + "definition_raw": "максимальное подмножество бинарного отношения, обладающее свойством симметричности", + "definition_resolved": "максимальное подмножество бинарного отношения, обладающее свойством симметричности" + } +}, +{ + "model": "rsform.constituenta", + "pk": 447, + "fields": { + "schema": 25, + "order": 10, + "alias": "F5", + "cst_type": "function", + "convention": "", + "term_raw": "опосредованно связанные отношением", + "term_resolved": "опосредованно связанные отношением", + "term_forms": [], + "definition_formal": "[α∈R1, σ∈ℬ(R1×R1)] pr2(R{(ξ, γ):=(F1[{α},σ], F1[{α},σ]) | (F1[ξ,σ], γ∪F1[ξ,σ])})", + "definition_raw": "потомок - это ребенок или ребенок потомка", + "definition_resolved": "потомок - это ребенок или ребенок потомка" + } +}, +{ + "model": "rsform.constituenta", + "pk": 448, + "fields": { + "schema": 25, + "order": 11, + "alias": "F6", + "cst_type": "function", + "convention": "", + "term_raw": "обратное отношение", + "term_resolved": "обратное отношение", + "term_forms": [], + "definition_formal": "[σ∈ℬ(R1×R1)] I{(pr2(α), pr1(α)) | α:∈σ}", + "definition_raw": "множество пар, обратных парам исходного отношения", + "definition_resolved": "множество пар, обратных парам исходного отношения" + } +}, +{ + "model": "rsform.constituenta", + "pk": 449, + "fields": { + "schema": 25, + "order": 12, + "alias": "F7", + "cst_type": "function", + "convention": "", + "term_raw": "симметричное замыкание", + "term_resolved": "симметричное замыкание", + "term_forms": [], + "definition_formal": "[σ∈ℬ(R1×R1)] σ∪F6[σ]", + "definition_raw": "неориентированный граф, ребра которого соответствуют орграфу, задаваемому исходным отношением", + "definition_resolved": "неориентированный граф, ребра которого соответствуют орграфу, задаваемому исходным отношением" + } +}, +{ + "model": "rsform.constituenta", + "pk": 450, + "fields": { + "schema": 25, + "order": 13, + "alias": "P3", + "cst_type": "predicate", + "convention": "", + "term_raw": "сильная связность", + "term_resolved": "сильная связность", + "term_forms": [], + "definition_formal": "[σ∈ℬ(R1×R1)] ∀ξ∈Pr1(σ) F5[ξ, σ]=Pr1(σ)∪Pr2(σ)", + "definition_raw": "каждый элемент носителя бинарного отношения достижим из любого элемента носителя", + "definition_resolved": "каждый элемент носителя бинарного отношения достижим из любого элемента носителя" + } +}, +{ + "model": "rsform.constituenta", + "pk": 451, + "fields": { + "schema": 25, + "order": 14, + "alias": "P4", + "cst_type": "predicate", + "convention": "", + "term_raw": "связность", + "term_resolved": "связность", + "term_forms": [], + "definition_formal": "[σ∈ℬ(R1×R1)] P3[F7[σ]]", + "definition_raw": "@{F7|sing,nomn} обладает @{P3|sing,ablt}", + "definition_resolved": "симметричное замыкание обладает сильной связностью" + } +}, +{ + "model": "rsform.constituenta", + "pk": 452, + "fields": { + "schema": 25, + "order": 15, + "alias": "A1", + "cst_type": "axiom", + "convention": "", + "term_raw": "@{P1|sing,nomn} @{S1|sing,gent}", + "term_resolved": "антирефлексивность отношение \"быть другом\"", + "term_forms": [], + "definition_formal": "P1[S1]", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 453, + "fields": { + "schema": 25, + "order": 16, + "alias": "A2", + "cst_type": "axiom", + "convention": "", + "term_raw": "@{P2|sing,nomn} @{S1|sing,gent}", + "term_resolved": "симметричность отношение \"быть другом\"", + "term_forms": [], + "definition_formal": "P2[S1]", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 454, + "fields": { + "schema": 25, + "order": 17, + "alias": "D1", + "cst_type": "term", + "convention": "", + "term_raw": "друзья", + "term_resolved": "друзья", + "term_forms": [], + "definition_formal": "Pr1(S1)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 455, + "fields": { + "schema": 25, + "order": 18, + "alias": "F8", + "cst_type": "function", + "convention": "", + "term_raw": "@{D1|plur,nomn} группы @{X1|plur,gent}", + "term_resolved": "друзья группы людей", + "term_forms": [], + "definition_formal": "[α∈ℬ(X1)] F1[α ,S1]", + "definition_raw": "@{X1|plur,nomn}, являющиеся @{D1|plur,ablt} хотя бы одного из данной группы @{X1|plur,gent}", + "definition_resolved": "люди, являющиеся друзьями хотя бы одного из данной группы людей" + } +}, +{ + "model": "rsform.constituenta", + "pk": 456, + "fields": { + "schema": 25, + "order": 19, + "alias": "F9", + "cst_type": "function", + "convention": "", + "term_raw": "@{D1|plur,nomn} @{X1|sing,gent}", + "term_resolved": "друзья человека", + "term_forms": [], + "definition_formal": "[α∈X1] F8[{α}]", + "definition_raw": "@{D1|plur,nomn} данного @{X1|sing,gent}", + "definition_resolved": "друзья данного человека" + } +}, +{ + "model": "rsform.constituenta", + "pk": 457, + "fields": { + "schema": 25, + "order": 20, + "alias": "D2", + "cst_type": "term", + "convention": "", + "term_raw": "@{X1|plur,nomn}, не имеющие @{D1|plur,gent}", + "term_resolved": "люди, не имеющие друзей", + "term_forms": [], + "definition_formal": "X1\\D1", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 458, + "fields": { + "schema": 25, + "order": 21, + "alias": "A3", + "cst_type": "axiom", + "convention": "", + "term_raw": "несовместимость @{S1|sing,gent} и @{S2|sing,gent}", + "term_resolved": "несовместимость отношение \"быть другом\" и отношение \"быть врагом\"", + "term_forms": [], + "definition_formal": "S1∩S2=∅", + "definition_raw": "@{D1|sing,nomn} не может быть @{D3|sing,ablt}", + "definition_resolved": "друг не может быть врагом" + } +}, +{ + "model": "rsform.constituenta", + "pk": 459, + "fields": { + "schema": 25, + "order": 22, + "alias": "D3", + "cst_type": "term", + "convention": "", + "term_raw": "враги", + "term_resolved": "враги", + "term_forms": [], + "definition_formal": "Pr2(S2)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 460, + "fields": { + "schema": 25, + "order": 23, + "alias": "D4", + "cst_type": "term", + "convention": "исходя из этимологии слов возможно стоит рассмотреть термин \"узники\" или \"юзники\"", + "term_raw": "вражданты", + "term_resolved": "вражданты", + "term_forms": [], + "definition_formal": "Pr1(S2)", + "definition_raw": "@{X1|plur,nomn}, имеющие @{D3|plur,gent}", + "definition_resolved": "люди, имеющие врагов" + } +}, +{ + "model": "rsform.constituenta", + "pk": 461, + "fields": { + "schema": 25, + "order": 24, + "alias": "F10", + "cst_type": "function", + "convention": "", + "term_raw": "@{D3|plur,nomn} группы @{X1|plur,gent}", + "term_resolved": "враги группы людей", + "term_forms": [], + "definition_formal": "[α∈ℬ(X1)] F1[α ,S2]", + "definition_raw": "@{X1|plur,nomn}, являющиеся @{D3|plur,ablt} хотя бы одного из данной группы @{X1|plur,gent}", + "definition_resolved": "люди, являющиеся врагами хотя бы одного из данной группы людей" + } +}, +{ + "model": "rsform.constituenta", + "pk": 462, + "fields": { + "schema": 25, + "order": 25, + "alias": "F11", + "cst_type": "function", + "convention": "", + "term_raw": "@{D3|plur,nomn} @{X1|sing,gent}", + "term_resolved": "враги человека", + "term_forms": [], + "definition_formal": "[α∈X1] F8[{α}]", + "definition_raw": "@{D3|plur,nomn} данного @{X1|sing,gent}", + "definition_resolved": "враги данного человека" + } +}, +{ + "model": "rsform.constituenta", + "pk": 463, + "fields": { + "schema": 25, + "order": 26, + "alias": "F12", + "cst_type": "function", + "convention": "", + "term_raw": "общие @{F10|plur,nomn}", + "term_resolved": "общие враги группы людей", + "term_forms": [], + "definition_formal": "[α∈ℬ(X1)] F3[I{σ | ξ:∈α; σ:=F11[ξ] }]", + "definition_raw": "@{X1|plur,nomn}, являющиеся @{D3|plur,ablt} каждого из данной группы @{X1|plur,gent}", + "definition_resolved": "люди, являющиеся врагами каждого из данной группы людей" + } +}, +{ + "model": "rsform.constituenta", + "pk": 464, + "fields": { + "schema": 25, + "order": 27, + "alias": "F13", + "cst_type": "function", + "convention": "", + "term_raw": "@{D4|plur,nomn} группы @{X1|plur,gent}", + "term_resolved": "вражданты группы людей", + "term_forms": [], + "definition_formal": "[α∈ℬ(X1)] F2[α ,S2]", + "definition_raw": "@{X1|plur,nomn}, являющиеся @{D4|plur,ablt} хотя бы одного из данной группы @{X1|plur,gent}", + "definition_resolved": "люди, являющиеся враждантами хотя бы одного из данной группы людей" + } +}, +{ + "model": "rsform.constituenta", + "pk": 465, + "fields": { + "schema": 25, + "order": 28, + "alias": "F14", + "cst_type": "function", + "convention": "", + "term_raw": "@{D4|plur,nomn} @{X1|sing,gent}", + "term_resolved": "вражданты человека", + "term_forms": [], + "definition_formal": "[α∈X1] F8[{α}]", + "definition_raw": "@{D4|plur,nomn} данного @{X1|sing,gent}", + "definition_resolved": "вражданты данного человека" + } +}, +{ + "model": "rsform.constituenta", + "pk": 466, + "fields": { + "schema": 25, + "order": 29, + "alias": "D5", + "cst_type": "term", + "convention": "", + "term_raw": "взаимные @{D3|plur,nomn}", + "term_resolved": "взаимные враги", + "term_forms": [], + "definition_formal": "F4[S2]", + "definition_raw": "@{F4|sing,nomn} @{S2|sing,gent}", + "definition_resolved": "симметричное ядро отношение \"быть врагом\"" + } +}, +{ + "model": "rsform.constituenta", + "pk": 467, + "fields": { + "schema": 25, + "order": 30, + "alias": "F15", + "cst_type": "function", + "convention": "", + "term_raw": "@{D1|plur,nomn} @{D1|plur,gent}", + "term_resolved": "друзья друзей", + "term_forms": [], + "definition_formal": "[α∈X1] F8[F9[α]]", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 468, + "fields": { + "schema": 25, + "order": 31, + "alias": "F16", + "cst_type": "function", + "convention": "", + "term_raw": "@{D3|plur,nomn} @{D3|plur,gent}", + "term_resolved": "враги врагов", + "term_forms": [], + "definition_formal": "[α∈X1] F10[F11[α]]", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 469, + "fields": { + "schema": 25, + "order": 32, + "alias": "F17", + "cst_type": "function", + "convention": "", + "term_raw": "@{D1|plur,nomn} @{D3|plur,gent}", + "term_resolved": "друзья врагов", + "term_forms": [], + "definition_formal": "[α∈X1] F8[F11[α]]", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 470, + "fields": { + "schema": 25, + "order": 33, + "alias": "F18", + "cst_type": "function", + "convention": "", + "term_raw": "@{D3|plur,nomn} @{D1|plur,gent}", + "term_resolved": "враги друзей", + "term_forms": [], + "definition_formal": "[α∈X1] F10[F9[α]]", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 471, + "fields": { + "schema": 25, + "order": 34, + "alias": "F19", + "cst_type": "function", + "convention": "", + "term_raw": "союзники", + "term_resolved": "союзники", + "term_forms": [], + "definition_formal": "[α∈X1] F13[F11[α]]\\{α}", + "definition_raw": "@{D4|plur,nomn} @{D3|plur,gent}, отличные от данного @{X1|sing,gent}", + "definition_resolved": "вражданты врагов, отличные от данного человека" + } +}, +{ + "model": "rsform.constituenta", + "pk": 472, + "fields": { + "schema": 25, + "order": 35, + "alias": "F20", + "cst_type": "function", + "convention": "", + "term_raw": "@{F19|plur,nomn}-не@{D3|plur,nomn}", + "term_resolved": "союзники-невраги", + "term_forms": [], + "definition_formal": "[α∈X1] F19[α]\\F11[α]", + "definition_raw": "@{F19|plur,nomn}, не являющиеся @{D3|plur,ablt} данного @{X1|sing,gent}", + "definition_resolved": "союзники, не являющиеся врагами данного человека" + } +}, +{ + "model": "rsform.constituenta", + "pk": 473, + "fields": { + "schema": 25, + "order": 36, + "alias": "F21", + "cst_type": "function", + "convention": "", + "term_raw": "@{F19|plur,nomn}-@{D3|plur,nomn}", + "term_resolved": "союзники-враги", + "term_forms": [], + "definition_formal": "[α∈X1] F19[α]∩F11[α]", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 474, + "fields": { + "schema": 25, + "order": 37, + "alias": "F22", + "cst_type": "function", + "convention": "", + "term_raw": "@{F19|plur,nomn}-@{D1|plur,nomn}", + "term_resolved": "союзники-друзья", + "term_forms": [], + "definition_formal": "[α∈X1] F19[α]∩F9[α]", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 475, + "fields": { + "schema": 25, + "order": 38, + "alias": "F23", + "cst_type": "function", + "convention": "", + "term_raw": "полные @{F19|plur,nomn}", + "term_resolved": "полные союзники", + "term_forms": [], + "definition_formal": "[α∈X1] I{ξ | σ:=F11[α]; ξ:∈F19[α]; F11[ξ]=σ}", + "definition_raw": "@{X1|plur,nomn}, все @{D3|plur,nomn} которых также являются @{D3|plur,ablt} данного @{X1|sing,gent} и наоборот", + "definition_resolved": "люди, все враги которых также являются врагами данного человека и наоборот" + } +}, +{ + "model": "rsform.constituenta", + "pk": 476, + "fields": { + "schema": 25, + "order": 39, + "alias": "P5", + "cst_type": "predicate", + "convention": "", + "term_raw": "группа @{D1|plur,gent}", + "term_resolved": "группа друзей", + "term_forms": [], + "definition_formal": "[α∈ℬ(X1)] P4[Fi1,2[α,α](S1)]", + "definition_raw": "@{X1|plur,nomn}, связанные @{S1|sing,ablt}", + "definition_resolved": "люди, связанные отношение \"быть другом\"" + } +}, +{ + "model": "rsform.constituenta", + "pk": 477, + "fields": { + "schema": 25, + "order": 40, + "alias": "P6", + "cst_type": "predicate", + "convention": "", + "term_raw": "@{P5|sing,nomn} с полной дружбой", + "term_resolved": "группа друзей с полной дружбой", + "term_forms": [], + "definition_formal": "[α∈ℬ(X1)] ∀ξ1,ξ2∈α (ξ1≠ξ2 ⇒ (ξ1,ξ2)∈S1)", + "definition_raw": "@{X1|plur,nomn}, связанные @{S1|sing,ablt} с каждым другим членом группы", + "definition_resolved": "люди, связанные отношение \"быть другом\" с каждым другим членом группы" + } +}, +{ + "model": "rsform.constituenta", + "pk": 478, + "fields": { + "schema": 25, + "order": 41, + "alias": "P7", + "cst_type": "predicate", + "convention": "", + "term_raw": "замкнутая @{P5|sing,nomn}", + "term_resolved": "замкнутая группа друзей", + "term_forms": [], + "definition_formal": "[α∈ℬ(X1)] P5[α] & Pr2(Fi1[α](S1))⊆α", + "definition_raw": "@{X1|plur,nomn}, связанные @{S1|sing,ablt} только с другими членами этой группы", + "definition_resolved": "люди, связанные отношение \"быть другом\" только с другими членами этой группы" + } +}, +{ + "model": "rsform.constituenta", + "pk": 479, + "fields": { + "schema": 25, + "order": 42, + "alias": "P8", + "cst_type": "predicate", + "convention": "", + "term_raw": "замкнутая @{P6|sing,nomn}", + "term_resolved": "замкнутая группа друзей с полной дружбой", + "term_forms": [], + "definition_formal": "[α∈ℬ(X1)] P7[α] & P6[α]", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 480, + "fields": { + "schema": 25, + "order": 43, + "alias": "P9", + "cst_type": "predicate", + "convention": "", + "term_raw": "группа неврагов", + "term_resolved": "группа неврагов", + "term_forms": [], + "definition_formal": "[α∈ℬ(X1)] Fi1,2[α,α](S2)=∅", + "definition_raw": "@{X1|plur,nomn}, не связанные @{S2|sing,ablt}", + "definition_resolved": "люди, не связанные отношение \"быть врагом\"" + } +}, +{ + "model": "rsform.constituenta", + "pk": 481, + "fields": { + "schema": 25, + "order": 44, + "alias": "P10", + "cst_type": "predicate", + "convention": "", + "term_raw": "группа @{F19|plur,gent}", + "term_resolved": "группа союзников", + "term_forms": [], + "definition_formal": "[α∈ℬ(X1)] F12[α]≠∅", + "definition_raw": "@{X1|plur,nomn}, имеющие @{F12|plur,gent}", + "definition_resolved": "люди, имеющие общих врагов группы людей" + } +}, +{ + "model": "rsform.constituenta", + "pk": 482, + "fields": { + "schema": 25, + "order": 45, + "alias": "P11", + "cst_type": "predicate", + "convention": "", + "term_raw": "группа @{D1|plur,gent}-@{F19|plur,gent}", + "term_resolved": "группа друзей-союзников", + "term_forms": [], + "definition_formal": "[α∈ℬ(X1)] P10[α] & P5[α]", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 483, + "fields": { + "schema": 25, + "order": 46, + "alias": "P12", + "cst_type": "predicate", + "convention": "", + "term_raw": "враждебные группы", + "term_resolved": "враждебные группы", + "term_forms": [], + "definition_formal": "[α∈ℬ(X1), β∈ℬ(X1)] α×β⊆D5", + "definition_raw": "каждый член одной группы враждует с каждым членом другой группы", + "definition_resolved": "каждый член одной группы враждует с каждым членом другой группы" + } +}, +{ + "model": "rsform.constituenta", + "pk": 484, + "fields": { + "schema": 26, + "order": 1, + "alias": "X1", + "cst_type": "basic", + "convention": "на 14.03.2023 сотрудники ЦИВТ КОНЦЕПТ", + "term_raw": "сотрудники", + "term_resolved": "сотрудники", + "term_forms": [], + "definition_formal": "", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 485, + "fields": { + "schema": 26, + "order": 2, + "alias": "S1", + "cst_type": "structure", + "convention": "", + "term_raw": "отношение \"начальник-подчиненный\"", + "term_resolved": "отношение \"начальник-подчиненный\"", + "term_forms": [], + "definition_formal": "ℬ(X1×X1)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 486, + "fields": { + "schema": 26, + "order": 3, + "alias": "D1", + "cst_type": "term", + "convention": "", + "term_raw": "начальники", + "term_resolved": "начальники", + "term_forms": [], + "definition_formal": "Pr1(S1)", + "definition_raw": "сотрудники, находящиеся на первом месте в @{S1|sing,loct} хотя бы с одним @{X1|sing,ablt}", + "definition_resolved": "сотрудники, находящиеся на первом месте в отношении \"начальник-подчинённом\" хотя бы с одним сотрудником" + } +}, +{ + "model": "rsform.constituenta", + "pk": 487, + "fields": { + "schema": 26, + "order": 4, + "alias": "D2", + "cst_type": "term", + "convention": "", + "term_raw": "подчиненные", + "term_resolved": "подчиненные", + "term_forms": [ + { + "text": "подчиненный", + "tags": "sing,nomn" + }, + { + "text": "подчиненного", + "tags": "sing,gent" + }, + { + "text": "подчиненному", + "tags": "sing,datv" + }, + { + "text": "подчиненных", + "tags": "plur,gent" + }, + { + "text": "подчиненного", + "tags": "sing,ablt" + }, + { + "text": "подчиненным", + "tags": "plur,datv" + }, + { + "text": "подчиненных", + "tags": "plur,ablt" + }, + { + "text": "подчиненным", + "tags": "sing,accs" + }, + { + "text": "подчиненном", + "tags": "sing,loct" + }, + { + "text": "подчиненными", + "tags": "plur,accs" + }, + { + "text": "подчиненных", + "tags": "plur,loct" + } + ], + "definition_formal": "Pr2(S1)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 488, + "fields": { + "schema": 26, + "order": 5, + "alias": "D3", + "cst_type": "term", + "convention": "", + "term_raw": "самоначальники", + "term_resolved": "самоначальники", + "term_forms": [], + "definition_formal": "D{ξ ∈ X1 | (ξ,ξ)∈S1 }", + "definition_raw": "@{X1|plur,nomn}, находящиеся в @{S1|sing,loct} сами с собой", + "definition_resolved": "сотрудники, находящиеся в отношении \"начальник-подчинённом\" сами с собой" + } +}, +{ + "model": "rsform.constituenta", + "pk": 489, + "fields": { + "schema": 26, + "order": 6, + "alias": "A1", + "cst_type": "axiom", + "convention": "", + "term_raw": "", + "term_resolved": "", + "term_forms": [], + "definition_formal": "D3 = ∅", + "definition_raw": "@{X1|sing,nomn} не является собственным @{D1|sing,ablt}", + "definition_resolved": "сотрудник не является собственным начальником" + } +}, +{ + "model": "rsform.constituenta", + "pk": 490, + "fields": { + "schema": 26, + "order": 7, + "alias": "D4", + "cst_type": "term", + "convention": "", + "term_raw": "@{X1|plur,nomn}, имеющие начальников и подчиненных", + "term_resolved": "сотрудники, имеющие начальников и подчиненных", + "term_forms": [], + "definition_formal": "D2∪D3", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 491, + "fields": { + "schema": 26, + "order": 8, + "alias": "D5", + "cst_type": "term", + "convention": "", + "term_raw": "@{D1|plur,nomn} верхнего уровня", + "term_resolved": "начальники верхнего уровня", + "term_forms": [], + "definition_formal": "D1\\D2", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 492, + "fields": { + "schema": 26, + "order": 9, + "alias": "D6", + "cst_type": "term", + "convention": "", + "term_raw": "@{D2|plur,nomn} нижнего уровня", + "term_resolved": "подчиненные нижнего уровня", + "term_forms": [], + "definition_formal": "D2\\D1", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 493, + "fields": { + "schema": 26, + "order": 10, + "alias": "F1", + "cst_type": "function", + "convention": "", + "term_raw": "@{D2|plur,nomn} группы @{X1|plur,gent}", + "term_resolved": "подчиненные группы сотрудников", + "term_forms": [], + "definition_formal": "[α∈ℬ(X1)] Pr2(Fi1[α](S1))", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 494, + "fields": { + "schema": 26, + "order": 11, + "alias": "F2", + "cst_type": "function", + "convention": "", + "term_raw": "@{D2|plur,nomn} @{X1|sing,gent}", + "term_resolved": "подчиненные сотрудника", + "term_forms": [], + "definition_formal": "[α∈X1] F1[{α}]", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 495, + "fields": { + "schema": 26, + "order": 12, + "alias": "F3", + "cst_type": "function", + "convention": "", + "term_raw": "полный набор @{D2|plur,gent} группы @{X1|plur,gent}", + "term_resolved": "полный набор подчинённых группы сотрудников", + "term_forms": [], + "definition_formal": "[α∈ℬ(X1)] R{ξ:=F1[α] | ξ∪F1[ξ]}", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 496, + "fields": { + "schema": 26, + "order": 13, + "alias": "F4", + "cst_type": "function", + "convention": "", + "term_raw": "полный набор @{D2|plur,gent} @{X1|sing,gent}", + "term_resolved": "полный набор подчинённых сотрудника", + "term_forms": [], + "definition_formal": "[α∈X1] F3[{α}]", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 497, + "fields": { + "schema": 26, + "order": 14, + "alias": "F5", + "cst_type": "function", + "convention": "", + "term_raw": "опосредованные @{D2|plur,nomn} @{X1|sing,gent}", + "term_resolved": "опосредованные подчиненные сотрудника", + "term_forms": [], + "definition_formal": "[α∈X1] F4[α]\\F2[α]", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 498, + "fields": { + "schema": 26, + "order": 15, + "alias": "D7", + "cst_type": "term", + "convention": "", + "term_raw": "опосредованные подчинения", + "term_resolved": "опосредованные подчинения", + "term_forms": [], + "definition_formal": "I{ (ξ,α) | ξ:∈X1; σ:=F5[ξ]; α:∈σ; α≠ξ }", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 499, + "fields": { + "schema": 26, + "order": 16, + "alias": "D8", + "cst_type": "term", + "convention": "", + "term_raw": "опосредованные самоначальники", + "term_resolved": "опосредованные самоначальники", + "term_forms": [], + "definition_formal": "D{ξ ∈ X1 | (ξ,ξ)∈D7 }", + "definition_raw": "рефлексивное ядро бинарного отношения опосредованного подчинения", + "definition_resolved": "рефлексивное ядро бинарного отношения опосредованного подчинения" + } +}, +{ + "model": "rsform.constituenta", + "pk": 500, + "fields": { + "schema": 26, + "order": 17, + "alias": "A2", + "cst_type": "axiom", + "convention": "", + "term_raw": "ацикличность отношения начальних-подчиненный", + "term_resolved": "ацикличность отношения начальних-подчиненный", + "term_forms": [], + "definition_formal": "D8=∅", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 501, + "fields": { + "schema": 26, + "order": 18, + "alias": "D9", + "cst_type": "term", + "convention": "", + "term_raw": "дублированные подчинения", + "term_resolved": "дублированные подчинения", + "term_forms": [], + "definition_formal": "S1∩D7", + "definition_raw": "Множество пар: @{D1|nomn,sing}, его @{D2|nomn,sing}, являющийся также его опосредованным @{D2|ablt,sing}", + "definition_resolved": "Множество пар: начальник, его подчинённый, являющийся также его опосредованным подчинённым" + } +}, +{ + "model": "rsform.constituenta", + "pk": 502, + "fields": { + "schema": 26, + "order": 19, + "alias": "D10", + "cst_type": "term", + "convention": "", + "term_raw": "транзитивное замыкание подчинения", + "term_resolved": "транзитивное замыкание подчинения", + "term_forms": [], + "definition_formal": "S1∪D7", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 503, + "fields": { + "schema": 26, + "order": 20, + "alias": "F6", + "cst_type": "function", + "convention": "", + "term_raw": "@{D1|nomn,plur} группы @{X1|gent,plur}", + "term_resolved": "начальники группы сотрудников", + "term_forms": [], + "definition_formal": "[α∈ℬ(X1)] Pr1(Fi2[α](S1))", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 504, + "fields": { + "schema": 26, + "order": 21, + "alias": "F7", + "cst_type": "function", + "convention": "", + "term_raw": "@{D1|nomn,plur} @{X1|gent,sing}", + "term_resolved": "начальники сотрудника", + "term_forms": [], + "definition_formal": "[α∈X1] F6[{α}]", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 505, + "fields": { + "schema": 26, + "order": 22, + "alias": "F8", + "cst_type": "function", + "convention": "", + "term_raw": "полный набор @{D1|gent,plur} группы @{X1|gent,plur}", + "term_resolved": "полный набор начальников группы сотрудников", + "term_forms": [], + "definition_formal": "[α∈ℬ(X1)] R{ξ:=F6[α] | ξ∪F6[ξ]}", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 506, + "fields": { + "schema": 26, + "order": 23, + "alias": "F9", + "cst_type": "function", + "convention": "", + "term_raw": "полный набор @{D1|gent,plur} @{X1|gent,sing}", + "term_resolved": "полный набор начальников сотрудника", + "term_forms": [], + "definition_formal": "[α∈X1] F8[{α}]", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 507, + "fields": { + "schema": 26, + "order": 24, + "alias": "F10", + "cst_type": "function", + "convention": "", + "term_raw": "опосредованные @{D1|nomn,plur} @{X1|gent,sing}", + "term_resolved": "опосредованные начальники сотрудника", + "term_forms": [], + "definition_formal": "[α∈X1] F8[F9[α]]", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 508, + "fields": { + "schema": 26, + "order": 25, + "alias": "P1", + "cst_type": "predicate", + "convention": "", + "term_raw": "групповое подчинение", + "term_resolved": "групповое подчинение", + "term_forms": [], + "definition_formal": "[α∈ℬ(X1), β∈ℬ(X1)] α×α∩S1=∅ & β×β∩S1=∅ & α×β⊆S1", + "definition_raw": "Проверка пары множеств людей на то, что каждый человек из первого множества является начальником каждого человека из второго множества, а внутри каждой из групп отношение подчинения отсутствует", + "definition_resolved": "Проверка пары множеств людей на то, что каждый человек из первого множества является начальником каждого человека из второго множества, а внутри каждой из групп отношение подчинения отсутствует" + } +}, +{ + "model": "rsform.constituenta", + "pk": 509, + "fields": { + "schema": 27, + "order": 1, + "alias": "X1", + "cst_type": "basic", + "convention": "потенциальные, свершившиеся и текущие события", + "term_raw": "события", + "term_resolved": "события", + "term_forms": [], + "definition_formal": "", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 510, + "fields": { + "schema": 27, + "order": 2, + "alias": "X2", + "cst_type": "basic", + "convention": "носители субъектности", + "term_raw": "субъекты", + "term_resolved": "субъекты", + "term_forms": [], + "definition_formal": "", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 511, + "fields": { + "schema": 27, + "order": 3, + "alias": "S1", + "cst_type": "structure", + "convention": "для реализация события необходима (но не достаточна!) реализация всех его генетических условий", + "term_raw": "генетические связи @{X1|gent,plur}", + "term_resolved": "генетические связи событий", + "term_forms": [], + "definition_formal": "ℬ(X1×X1)", + "definition_raw": "множество пар: @{X1|nomn,sing} и его @{D2|nomn,sing}", + "definition_resolved": "множество пар: событие и его генетическое условие" + } +}, +{ + "model": "rsform.constituenta", + "pk": 512, + "fields": { + "schema": 27, + "order": 4, + "alias": "S2", + "cst_type": "structure", + "convention": "если реализовано блокирующее событие, то блокированное событие не может быть реализовано", + "term_raw": "блокирующие связи @{X1|gent,plur}", + "term_resolved": "блокирующие связи событий", + "term_forms": [], + "definition_formal": "ℬ(X1×X1)", + "definition_raw": "множество пар: @{D3|nomn,sing} и @{D4|nomn,sing}", + "definition_resolved": "множество пар: блокированное некоторым событием событие и блокирующее событие" + } +}, +{ + "model": "rsform.constituenta", + "pk": 513, + "fields": { + "schema": 27, + "order": 5, + "alias": "S3", + "cst_type": "structure", + "convention": "субъект может реализовать событие (при условии реализации генетических условий)", + "term_raw": "отношение способности реализации", + "term_resolved": "отношение способности реализации", + "term_forms": [], + "definition_formal": "ℬ(X2×X1)", + "definition_raw": "множество пар: @{X2|nomn,sing} и его @{F28|nomn,sing}", + "definition_resolved": "множество пар: субъект и его возможность" + } +}, +{ + "model": "rsform.constituenta", + "pk": 514, + "fields": { + "schema": 27, + "order": 6, + "alias": "S4", + "cst_type": "structure", + "convention": "субъект заинтересован в реализации события", + "term_raw": "отношение заинтересованности", + "term_resolved": "отношение заинтересованности", + "term_forms": [], + "definition_formal": "ℬ(X2×X1)", + "definition_raw": "множество пар: @{X2|nomn,sing} и его @{F34|nomn,sing}", + "definition_resolved": "множество пар: субъект и его интерес" + } +}, +{ + "model": "rsform.constituenta", + "pk": 515, + "fields": { + "schema": 27, + "order": 7, + "alias": "D1", + "cst_type": "term", + "convention": "", + "term_raw": "генетические последствия", + "term_resolved": "генетические последствия", + "term_forms": [], + "definition_formal": "Pr1(S1)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 516, + "fields": { + "schema": 27, + "order": 8, + "alias": "D2", + "cst_type": "term", + "convention": "", + "term_raw": "генетические условия", + "term_resolved": "генетические условия", + "term_forms": [], + "definition_formal": "Pr2(S1)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 517, + "fields": { + "schema": 27, + "order": 9, + "alias": "D3", + "cst_type": "term", + "convention": "", + "term_raw": "блокированные некоторым @{X1|ablt,sing} @{X1|nomn,plur}", + "term_resolved": "блокированные некоторым событием события", + "term_forms": [], + "definition_formal": "Pr1(S2)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 518, + "fields": { + "schema": 27, + "order": 10, + "alias": "D4", + "cst_type": "term", + "convention": "", + "term_raw": "блокирующие @{X1|nomn,plur}", + "term_resolved": "блокирующие события", + "term_forms": [], + "definition_formal": "Pr2(S2)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 519, + "fields": { + "schema": 27, + "order": 11, + "alias": "D5", + "cst_type": "term", + "convention": "", + "term_raw": "@{F28|nomn,plur} @{X2|gent,plur}", + "term_resolved": "возможности субъектов", + "term_forms": [], + "definition_formal": "Pr2(S3)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 520, + "fields": { + "schema": 27, + "order": 12, + "alias": "D6", + "cst_type": "term", + "convention": "", + "term_raw": "@{F34|nomn,plur} @{X2|gent,plur}", + "term_resolved": "интересы субъектов", + "term_forms": [], + "definition_formal": "Pr2(S4)", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 521, + "fields": { + "schema": 27, + "order": 13, + "alias": "F1", + "cst_type": "function", + "convention": "", + "term_raw": "сечение по первому сомножителю", + "term_resolved": "сечение по первому сомножителю", + "term_forms": [], + "definition_formal": "[α∈ℬ(R1), σ∈ℬ(R1×R2)] Pr2(Fi1[α](σ))", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 522, + "fields": { + "schema": 27, + "order": 14, + "alias": "F2", + "cst_type": "function", + "convention": "", + "term_raw": "сечение по второму сомножителю", + "term_resolved": "сечение по второму сомножителю", + "term_forms": [], + "definition_formal": "[α∈ℬ(R1), σ∈ℬ(R2×R1)] Pr1(Fi2[α](σ))", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 523, + "fields": { + "schema": 27, + "order": 15, + "alias": "F3", + "cst_type": "function", + "convention": "", + "term_raw": "связанные отношением с данным элементом (прямо или опосредованно)", + "term_resolved": "связанные отношением с данным элементом (прямо или опосредованно)", + "term_forms": [], + "definition_formal": "[α∈R1, σ∈ℬ(R1×R1)] R{ξ:=F1[{α},σ] | ξ∪F1[ξ,σ]}", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 524, + "fields": { + "schema": 27, + "order": 16, + "alias": "F4", + "cst_type": "function", + "convention": "", + "term_raw": "транзитивное замыкание", + "term_resolved": "транзитивное замыкание", + "term_forms": [], + "definition_formal": "[σ∈ℬ(R1×R1)] I{(ξ1,ξ2) | ξ1:∈Pr1(σ); ξ2:∈F3[ξ1, σ]}", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 525, + "fields": { + "schema": 27, + "order": 17, + "alias": "P1", + "cst_type": "predicate", + "convention": "", + "term_raw": "антирефлексивность", + "term_resolved": "антирефлексивность", + "term_forms": [], + "definition_formal": "[σ∈ℬ(R1×R1)] ∀ξ∈Pr1(σ) (ξ,ξ)∉σ", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 526, + "fields": { + "schema": 27, + "order": 18, + "alias": "A1", + "cst_type": "axiom", + "convention": "", + "term_raw": "@{P1|nomn,sing} @{S2|gent,plur}", + "term_resolved": "антирефлексивность блокирующих связей событий", + "term_forms": [], + "definition_formal": "P1[S2]", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 527, + "fields": { + "schema": 27, + "order": 19, + "alias": "D7", + "cst_type": "term", + "convention": "", + "term_raw": "отношение обуславливания @{X1|gent,plur}", + "term_resolved": "отношение обуславливания событий", + "term_forms": [], + "definition_formal": "F4[S1]", + "definition_raw": "@{F4|nomn,sing} @{S1|gent,plur}", + "definition_resolved": "транзитивное замыкание генетических связей событий" + } +}, +{ + "model": "rsform.constituenta", + "pk": 528, + "fields": { + "schema": 27, + "order": 20, + "alias": "A2", + "cst_type": "axiom", + "convention": "", + "term_raw": "ацикличность @{S1|gent,plur}", + "term_resolved": "ацикличность генетических связей событий", + "term_forms": [], + "definition_formal": "P1[D7]", + "definition_raw": "", + "definition_resolved": "" + } +}, +{ + "model": "rsform.constituenta", + "pk": 529, + "fields": { + "schema": 27, + "order": 21, + "alias": "F5", + "cst_type": "function", + "convention": "", + "term_raw": "@{F6|nomn,sing} набора @{X1|gent,plur}", + "term_resolved": "полное генетическое условие набора событий", + "term_forms": [], + "definition_formal": "[α∈ℬ(X1)] F1[α, D7]", + "definition_raw": "все @{X1|nomn,plur}, обуславливающие хотя бы одно из данного множества @{X1|gent,plur}", + "definition_resolved": "все события, обуславливающие хотя бы одно из данного множества событий" + } +}, +{ + "model": "rsform.constituenta", + "pk": 530, + "fields": { + "schema": 27, + "order": 22, + "alias": "F6", + "cst_type": "function", + "convention": "", + "term_raw": "полное @{D2|nomn,sing}", + "term_resolved": "полное генетическое условие", + "term_forms": [], + "definition_formal": "[α∈X1] F5[{α}]", + "definition_raw": "все @{X1|nomn,plur}, обуславливающие данное @{X1|nomn,sing}", + "definition_resolved": "все события, обуславливающие данное событие" + } +}, +{ + "model": "rsform.constituenta", + "pk": 531, + "fields": { + "schema": 27, + "order": 23, + "alias": "F7", + "cst_type": "function", + "convention": "", + "term_raw": "@{F8|nomn,sing} набора @{X1|gent,plur}", + "term_resolved": "полное генетическое последствие набора событий", + "term_forms": [], + "definition_formal": "[α∈ℬ(X1)] F2[α, D7]", + "definition_raw": "все @{X1|nomn,plur}, обусловленные хотя бы одним из данного множества @{X1|gent,plur}", + "definition_resolved": "все события, обусловленные хотя бы одним из данного множества событий" + } +}, +{ + "model": "rsform.constituenta", + "pk": 532, + "fields": { + "schema": 27, + "order": 24, + "alias": "F8", + "cst_type": "function", + "convention": "", + "term_raw": "полное @{D1|nomn,sing}", + "term_resolved": "полное генетическое последствие", + "term_forms": [], + "definition_formal": "[α∈X1] F7[{α}]", + "definition_raw": "все @{X1|nomn,plur}, обуславливающие данное @{X1|nomn,sing}", + "definition_resolved": "все события, обуславливающие данное событие" + } +}, +{ + "model": "rsform.constituenta", + "pk": 533, + "fields": { + "schema": 27, + "order": 25, + "alias": "F9", + "cst_type": "function", + "convention": "", + "term_raw": "@{F10|nomn,plur} набору @{X1|gent,plur}", + "term_resolved": "прямые угрозы набору событий", + "term_forms": [], + "definition_formal": "[α∈ℬ(X1)] F1[α, S2]", + "definition_raw": "@{X1|nomn,plur}, блокирующие хотя бы одно из данного множества @{X1|gent,plur}", + "definition_resolved": "события, блокирующие хотя бы одно из данного множества событий" + } +}, +{ + "model": "rsform.constituenta", + "pk": 534, + "fields": { + "schema": 27, + "order": 26, + "alias": "F10", + "cst_type": "function", + "convention": "", + "term_raw": "прямые угрозы", + "term_resolved": "прямые угрозы", + "term_forms": [], + "definition_formal": "[α∈X1] F9[{α}]", + "definition_raw": "@{X1|gent,sing}, блокирующие данное @{X1|nomn,sing}", + "definition_resolved": "события, блокирующие данное событие" + } +}, +{ + "model": "rsform.constituenta", + "pk": 535, + "fields": { + "schema": 27, + "order": 27, + "alias": "F11", + "cst_type": "function", + "convention": "", + "term_raw": "@{F12|nomn,plur} набором @{X1|gent,plur}", + "term_resolved": "прямо блокированные некоторым событием события набором событий", + "term_forms": [], + "definition_formal": "[α∈ℬ(X1)] F2[α, S2]", + "definition_raw": "@{X1|nomn,plur}, блокированные хотя бы одним из данных @{X1|gent,plur}", + "definition_resolved": "события, блокированные хотя бы одним из данных событий" + } +}, +{ + "model": "rsform.constituenta", + "pk": 536, + "fields": { + "schema": 27, + "order": 28, + "alias": "F12", + "cst_type": "function", + "convention": "", + "term_raw": "прямо @{D3|nomn,plur}", + "term_resolved": "прямо блокированные некоторым событием события", + "term_forms": [], + "definition_formal": "[α∈X1] F11[{α}]", + "definition_raw": "@{X1|nomn,plur}, блокированные @{1|данными} @{X1|ablt,sing}", + "definition_resolved": "события, блокированные данными событием" + } +}, +{ + "model": "rsform.constituenta", + "pk": 537, + "fields": { + "schema": 27, + "order": 29, + "alias": "A3", + "cst_type": "axiom", + "convention": "", + "term_raw": "", + "term_resolved": "", + "term_forms": [], + "definition_formal": "∀α∈X1 F6[α]∩F10[α]=∅", + "definition_raw": "взаимное исключение блокирования и обуславливания", + "definition_resolved": "взаимное исключение блокирования и обуславливания" + } +}, +{ + "model": "rsform.constituenta", + "pk": 538, + "fields": { + "schema": 27, + "order": 30, + "alias": "F13", + "cst_type": "function", + "convention": "", + "term_raw": "@{F14|nomn,plur} набору @{X1|gent,plur}", + "term_resolved": "угрозы набору событий", + "term_forms": [], + "definition_formal": "[α∈ℬ(X1)] F9[F5[α]]", + "definition_raw": "@{X1|nomn,plur}, блокирующие хотя бы одно @{X1|nomn,sing} из @{F6|gent,sing} данных @{X1|gent,plur}", + "definition_resolved": "события, блокирующие хотя бы одно событие из полного генетического условия данных событий" + } +}, +{ + "model": "rsform.constituenta", + "pk": 539, + "fields": { + "schema": 27, + "order": 31, + "alias": "F14", + "cst_type": "function", + "convention": "", + "term_raw": "угрозы", + "term_resolved": "угрозы", + "term_forms": [], + "definition_formal": "[α∈X1] F13[{α}]", + "definition_raw": "@{X1|nomn,plur} блокирующие хотя бы одно @{X1|nomn,sing} из @{F6|gent,sing} данного @{X1|gent,sing}", + "definition_resolved": "события блокирующие хотя бы одно событие из полного генетического условия данного события" + } +}, +{ + "model": "rsform.constituenta", + "pk": 540, + "fields": { + "schema": 27, + "order": 32, + "alias": "F15", + "cst_type": "function", + "convention": "", + "term_raw": "@{F16|nomn,plur} набору @{X1|gent,plur}", + "term_resolved": "косвенные угрозы набору событий", + "term_forms": [], + "definition_formal": "[α∈ℬ(X1)] F13[α]\\F9[α]", + "definition_raw": "@{X1|nomn,plur}, не являющиеся @{F10|ablt,plur}, но блокирующие хотя бы одно @{X1|nomn,sing} из @{F6|gent,sing} данных @{X1|gent,plur}", + "definition_resolved": "события, не являющиеся прямыми угрозами, но блокирующие хотя бы одно событие из полного генетического условия данных событий" + } +}, +{ + "model": "rsform.constituenta", + "pk": 541, + "fields": { + "schema": 27, + "order": 33, + "alias": "F16", + "cst_type": "function", + "convention": "", + "term_raw": "косвенные @{F14|nomn,plur}", + "term_resolved": "косвенные угрозы", + "term_forms": [], + "definition_formal": "[α∈X1] F15[{α}]", + "definition_raw": "@{X1|nomn,plur}, не являющиеся @{F10|ablt,plur}, но блокирующие хотя бы одно @{X1|nomn,sing} из @{F6|gent,sing} данного @{X1|gent,sing}", + "definition_resolved": "события, не являющиеся прямыми угрозами, но блокирующие хотя бы одно событие из полного генетического условия данного события" + } +}, +{ + "model": "rsform.constituenta", + "pk": 542, + "fields": { + "schema": 27, + "order": 34, + "alias": "F17", + "cst_type": "function", + "convention": "", + "term_raw": "@{F18|nomn,plur} набором @{X1|gent,plur}", + "term_resolved": "блокированные события набором событий", + "term_forms": [], + "definition_formal": "[α∈ℬ(X1)] F5[F11[α]]", + "definition_raw": "@{X1|nomn,plur}, составляющие @{F8|nomn,sing} @{X1|gent,plur}, блокированных данными @{X1|datv,plur}", + "definition_resolved": "события, составляющие полное генетическое последствие событий, блокированных данными событиям" + } +}, +{ + "model": "rsform.constituenta", + "pk": 543, + "fields": { + "schema": 27, + "order": 35, + "alias": "F18", + "cst_type": "function", + "convention": "", + "term_raw": "блокированные @{X1|nomn,plur}", + "term_resolved": "блокированные события", + "term_forms": [], + "definition_formal": "[α∈X1] F17[{α}]", + "definition_raw": "@{X1|nomn,plur}, составляющие @{F8|nomn,sing} @{X1|gent,plur}, блокированных данным @{X1|ablt,sing}", + "definition_resolved": "события, составляющие полное генетическое последствие событий, блокированных данным событием" + } +}, +{ + "model": "rsform.constituenta", + "pk": 544, + "fields": { + "schema": 27, + "order": 36, + "alias": "F19", + "cst_type": "function", + "convention": "", + "term_raw": "@{F20|nomn,plur} набором @{X1|gent,plur}", + "term_resolved": "косвенно блокированные некоторым событием события набором событий", + "term_forms": [], + "definition_formal": "[α∈ℬ(X1)] F17[α]\\F11[α]", + "definition_raw": "@{X1|nomn,plur}, составляющие @{F8|nomn,sing} @{X1|gent,plur}, блокированных данными @{X1|datv,plur}, но не блокированные данными @{X1|ablt,plur} напрямую", + "definition_resolved": "события, составляющие полное генетическое последствие событий, блокированных данными событиям, но не блокированные данными событиями напрямую" + } +}, +{ + "model": "rsform.constituenta", + "pk": 545, + "fields": { + "schema": 27, + "order": 37, + "alias": "F20", + "cst_type": "function", + "convention": "", + "term_raw": "косвенно @{D3|nomn,plur}", + "term_resolved": "косвенно блокированные некоторым событием события", + "term_forms": [], + "definition_formal": "[α∈X1] F19[{α}]", + "definition_raw": "@{X1|nomn,plur}, составляющие @{F8|nomn,sing} @{X1|gent,plur}, блокированных данным @{X1|ablt,sing}, но не блокированные данным @{X1|ablt,sing} напрямую", + "definition_resolved": "события, составляющие полное генетическое последствие событий, блокированных данным событием, но не блокированные данным событием напрямую" + } +}, +{ + "model": "rsform.constituenta", + "pk": 546, + "fields": { + "schema": 27, + "order": 38, + "alias": "F21", + "cst_type": "function", + "convention": "", + "term_raw": "меры безопасности", + "term_resolved": "меры безопасности", + "term_forms": [], + "definition_formal": "[α∈X1] F13[F14[α]]", + "definition_raw": "@{F14|nomn,plur} @{F14|datv,plur} данного @{X1|nomn,plur}", + "definition_resolved": "угрозы угрозам данного события" + } +}, +{ + "model": "rsform.constituenta", + "pk": 547, + "fields": { + "schema": 27, + "order": 39, + "alias": "F22", + "cst_type": "function", + "convention": "", + "term_raw": "неустранимые @{F14|nomn,plur} набору @{X1|gent,plur}", + "term_resolved": "неустранимые угрозы набору событий", + "term_forms": [], + "definition_formal": "[α∈ℬ(X1)] D{ξ∈F13[α] | F14[ξ]=∅}", + "definition_raw": "@{F14|nomn,plur} данным @{X1|datv,plur}, для которых нет @{F21|gent,plur}", + "definition_resolved": "угрозы данным событиям, для которых нет мер безопасности" + } +}, +{ + "model": "rsform.constituenta", + "pk": 548, + "fields": { + "schema": 27, + "order": 40, + "alias": "F23", + "cst_type": "function", + "convention": "", + "term_raw": "неустранимые @{F14|nomn,plur}", + "term_resolved": "неустранимые угрозы", + "term_forms": [], + "definition_formal": "[α∈X1] F22[{α}]", + "definition_raw": "@{F14|nomn,plur} данному @{X1|datv,sing}, для которых нет @{F21|gent,plur}", + "definition_resolved": "угрозы данному событию, для которых нет мер безопасности" + } +}, +{ + "model": "rsform.constituenta", + "pk": 549, + "fields": { + "schema": 27, + "order": 41, + "alias": "F24", + "cst_type": "function", + "convention": "", + "term_raw": "противодействия @{F21|datv,plur}", + "term_resolved": "противодействия мерам безопасности", + "term_forms": [], + "definition_formal": "[α∈X1] F13[F21[α]]", + "definition_raw": "@{F14|nomn,plur} @{F21|datv,plur} данного @{X1|nomn,plur}", + "definition_resolved": "угрозы мерам безопасности данного события" + } +}, +{ + "model": "rsform.constituenta", + "pk": 550, + "fields": { + "schema": 27, + "order": 42, + "alias": "D8", + "cst_type": "term", + "convention": "", + "term_raw": "немощные @{X2|nomn,plur}", + "term_resolved": "немощные субъекты", + "term_forms": [], + "definition_formal": "X2\\Pr1(S3)", + "definition_raw": "@{X2|nomn,plur}, не обладающие @{F28|ablt,plur}", + "definition_resolved": "субъекты, не обладающие возможностями" + } +}, +{ + "model": "rsform.constituenta", + "pk": 551, + "fields": { + "schema": 27, + "order": 43, + "alias": "D9", + "cst_type": "term", + "convention": "", + "term_raw": "природные @{F28|nomn,plur}", + "term_resolved": "природные возможности", + "term_forms": [], + "definition_formal": "X1\\D5", + "definition_raw": "@{X1|nomn,plur}, которыми не обладают @{X2|nomn,plur}", + "definition_resolved": "события, которыми не обладают субъекты" + } +}, +{ + "model": "rsform.constituenta", + "pk": 552, + "fields": { + "schema": 27, + "order": 44, + "alias": "F25", + "cst_type": "function", + "convention": "", + "term_raw": "@{F26|nomn,plur} набору @{X1|gent,plur}", + "term_resolved": "природные угрозы набору событий", + "term_forms": [], + "definition_formal": "[α∈ℬ(X1)] F13[α]∩D9", + "definition_raw": "@{F14|nomn,plur} данным @{X1|datv,plur}, являющиеся @{D9|ablt,plur}", + "definition_resolved": "угрозы данным событиям, являющиеся природными возможностями" + } +}, +{ + "model": "rsform.constituenta", + "pk": 553, + "fields": { + "schema": 27, + "order": 45, + "alias": "F26", + "cst_type": "function", + "convention": "", + "term_raw": "природные @{F14|nomn,plur}", + "term_resolved": "природные угрозы", + "term_forms": [], + "definition_formal": "[α∈X1] F14[α]∩D9", + "definition_raw": "@{F14|nomn,plur}, являющиеся @{D9|ablt,plur}", + "definition_resolved": "угрозы, являющиеся природными возможностями" + } +}, +{ + "model": "rsform.constituenta", + "pk": 554, + "fields": { + "schema": 27, + "order": 46, + "alias": "F27", + "cst_type": "function", + "convention": "", + "term_raw": "@{F28|nomn,plur} группы @{X2|gent,plur}", + "term_resolved": "возможности группы субъектов", + "term_forms": [], + "definition_formal": "[α∈ℬ(X2)] F1[α, S3]", + "definition_raw": "@{X1|nomn,plur}, которые способен реализовать хотя бы один из данных @{X2|gent,plur}", + "definition_resolved": "события, которые способен реализовать хотя бы один из данных субъектов" + } +}, +{ + "model": "rsform.constituenta", + "pk": 555, + "fields": { + "schema": 27, + "order": 47, + "alias": "F28", + "cst_type": "function", + "convention": "", + "term_raw": "возможности", + "term_resolved": "возможности", + "term_forms": [], + "definition_formal": "[α∈X2] F27[{α}]", + "definition_raw": "@{X1|nomn,plur}, которые способен реализовать данный @{X2|nomn,sing}", + "definition_resolved": "события, которые способен реализовать данный субъект" + } +}, +{ + "model": "rsform.constituenta", + "pk": 556, + "fields": { + "schema": 27, + "order": 48, + "alias": "F29", + "cst_type": "function", + "convention": "", + "term_raw": "@{X2|nomn,plur} набора @{X1|gent,plur}", + "term_resolved": "субъекты набора событий", + "term_forms": [], + "definition_formal": "[α∈ℬ(X1)] F2[α, S3]", + "definition_raw": "субъекты, @{F28|ablt,plur} которых являются данные @{X1|nomn,plur}", + "definition_resolved": "субъекты, возможностями которых являются данные события" + } +}, +{ + "model": "rsform.constituenta", + "pk": 557, + "fields": { + "schema": 27, + "order": 49, + "alias": "F30", + "cst_type": "function", + "convention": "", + "term_raw": "@{X2|nomn,plur} @{X1|nomn,plur}", + "term_resolved": "субъекты события", + "term_forms": [], + "definition_formal": "[α∈X1] F29[{α}]", + "definition_raw": "субъекты, @{F28|ablt,sing} которых является данное @{X1|nomn,sing}", + "definition_resolved": "субъекты, возможностью которых является данное событие" + } +}, +{ + "model": "rsform.constituenta", + "pk": 558, + "fields": { + "schema": 27, + "order": 50, + "alias": "F31", + "cst_type": "function", + "convention": "", + "term_raw": "потенциальные защитники", + "term_resolved": "потенциальные защитники", + "term_forms": [], + "definition_formal": "[α∈X1] F29[F21[α]]", + "definition_raw": "@{X2|nomn,plur}, обладающие @{F28|ablt,sing}, являющейся @{F21|ablt,sing} данного @{X1|nomn,plur}", + "definition_resolved": "субъекты, обладающие возможностью, являющейся мерой безопасности данного события" + } +}, +{ + "model": "rsform.constituenta", + "pk": 559, + "fields": { + "schema": 27, + "order": 51, + "alias": "F32", + "cst_type": "function", + "convention": "", + "term_raw": "@{F31|nomn,plur} от @{F14|nomn,plur}", + "term_resolved": "потенциальные защитники от угрозы", + "term_forms": [], + "definition_formal": "[α∈X1, β∈F14[α]] F29[F14[β]]", + "definition_raw": "@{X2|nomn,plur}, обладающие @{F28|ablt,sing}, являющейся @{F21|ablt,sing} данного @{X1|nomn,plur} от данной @{F14|gent,sing}", + "definition_resolved": "субъекты, обладающие возможностью, являющейся мерой безопасности данного события от данной угрозы" + } +}, +{ + "model": "rsform.constituenta", + "pk": 560, + "fields": { + "schema": 27, + "order": 52, + "alias": "A4", + "cst_type": "axiom", + "convention": "", + "term_raw": "", + "term_resolved": "", + "term_forms": [], + "definition_formal": "card(S3) = card(D5)", + "definition_raw": "@{D5|nomn,plur} не пересекаются", + "definition_resolved": "возможности субъектов не пересекаются" + } +}, +{ + "model": "rsform.constituenta", + "pk": 561, + "fields": { + "schema": 27, + "order": 53, + "alias": "D10", + "cst_type": "term", + "convention": "", + "term_raw": "пассивные @{X2|nomn,plur}", + "term_resolved": "пассивные субъекты", + "term_forms": [], + "definition_formal": "X2\\Pr1(S4)", + "definition_raw": "@{X2|nomn,plur}, не обладающие @{F34|ablt,plur}", + "definition_resolved": "субъекты, не обладающие интересами" + } +}, +{ + "model": "rsform.constituenta", + "pk": 562, + "fields": { + "schema": 27, + "order": 54, + "alias": "F33", + "cst_type": "function", + "convention": "", + "term_raw": "@{F34|nomn,plur} группы @{X2|gent,plur}", + "term_resolved": "интересы группы субъектов", + "term_forms": [], + "definition_formal": "[α∈ℬ(X2)] F1[α, S4]", + "definition_raw": "@{X1|nomn,plur}, в реализации которых заинтересован хотя бы один из данных @{X2|gent,plur}", + "definition_resolved": "события, в реализации которых заинтересован хотя бы один из данных субъектов" + } +}, +{ + "model": "rsform.constituenta", + "pk": 563, + "fields": { + "schema": 27, + "order": 55, + "alias": "F34", + "cst_type": "function", + "convention": "", + "term_raw": "интересы", + "term_resolved": "интересы", + "term_forms": [], + "definition_formal": "[α∈X2] F33[{α}]", + "definition_raw": "@{X1|nomn,plur}, в реализации которых заинтересован данный @{X2|nomn,sing}", + "definition_resolved": "события, в реализации которых заинтересован данный субъект" + } +}, +{ + "model": "rsform.constituenta", + "pk": 564, + "fields": { + "schema": 27, + "order": 56, + "alias": "D11", + "cst_type": "term", + "convention": "", + "term_raw": "полное субъект-субъектное отношение безопасности", + "term_resolved": "полное субъект-субъектное отношение безопасности", + "term_forms": [], + "definition_formal": "I{((σ1, ξ1), (σ2, ξ2), (σ3, ξ3)) | \nσ1:∈X2; ξ1:∈F34[σ1]; \nξ2:∈F14[ξ1]; σ2:∈F30[ξ2];\nξ3:∈F14[ξ2]; σ3:∈F30[ξ3] }", + "definition_raw": "множество троек: @{X2|nomn,sing} с его @{F34|ablt,sing}; субъект, обладающий @{F14|ablt,sing} @{F34|datv,sing} с соответствующей @{F28|ablt,sing}; @{F32|nomn,sing} с соответствующей @{F21|ablt,sing}", + "definition_resolved": "множество троек: субъект с его интересом; субъект, обладающий угрозой интересу с соответствующей возможностью; потенциальный защитник от угрозы с соответствующей мерой безопасности" + } +}, +{ + "model": "rsform.constituenta", + "pk": 565, + "fields": { + "schema": 27, + "order": 57, + "alias": "A5", + "cst_type": "axiom", + "convention": "", + "term_raw": "", + "term_resolved": "", + "term_forms": [], + "definition_formal": "card(S4) = card(D6)", + "definition_raw": "@{D6|nomn,plur} не пересекаются", + "definition_resolved": "интересы субъектов не пересекаются" + } +}, +{ + "model": "rsform.constituenta", + "pk": 566, + "fields": { + "schema": 27, + "order": 58, + "alias": "A6", + "cst_type": "axiom", + "convention": "", + "term_raw": "", + "term_resolved": "", + "term_forms": [], + "definition_formal": "S4⊆S3", + "definition_raw": "@{F34|nomn,plur} @{X2|gent,sing} являются его @{F28|ablt,plur}", + "definition_resolved": "интересы субъекта являются его возможностями" + } +}, +{ + "model": "rsform.constituenta", + "pk": 567, + "fields": { + "schema": 27, + "order": 59, + "alias": "F35", + "cst_type": "function", + "convention": "", + "term_raw": "@{F14|nomn,plur} @{X2|datv,sing}", + "term_resolved": "угрозы субъекту", + "term_forms": [], + "definition_formal": "[α∈X2] F13[F34[α]]", + "definition_raw": "@{F14|nomn,plur} @{F34|datv,plur} данного @{X2|gent,sing}", + "definition_resolved": "угрозы интересам данного субъекта" + } +}, +{ + "model": "rsform.constituenta", + "pk": 568, + "fields": { + "schema": 27, + "order": 60, + "alias": "F36", + "cst_type": "function", + "convention": "", + "term_raw": "@{F21|gent,sing} в отношении @{X2|gent,sing}", + "term_resolved": "меры безопасности в отношении субъекта", + "term_forms": [], + "definition_formal": "[α∈X2] F13[F13[F34[α]]]", + "definition_raw": "@{F14|nomn,plur} @{F14|datv,plur} @{F34|datv,plur} данного @{X2|gent,sing}", + "definition_resolved": "угрозы угрозам интересам данного субъекта" + } +}, +{ + "model": "rsform.constituenta", + "pk": 569, + "fields": { + "schema": 27, + "order": 61, + "alias": "F37", + "cst_type": "function", + "convention": "", + "term_raw": "угрожающие @{X2|nomn,plur}", + "term_resolved": "угрожающие субъекты", + "term_forms": [], + "definition_formal": "[α∈X2] F29[F35[α]]", + "definition_raw": "@{X2|nomn,plur}, чьи @{F28|nomn,plur} являются @{F14|ablt,plur} данному @{X2|datv,sing}", + "definition_resolved": "субъекты, чьи возможности являются угрозами данному субъекту" + } +}, +{ + "model": "rsform.constituenta", + "pk": 570, + "fields": { + "schema": 27, + "order": 62, + "alias": "F38", + "cst_type": "function", + "convention": "", + "term_raw": "@{F23|nomn,plur} @{X2|datv,sing}", + "term_resolved": "неустранимые угрозы субъекту", + "term_forms": [], + "definition_formal": "[α∈X2] F22[F34[α]]", + "definition_raw": "@{F23|nomn,plur} @{F34|datv,plur} @{X2|gent,sing}", + "definition_resolved": "неустранимые угрозы интересам субъекта" + } +}, +{ + "model": "rsform.constituenta", + "pk": 571, + "fields": { + "schema": 27, + "order": 63, + "alias": "F39", + "cst_type": "function", + "convention": "", + "term_raw": "@{F40|nomn,sing} от набора @{X1|gent,plur}", + "term_resolved": "масштаб угрозы от набора событий", + "term_forms": [], + "definition_formal": "[α∈X2, β∈ℬ(X1)] F46[α]∩F17[β]", + "definition_raw": "все @{F28|gent,sing} данного @{X2|gent,sing} из @{F46|gent,sing}, блокируемых данными @{X1|ablt,plur}", + "definition_resolved": "все возможности данного субъекта из собственного генетического расширения интересов, блокируемых данными событиями" + } +}, +{ + "model": "rsform.constituenta", + "pk": 572, + "fields": { + "schema": 27, + "order": 64, + "alias": "F40", + "cst_type": "function", + "convention": "", + "term_raw": "масштаб @{F14|nomn,plur}", + "term_resolved": "масштаб угрозы", + "term_forms": [], + "definition_formal": "[α∈X2, β∈X1] F39[α, {β}]", + "definition_raw": "все @{F28|gent,sing} данного @{X2|gent,sing} из @{F46|gent,sing}, блокируемых данным @{X1|ablt,sing}", + "definition_resolved": "все возможности данного субъекта из собственного генетического расширения интересов, блокируемых данным событием" + } +}, +{ + "model": "rsform.constituenta", + "pk": 573, + "fields": { + "schema": 27, + "order": 65, + "alias": "F41", + "cst_type": "function", + "convention": "", + "term_raw": "независимая устранимость @{F14|nomn,plur}", + "term_resolved": "независимая устранимость угрозы", + "term_forms": [], + "definition_formal": "[α∈X2, β∈F35[α]] F28[α]∩F14[β]", + "definition_raw": "все @{F28|nomn,plur} данного @{X2|gent,sing}, являющиеся @{F14|ablt,plur} данной @{F14|datv,sing}", + "definition_resolved": "все возможности данного субъекта, являющиеся угрозами данной угрозе" + } +}, +{ + "model": "rsform.constituenta", + "pk": 574, + "fields": { + "schema": 27, + "order": 66, + "alias": "F42", + "cst_type": "function", + "convention": "", + "term_raw": "зависимость @{X2|gent,sing} по @{F21|datv,plur}", + "term_resolved": "зависимость субъекта по мерам безопасности", + "term_forms": [], + "definition_formal": "[α∈X2] I{ξ | σ:=F28[α]; ξ:∈F35[α]; ω:=F14[ξ]; ω≠∅; ω∩σ=∅ }", + "definition_raw": "все @{F14|nomn,plur} данному @{X2|datv,sing}, @{F21|nomn,plur} для которых не пусты и полностью не являются @{F28|ablt,plur} этого @{X2|gent,sing}", + "definition_resolved": "все угрозы данному субъекту, меры безопасности для которых не пусты и полностью не являются возможностями этого субъекта" + } +}, +{ + "model": "rsform.constituenta", + "pk": 575, + "fields": { + "schema": 27, + "order": 67, + "alias": "F43", + "cst_type": "function", + "convention": "", + "term_raw": "собственные @{F14|nomn,plur}", + "term_resolved": "собственные угрозы", + "term_forms": [], + "definition_formal": "[α∈X2] F28[α]∩F35[α]", + "definition_raw": "@{F28|nomn,plur} @{X2|gent,sing}, являющиеся @{F14|ablt,plur} его @{F34|datv,plur}", + "definition_resolved": "возможности субъекта, являющиеся угрозами его интересам" + } +}, +{ + "model": "rsform.constituenta", + "pk": 576, + "fields": { + "schema": 27, + "order": 68, + "alias": "P2", + "cst_type": "predicate", + "convention": "", + "term_raw": "противоречивость @{F34|gent,plur} @{X2|gent,sing}", + "term_resolved": "противоречивость интересов субъекта", + "term_forms": [], + "definition_formal": "[α∈X2] F43[α]∩F34[α]≠∅", + "definition_raw": "некоторые @{F34|nomn,plur} @{X2|gent,sing} являются его @{F43|ablt,plur}", + "definition_resolved": "некоторые интересы субъекта являются его собственными угрозами" + } +}, +{ + "model": "rsform.constituenta", + "pk": 577, + "fields": { + "schema": 27, + "order": 69, + "alias": "P3", + "cst_type": "predicate", + "convention": "", + "term_raw": "разумность @{F21|gent,plur} в отношении @{F35|gent,sing}", + "term_resolved": "разумность мер безопасности в отношении угрозы субъекту", + "term_forms": [], + "definition_formal": "[α∈X2, β∈F35[α], γ∈ℬ(F14[β])] card(F40[α, β])≥card(F39[α, γ])", + "definition_raw": "@{F40|nomn,sing} от предотвращаемой @{F14|nomn,plur} не превышает масштаба @{F40|gent,sing} от @{F21|gent,plur}", + "definition_resolved": "масштаб угрозы от предотвращаемой угрозы не превышает масштаба масштаба угрозы от мер безопасности" + } +}, +{ + "model": "rsform.constituenta", + "pk": 578, + "fields": { + "schema": 27, + "order": 70, + "alias": "P4", + "cst_type": "predicate", + "convention": "", + "term_raw": "критичность @{X1|nomn,plur} для @{X2|gent,sing}", + "term_resolved": "критичность события для субъекта", + "term_forms": [], + "definition_formal": "[α∈X2, β∈X1] F34[α]⊆F8[β]", + "definition_raw": "@{F8|nomn,sing} данного @{X1|nomn,plur} включает все @{F34|nomn,plur} данного @{X2|gent,sing}", + "definition_resolved": "полное генетическое последствие данного события включает все интересы данного субъекта" + } +}, +{ + "model": "rsform.constituenta", + "pk": 579, + "fields": { + "schema": 27, + "order": 71, + "alias": "F44", + "cst_type": "function", + "convention": "", + "term_raw": "собственные критичные @{F28|nomn,plur}", + "term_resolved": "собственные критичные возможности", + "term_forms": [], + "definition_formal": "[α∈X2] D{ξ∈F28[α] | P4[α, ξ]}", + "definition_raw": "@{F28|nomn,plur} @{X2|gent,sing}, для которых выполнена @{P4|nomn,sing}", + "definition_resolved": "возможности субъекта, для которых выполнена критичность события для субъекта" + } +}, +{ + "model": "rsform.constituenta", + "pk": 580, + "fields": { + "schema": 27, + "order": 72, + "alias": "F45", + "cst_type": "function", + "convention": "", + "term_raw": "@{F6|nomn,sing} @{F34|gent,plur}", + "term_resolved": "полное генетическое условие интересов", + "term_forms": [], + "definition_formal": "[α∈X2] F5[F34[α]]", + "definition_raw": "@{F6|nomn,sing} всех @{F34|gent,plur} @{X2|gent,sing}", + "definition_resolved": "полное генетическое условие всех интересов субъекта" + } +}, +{ + "model": "rsform.constituenta", + "pk": 581, + "fields": { + "schema": 27, + "order": 73, + "alias": "F46", + "cst_type": "function", + "convention": "", + "term_raw": "собственное генетические расширение @{F34|gent,plur}", + "term_resolved": "собственное генетические расширение интересов", + "term_forms": [], + "definition_formal": "[α∈X2] F28[α]∩(F43[α]∪F34[α])", + "definition_raw": "все @{F28|gent,sing} данного @{X2|gent,sing}, являющиеся его @{F34|ablt,plur} или входящие в @{F45|nomn,sing} этого @{X2|gent,sing}", + "definition_resolved": "все возможности данного субъекта, являющиеся его интересами или входящие в полное генетическое условие интересов этого субъекта" + } +}, +{ + "model": "rsform.constituenta", + "pk": 582, + "fields": { + "schema": 27, + "order": 74, + "alias": "F47", + "cst_type": "function", + "convention": "", + "term_raw": "связанные @{F28|nomn,plur}", + "term_resolved": "связанные возможности", + "term_forms": [], + "definition_formal": "[α∈X2] F28[α]∩(F46[α]∪F43[α]∪F13[F35[α]])", + "definition_raw": "@{F28|nomn,plur} данного @{X2|gent,sing}, являющиеся @{F14|ablt,plur}, @{F21|ablt,plur} или @{F46|ablt,sing} @{X2|gent,sing}", + "definition_resolved": "возможности данного субъекта, являющиеся угрозами, мерами безопасности или собственным генетическим расширением интересов субъекта" + } +}, +{ + "model": "rsform.constituenta", + "pk": 583, + "fields": { + "schema": 27, + "order": 75, + "alias": "F48", + "cst_type": "function", + "convention": "", + "term_raw": "свободные @{F28|nomn,plur}", + "term_resolved": "свободные возможности", + "term_forms": [], + "definition_formal": "[α∈X2] F28[α]\\F47[α]", + "definition_raw": "@{F28|nomn,plur} данного @{X2|gent,sing}, не являющиеся @{F47|ablt,plur} этого @{X2|gent,sing}", + "definition_resolved": "возможности данного субъекта, не являющиеся связанными возможностями этого субъекта" + } +}, +{ + "model": "rsform.constituenta", + "pk": 584, + "fields": { + "schema": 27, + "order": 76, + "alias": "F49", + "cst_type": "function", + "convention": "", + "term_raw": "структурное субъектное описание", + "term_resolved": "структурное субъектное описание", + "term_forms": [], + "definition_formal": "[α∈ℬ(X1)] (I{(ξ, γ) | ξ:∈F29[α]; γ:=F28[ξ]∩α}, α∩D9)", + "definition_raw": "пара: все @{X2|nomn,plur} данного набора @{X1|gent,plur} с их @{F28|ablt,plur} из данного набора; все @{D9|nomn,plur} из данного набора событий", + "definition_resolved": "пара: все субъекты данного набора событий с их возможностями из данного набора; все природные возможности из данного набора событий" + } +}, +{ + "model": "rsform.constituenta", + "pk": 585, + "fields": { + "schema": 27, + "order": 77, + "alias": "F50", + "cst_type": "function", + "convention": "", + "term_raw": "угрожаемый комплекс", + "term_resolved": "угрожаемый комплекс", + "term_forms": [], + "definition_formal": "[α∈X2] F49[F45[α]]", + "definition_raw": "@{F49|nomn,sing} @{F45|gent,sing} данного @{X2|gent,sing}", + "definition_resolved": "структурное субъектное описание полного генетического условия интересов данного субъекта" + } +}, +{ + "model": "rsform.constituenta", + "pk": 586, + "fields": { + "schema": 27, + "order": 78, + "alias": "F51", + "cst_type": "function", + "convention": "", + "term_raw": "угрожающий комплекс", + "term_resolved": "угрожающий комплекс", + "term_forms": [], + "definition_formal": "[α∈X2] F49[F35[α]]", + "definition_raw": "@{F49|nomn,sing} @{F14|gent,plur} данному @{X2|datv,sing}", + "definition_resolved": "структурное субъектное описание угроз данному субъекту" + } +}, +{ + "model": "rsform.constituenta", + "pk": 587, + "fields": { + "schema": 27, + "order": 79, + "alias": "F52", + "cst_type": "function", + "convention": "", + "term_raw": "защищающий комплекс", + "term_resolved": "защищающий комплекс", + "term_forms": [], + "definition_formal": "[α∈X2] F49[F36[α]]", + "definition_raw": "@{F49|nomn,sing} @{F36|gent,plur}", + "definition_resolved": "структурное субъектное описание мер безопасности в отношении субъекта" + } +} +] diff --git a/rsconcept/backend/apps/rsform/migrations/0002_load_commons.py b/rsconcept/backend/fixtures/load_commons.py similarity index 78% rename from rsconcept/backend/apps/rsform/migrations/0002_load_commons.py rename to rsconcept/backend/fixtures/load_commons.py index a491ada6..da270299 100644 --- a/rsconcept/backend/apps/rsform/migrations/0002_load_commons.py +++ b/rsconcept/backend/fixtures/load_commons.py @@ -13,18 +13,12 @@ def load_initial_schemas(apps, schema_editor): for file in files: data = utils.read_trs(os.path.join(subdir, file)) data['is_common'] = True + data['is_canonical'] = True serializer = RSFormTRSSerializer(data=data, context={'load_meta': True}) serializer.is_valid(raise_exception=True) serializer.save() -def load_initial_users(apps, schema_editor): - for n in range(1, 10, 1): - User.objects.create_user( - f'TestUser{n}', f'usermail{n}@gmail.com', '1234' - ) - - class Migration(migrations.Migration): initial = True @@ -35,5 +29,4 @@ class Migration(migrations.Migration): operations = [ migrations.RunPython(load_initial_schemas), - migrations.RunPython(load_initial_users), ] diff --git a/rsconcept/frontend/src/context/LibraryContext.tsx b/rsconcept/frontend/src/context/LibraryContext.tsx index 9a7e92bd..402ee4fd 100644 --- a/rsconcept/frontend/src/context/LibraryContext.tsx +++ b/rsconcept/frontend/src/context/LibraryContext.tsx @@ -1,19 +1,19 @@ import { createContext, useCallback, useContext, useEffect, useState } from 'react'; import { ErrorInfo } from '../components/BackendError'; -import { DataCallback, deleteRSForm, getLibrary, postCloneRSForm, postNewRSForm } from '../utils/backendAPI'; -import { ILibraryFilter, IRSFormCreateData, IRSFormData, IRSFormMeta, matchRSFormMeta } from '../utils/models'; +import { DataCallback, deleteLibraryItem, getLibrary, postCloneLibraryItem, postNewRSForm } from '../utils/backendAPI'; +import { ILibraryFilter, ILibraryItem, IRSFormCreateData, IRSFormData, matchLibraryItem } from '../utils/models'; import { useAuth } from './AuthContext'; interface ILibraryContext { - items: IRSFormMeta[] + items: ILibraryItem[] loading: boolean processing: boolean error: ErrorInfo setError: (error: ErrorInfo) => void - filter: (params: ILibraryFilter) => IRSFormMeta[] - createSchema: (data: IRSFormCreateData, callback?: DataCallback) => void + filter: (params: ILibraryFilter) => ILibraryItem[] + createSchema: (data: IRSFormCreateData, callback?: DataCallback) => void cloneSchema: (target: number, data: IRSFormCreateData, callback: DataCallback) => void destroySchema: (target: number, callback?: () => void) => void } @@ -34,7 +34,7 @@ interface LibraryStateProps { } export const LibraryState = ({ children }: LibraryStateProps) => { - const [ items, setItems ] = useState([]) + const [ items, setItems ] = useState([]) const [ loading, setLoading ] = useState(false); const [ processing, setProcessing ] = useState(false); const [ error, setError ] = useState(undefined); @@ -44,13 +44,13 @@ export const LibraryState = ({ children }: LibraryStateProps) => { (params: ILibraryFilter) => { let result = items; if (params.ownedBy) { - result = result.filter(schema => schema.owner === params.ownedBy); + result = result.filter(item => item.owner === params.ownedBy); } if (params.is_common !== undefined) { - result = result.filter(schema => schema.is_common === params.is_common); + result = result.filter(item => item.is_common === params.is_common); } if (params.queryMeta) { - result = result.filter(schema => matchRSFormMeta(params.queryMeta!, schema)); + result = result.filter(item => matchLibraryItem(params.queryMeta!, item)); } return result; }, [items]); @@ -75,13 +75,13 @@ export const LibraryState = ({ children }: LibraryStateProps) => { }, [reload, user]); const createSchema = useCallback( - (data: IRSFormCreateData, callback?: DataCallback) => { + (data: IRSFormCreateData, callback?: DataCallback) => { setError(undefined); postNewRSForm({ data: data, showError: true, setLoading: setProcessing, - onError: error => { setError(error); }, + onError: error => setError(error), onSuccess: newSchema => { reload(); if (callback) callback(newSchema); @@ -92,7 +92,7 @@ export const LibraryState = ({ children }: LibraryStateProps) => { const destroySchema = useCallback( (target: number, callback?: () => void) => { setError(undefined) - deleteRSForm(String(target), { + deleteLibraryItem(String(target), { showError: true, setLoading: setProcessing, onError: error => setError(error), @@ -108,7 +108,7 @@ export const LibraryState = ({ children }: LibraryStateProps) => { return; } setError(undefined) - postCloneRSForm(String(target), { + postCloneLibraryItem(String(target), { data: data, showError: true, setLoading: setProcessing, diff --git a/rsconcept/frontend/src/context/RSFormContext.tsx b/rsconcept/frontend/src/context/RSFormContext.tsx index 74f6e145..689b5dbe 100644 --- a/rsconcept/frontend/src/context/RSFormContext.tsx +++ b/rsconcept/frontend/src/context/RSFormContext.tsx @@ -6,14 +6,14 @@ import { useRSFormDetails } from '../hooks/useRSFormDetails' import { type DataCallback, getTRSFile, patchConstituenta, patchDeleteConstituenta, +patchLibraryItem, patchMoveConstituenta, patchRenameConstituenta, - patchResetAliases, patchRSForm, - patchUploadTRS, postClaimRSForm, postNewConstituenta + patchResetAliases, patchUploadTRS, postClaimLibraryItem, postNewConstituenta } from '../utils/backendAPI' import { IConstituentaList, IConstituentaMeta, ICstCreateData, - ICstMovetoData, ICstRenameData, ICstUpdateData, IRSForm, - IRSFormMeta, IRSFormUpdateData, IRSFormUploadData + ICstMovetoData, ICstRenameData, ICstUpdateData, ILibraryItem, + ILibraryUpdateData, IRSForm, IRSFormUploadData } from '../utils/models' import { useAuth } from './AuthContext' @@ -35,8 +35,8 @@ interface IRSFormContext { toggleReadonly: () => void toggleTracking: () => void - update: (data: IRSFormUpdateData, callback?: DataCallback) => void - claim: (callback?: DataCallback) => void + update: (data: ILibraryUpdateData, callback?: DataCallback) => void + claim: (callback?: DataCallback) => void download: (callback: DataCallback) => void upload: (data: IRSFormUploadData, callback: () => void) => void @@ -73,33 +73,41 @@ export const RSFormState = ({ schemaID, children }: RSFormStateProps) => { const [ isForceAdmin, setIsForceAdmin ] = useState(false); const [ isReadonly, setIsReadonly ] = useState(false); - const isOwned = useMemo(() => user?.id === schema?.owner || false, [user, schema?.owner]); - const isClaimable = useMemo(() => user?.id !== schema?.owner || false, [user, schema?.owner]); + const isOwned = useMemo( + () => { + return user?.id === schema?.owner || false; + }, [user, schema?.owner]); + + const isClaimable = useMemo( + () => { + return (user?.id !== schema?.owner && schema?.is_common && !schema?.is_canonical) ?? false; + }, [user, schema?.owner, schema?.is_common, schema?.is_canonical]); + const isEditable = useMemo( - () => { - return ( - !loading && !processing && !isReadonly && + () => { + return ( + !loading && !processing && !isReadonly && ((isOwned || (isForceAdmin && user?.is_staff)) ?? false) - ) - }, [user?.is_staff, isReadonly, isForceAdmin, isOwned, loading, processing]) + ); + }, [user?.is_staff, isReadonly, isForceAdmin, isOwned, loading, processing]); const isTracking = useMemo( - () => { - return true - }, []); + () => { + return true; + }, []); const toggleTracking = useCallback( - () => { - toast.info('Отслеживание в разработке...') - }, []); + () => { + toast.info('Отслеживание в разработке...') + }, []); const update = useCallback( - (data: IRSFormUpdateData, callback?: DataCallback) => { + (data: ILibraryUpdateData, callback?: DataCallback) => { if (!schema) { return; } setError(undefined) - patchRSForm(schemaID, { + patchLibraryItem(schemaID, { data: data, showError: true, setLoading: setProcessing, @@ -130,12 +138,12 @@ export const RSFormState = ({ schemaID, children }: RSFormStateProps) => { }, [schemaID, setError, setSchema, schema]); const claim = useCallback( - (callback?: DataCallback) => { + (callback?: DataCallback) => { if (!schema || !user) { return; } setError(undefined) - postClaimRSForm(schemaID, { + postClaimLibraryItem(schemaID, { showError: true, setLoading: setProcessing, onError: error => setError(error), diff --git a/rsconcept/frontend/src/pages/CreateRSFormPage.tsx b/rsconcept/frontend/src/pages/CreateRSFormPage.tsx index 2938b64a..eb304f72 100644 --- a/rsconcept/frontend/src/pages/CreateRSFormPage.tsx +++ b/rsconcept/frontend/src/pages/CreateRSFormPage.tsx @@ -11,7 +11,7 @@ import TextArea from '../components/Common/TextArea'; import TextInput from '../components/Common/TextInput'; import RequireAuth from '../components/RequireAuth'; import { useLibrary } from '../context/LibraryContext'; -import { IRSFormCreateData } from '../utils/models'; +import { IRSFormCreateData, LibraryItemType } from '../utils/models'; function CreateRSFormPage() { const navigate = useNavigate(); @@ -41,10 +41,12 @@ function CreateRSFormPage() { return; } const data: IRSFormCreateData = { + item_type: LibraryItemType.RSFORM, title: title, alias: alias, comment: comment, is_common: common, + is_canonical: false, file: file, fileName: file?.name }; diff --git a/rsconcept/frontend/src/pages/LibraryPage/ViewLibrary.tsx b/rsconcept/frontend/src/pages/LibraryPage/ViewLibrary.tsx index 341a528c..ecd01611 100644 --- a/rsconcept/frontend/src/pages/LibraryPage/ViewLibrary.tsx +++ b/rsconcept/frontend/src/pages/LibraryPage/ViewLibrary.tsx @@ -6,19 +6,19 @@ import ConceptDataTable from '../../components/Common/ConceptDataTable'; import TextURL from '../../components/Common/TextURL'; import { useNavSearch } from '../../context/NavSearchContext'; import { useUsers } from '../../context/UsersContext'; -import { IRSFormMeta } from '../../utils/models' +import { ILibraryItem } from '../../utils/models' interface ViewLibraryProps { - schemas: IRSFormMeta[] + items: ILibraryItem[] } -function ViewLibrary({ schemas }: ViewLibraryProps) { +function ViewLibrary({ items }: ViewLibraryProps) { const { resetQuery: cleanQuery } = useNavSearch(); const navigate = useNavigate(); const intl = useIntl(); const { getUserLabel } = useUsers(); - const openRSForm = (schema: IRSFormMeta) => navigate(`/rsforms/${schema.id}`); + const openRSForm = (item: ILibraryItem) => navigate(`/rsforms/${item.id}`); const columns = useMemo(() => [ @@ -26,7 +26,17 @@ function ViewLibrary({ schemas }: ViewLibraryProps) { name: 'Шифр', id: 'alias', maxWidth: '140px', - selector: (schema: IRSFormMeta) => schema.alias, + selector: (item: ILibraryItem) => item.alias, + sortable: true, + reorder: true + }, + { + name: 'Статусы', + id: 'status', + maxWidth: '50px', + selector: (item: ILibraryItem) => { + return `${item.is_canonical ? 'C': ''}${item.is_common ? 'S': ''}` + }, sortable: true, reorder: true }, @@ -34,16 +44,16 @@ function ViewLibrary({ schemas }: ViewLibraryProps) { name: 'Название', id: 'title', minWidth: '50%', - selector: (schema: IRSFormMeta) => schema.title, + selector: (item: ILibraryItem) => item.title, sortable: true, reorder: true }, { name: 'Владелец', id: 'owner', - selector: (schema: IRSFormMeta) => schema.owner ?? 0, - format: (schema: IRSFormMeta) => { - return getUserLabel(schema.owner); + selector: (item: ILibraryItem) => item.owner ?? 0, + format: (item: ILibraryItem) => { + return getUserLabel(item.owner); }, sortable: true, reorder: true @@ -51,8 +61,8 @@ function ViewLibrary({ schemas }: ViewLibraryProps) { { name: 'Обновлена', id: 'time_update', - selector: (schema: IRSFormMeta) => schema.time_update, - format: (schema: IRSFormMeta) => new Date(schema.time_update).toLocaleString(intl.locale), + selector: (item: ILibraryItem) => item.time_update, + format: (item: ILibraryItem) => new Date(item.time_update).toLocaleString(intl.locale), sortable: true, reorder: true } @@ -61,7 +71,7 @@ function ViewLibrary({ schemas }: ViewLibraryProps) { return ( ({}); - const [ items, setItems ] = useState([]); + const [ items, setItems ] = useState([]); useLayoutEffect(() => { const filterType = new URLSearchParams(search).get('filter'); @@ -43,7 +43,7 @@ function LibraryPage() {
{ library.loading && } { library.error && } - { !library.loading && library.items && } + { !library.loading && library.items && }
); } diff --git a/rsconcept/frontend/src/pages/RSFormPage/DlgCloneRSForm.tsx b/rsconcept/frontend/src/pages/RSFormPage/DlgCloneRSForm.tsx index 1b56d3cc..5edb0b4e 100644 --- a/rsconcept/frontend/src/pages/RSFormPage/DlgCloneRSForm.tsx +++ b/rsconcept/frontend/src/pages/RSFormPage/DlgCloneRSForm.tsx @@ -21,16 +21,18 @@ function DlgCloneRSForm({ hideWindow }: DlgCloneRSFormProps) { const [alias, setAlias] = useState(''); const [comment, setComment] = useState(''); const [common, setCommon] = useState(false); + const [canonical, setCanonical] = useState(false); const { cloneSchema } = useLibrary(); const { schema } = useRSForm(); useEffect(() => { if (schema) { - setTitle(getCloneTitle(schema)) - setAlias(schema.alias) - setComment(schema.comment) - setCommon(schema.is_common) + setTitle(getCloneTitle(schema)); + setAlias(schema.alias); + setComment(schema.comment); + setCommon(schema.is_common); + setCanonical(false); } }, [schema, schema?.title, schema?.alias, schema?.comment, schema?.is_common]); @@ -39,10 +41,12 @@ function DlgCloneRSForm({ hideWindow }: DlgCloneRSFormProps) { return; } const data: IRSFormCreateData = { + item_type: schema.item_type, title: title, alias: alias, comment: comment, - is_common: common + is_common: common, + is_canonical: canonical }; cloneSchema(schema.id, data, newSchema => { toast.success(`Схема создана: ${newSchema.alias}`); diff --git a/rsconcept/frontend/src/pages/RSFormPage/EditorRSForm.tsx b/rsconcept/frontend/src/pages/RSFormPage/EditorRSForm.tsx index 1ee70b21..bd2cd1bf 100644 --- a/rsconcept/frontend/src/pages/RSFormPage/EditorRSForm.tsx +++ b/rsconcept/frontend/src/pages/RSFormPage/EditorRSForm.tsx @@ -1,4 +1,4 @@ -import { useCallback, useLayoutEffect, useState } from 'react'; +import { useLayoutEffect, useState } from 'react'; import { useIntl } from 'react-intl'; import { toast } from 'react-toastify'; @@ -13,19 +13,21 @@ import { CrownIcon, DownloadIcon, DumpBinIcon, HelpIcon, SaveIcon, ShareIcon } f import { useAuth } from '../../context/AuthContext'; import { useRSForm } from '../../context/RSFormContext'; import { useUsers } from '../../context/UsersContext'; -import { IRSFormCreateData } from '../../utils/models'; -import { claimOwnershipProc, downloadRSFormProc, shareCurrentURLProc } from '../../utils/procedures'; +import { IRSFormCreateData, LibraryItemType } from '../../utils/models'; interface EditorRSFormProps { onDestroy: () => void + onClaim: () => void + onShare: () => void + onDownload: () => void } -function EditorRSForm({ onDestroy }: EditorRSFormProps) { +function EditorRSForm({ onDestroy, onClaim, onShare, onDownload }: EditorRSFormProps) { const intl = useIntl(); const { getUserLabel } = useUsers(); const { - schema, update, download, - isEditable, isOwned, isClaimable, processing, claim + schema, update, isForceAdmin, + isEditable, isOwned, isClaimable, processing } = useRSForm(); const { user } = useAuth(); @@ -33,6 +35,7 @@ function EditorRSForm({ onDestroy }: EditorRSFormProps) { const [alias, setAlias] = useState(''); const [comment, setComment] = useState(''); const [common, setCommon] = useState(false); + const [canonical, setCanonical] = useState(false); const [isModified, setIsModified] = useState(true); @@ -45,10 +48,12 @@ function EditorRSForm({ onDestroy }: EditorRSFormProps) { schema.title !== title || schema.alias !== alias || schema.comment !== comment || - schema.is_common !== common + schema.is_common !== common || + schema.is_canonical !== canonical ); - }, [schema, schema?.title, schema?.alias, schema?.comment, schema?.is_common, - title, alias, comment, common]); + }, [schema, schema?.title, schema?.alias, schema?.comment, + schema?.is_common, schema?.is_canonical, + title, alias, comment, common, canonical]); useLayoutEffect(() => { if (schema) { @@ -56,25 +61,23 @@ function EditorRSForm({ onDestroy }: EditorRSFormProps) { setAlias(schema.alias); setComment(schema.comment); setCommon(schema.is_common); + setCanonical(schema.is_canonical); } }, [schema]); const handleSubmit = (event: React.FormEvent) => { event.preventDefault(); const data: IRSFormCreateData = { + item_type: LibraryItemType.RSFORM, title: title, alias: alias, comment: comment, - is_common: common + is_common: common, + is_canonical: canonical }; update(data, () => toast.success('Изменения сохранены')); }; - const handleDownload = useCallback(() => { - const fileName = (schema?.alias ?? 'Schema') + '.trs'; - downloadRSFormProc(download, fileName); - }, [download, schema?.alias]); - return (
@@ -82,18 +85,18 @@ function EditorRSForm({ onDestroy }: EditorRSFormProps) { } - onClick={shareCurrentURLProc} + onClick={onShare} /> } - onClick={handleDownload} + onClick={onDownload} /> } disabled={!isClaimable || !user} - onClick={() => { claimOwnershipProc(claim); }} + onClick={onClaim} /> { setTitle(event.target.value); }} + onChange={event => setTitle(event.target.value)} /> { setAlias(event.target.value); }} + onChange={event => setAlias(event.target.value)} />