M: Improve RSForm stats UI

This commit is contained in:
Ivan 2024-08-22 15:28:59 +03:00
parent 07c2f1da2f
commit cdefe97d98
5 changed files with 230 additions and 59 deletions

View File

@ -95,7 +95,8 @@ export { RiShieldKeyholeLine as IconPrivate } from 'react-icons/ri';
export { BiBug as IconStatusError } from 'react-icons/bi'; export { BiBug as IconStatusError } from 'react-icons/bi';
export { BiCheckCircle as IconStatusOK } from 'react-icons/bi'; export { BiCheckCircle as IconStatusOK } from 'react-icons/bi';
export { BiHelpCircle as IconStatusUnknown } from 'react-icons/bi'; export { BiHelpCircle as IconStatusUnknown } from 'react-icons/bi';
export { BiPauseCircle as IconStatusIncalculable } from 'react-icons/bi'; export { BiStopCircle as IconStatusIncalculable } from 'react-icons/bi';
export { BiPauseCircle as IconStatusProperty } from 'react-icons/bi';
export { LuPower as IconKeepAliasOn } from 'react-icons/lu'; export { LuPower as IconKeepAliasOn } from 'react-icons/lu';
export { LuPowerOff as IconKeepAliasOff } from 'react-icons/lu'; export { LuPowerOff as IconKeepAliasOff } from 'react-icons/lu';

View File

@ -27,7 +27,7 @@ function IconValue({
}: IconValueProps) { }: IconValueProps) {
return ( return (
<div <div
className={clsx('flex items-center', { 'justify-between gap-6 text-right': !dense, 'gap-2': dense }, className)} className={clsx('flex items-center', { 'justify-between gap-6 text-right': !dense, 'gap-1': dense }, className)}
{...restProps} {...restProps}
> >
<MiniButton <MiniButton

View File

@ -1,4 +1,17 @@
import { IconChild, IconPredecessor, IconRSForm } from '@/components/Icons'; import {
IconChild,
IconGraphCollapse,
IconGraphExpand,
IconGraphInputs,
IconGraphOutputs,
IconPredecessor,
IconRSForm,
IconStatusError,
IconStatusIncalculable,
IconStatusOK,
IconStatusProperty,
IconStatusUnknown
} from '@/components/Icons';
import LinkTopic from '@/components/ui/LinkTopic'; import LinkTopic from '@/components/ui/LinkTopic';
import { HelpTopic } from '@/models/miscellaneous'; import { HelpTopic } from '@/models/miscellaneous';
@ -28,6 +41,15 @@ function HelpThesaurus() {
Родоструктурная экспликация КС экспликация КС с помощью{' '} Родоструктурная экспликация КС экспликация КС с помощью{' '}
<LinkTopic text='аппарата родов структур' topic={HelpTopic.RSLANG} />. <LinkTopic text='аппарата родов структур' topic={HelpTopic.RSLANG} />.
</p> </p>
<p>
Граф термов ориентированный граф, узлами которого являются конституенты КС, а связи задаются на основе
вхождения имени конституенты в определение другой конституенты.
</p>
<p>
Ядро концептуальной схемы совокупность базовых понятий, аксиом и промежуточных производных понятий,
необходимых для формирования выражений аксиом. Остальные конституенты относят к Телу концептуальной схемы.
</p>
<h2>Конституента</h2> <h2>Конституента</h2>
<p> <p>
@ -37,13 +59,73 @@ function HelpThesaurus() {
являются Термин, Конвенция, Типизация (Структура), Формальное определение, Текстовое определение, Комментарий. являются Термин, Конвенция, Типизация (Структура), Формальное определение, Текстовое определение, Комментарий.
</p> </p>
<ul> <ul>
По <b>наличию формального определения в рамках КС</b> выделены: По <b>характеру формального определения в рамках КС</b> выделены классы:
<li> <li>
базовое понятие (<i>неопределяемое понятие</i>) не имеет определения и задано конвенцией и аксиомами; базовое понятие (<i>неопределяемое понятие</i>) не имеет определения и задано конвенцией и аксиомами;
</li> </li>
<li> <li>
производное понятие (<i>выводимое понятие</i>) имеет определение. производное понятие (<i>выводимое понятие</i>) имеет определение.
</li> </li>
<li>утверждение определяется через логическое выражение.</li>
<li>шаблон определения содержит несвязанный параметр в определении.</li>
</ul>
<br />
<ul>
По <b>назначению</b> выделены типы конституент:
<li>
базисное множество (X#) представляет неопределяемое понятие, представленное структурой множества, чьи элементы
различимы и не сравнимы с элементами других базисных множеств;
</li>
<li>
константное множество (C#) представляет неопределяемое понятие, моделируемое термом теории множеств, который
поддерживает ряд формальных операций над его элементами;
</li>
<li>
родовая структура (S#) представляет неопределяемое понятие, имеющее определенную структуру, построенную на
базисных множествах и константных множеств. Содержание родовой структуры формируется{' '}
<LinkTopic text='отношением типизации' topic={HelpTopic.RSL_TYPES} />, аксиомами и конвенцией;
</li>
<li>терм (D#) представляет выводимое понятие через формальное определение;</li>
<li>
аксиома (A#) представляет утверждение, ограничивающее неопределяемые понятия и выводимые термы. Интерпретация
аксиомы должна быть истинна и является критерием корректности интерпретации КС в целом;
</li>
<li>
теорема (T#) представляет ценное для предметной утверждение, значение которого может быть как истинным так и
ложным;
</li>
<li>
терм-функция (F#) представляет выводимое понятие (возможно параметризованное), имеющее характер
функционального отношения между набором аргументов и результатом;
</li>
<li>
предикат-функция (P#) представляет выводимое понятие (возможно параметризованное), имеющее характер
логического выражения, проверяющее заданные аргументы на соответствие некоторому условию;
</li>
</ul>
<br />
<ul>
По <b>графу термов</b> выделены:
<li>
<IconGraphOutputs size='1rem' className='inline-icon' />
потребители данной конституенты конституенты, определения которых используют данную конституенту
</li>
<li>
<IconGraphInputs size='1rem' className='inline-icon' />
поставщики данной конституенты конституенты, имена которых используются в определении данной конституенты
</li>
<li>
<IconGraphExpand size='1rem' className='inline-icon' />
зависимые от данной конституенты потребители данной конституенты напрямую или по цепочке
</li>
<li>
<IconGraphCollapse size='1rem' className='inline-icon' />
влияющие на данную конституенту поставщики данной конституенты напрямую или по цепочке
</li>
</ul> </ul>
<br /> <br />
@ -63,6 +145,30 @@ function HelpThesaurus() {
<br /> <br />
<ul>
Для характеристики <b>корректности определения</b> введены статусы конституент:
<li>
<IconStatusUnknown size='1rem' className='inline-icon' /> не проверено требуется проверка формального
определения (промежуточный статус);
</li>
<li>
<IconStatusOK size='1rem' className='inline-icon' /> корректно формальное определение корректно;
</li>
<li>
<IconStatusError size='1rem' className='inline-icon' /> ошибочно ошибка в формальном определении;
</li>
<li>
<IconStatusProperty size='1rem' className='inline-icon' /> неразмерное формальное определение задает
невычислимое множество, для которого возможно вычислить предикат проверки принадлежности;
</li>
<li>
<IconStatusIncalculable size='1rem' className='inline-icon' /> невычислимо формальное определение невозможно
интерпретировать напрямую;
</li>
</ul>
<br />
<ul> <ul>
Для описания <b>отождествления</b> введены: Для описания <b>отождествления</b> введены:
<li>отождествляемые конституенты конституенты, состоящие в отождествлении;</li> <li>отождествляемые конституенты конституенты, состоящие в отождествлении;</li>
@ -81,32 +187,16 @@ function HelpThesaurus() {
<IconChild size='1rem' className='inline-icon' /> наследованная конституента конституента, перенесенная из <IconChild size='1rem' className='inline-icon' /> наследованная конституента конституента, перенесенная из
другой КС в рамках операции синтеза; другой КС в рамках операции синтеза;
</li> </li>
<li>собственная конституента конституента, не являющаяся наследником других конституент;</li> <li>
<IconPredecessor size='1rem' className='inline-icon' /> собственная конституента конституента, не являющаяся
наследником других конституент;
</li>
<li> <li>
<IconPredecessor size='1rem' className='inline-icon' /> исходная конституента для данной конституенты <IconPredecessor size='1rem' className='inline-icon' /> исходная конституента для данной конституенты
собственная конституента, прямым или опосредованным наследником которой является данная конституента. собственная конституента, прямым или опосредованным наследником которой является данная конституента.
</li> </li>
</ul> </ul>
<br />
<ul>
По <b>назначению</b> выделены:
<li>
базисное множество (X1) задает неопределяемое понятие, представленное структурой множества, чьи элементы
различимы и не сравнимы с элементами других базисных множеств;
</li>
<li>
константное множество (C1) задает неопределяемое понятие, моделируемое термом теории множеств, который
поддерживает ряд формальных операций над его элементами;
</li>
<li>
родовая структура (S1) задает неопределяемое понятие, имеющее определенную структуру, построенную на базисных
множествах и константных множеств. Содержание родовой структуры формируется{' '}
<LinkTopic text='отношением типизации' topic={HelpTopic.RSL_TYPES} />, аксиомами и конвенцией;
</li>
</ul>
<h2>Операционная схема синтеза</h2> <h2>Операционная схема синтеза</h2>
<p>Раздел в разработке...</p> <p>Раздел в разработке...</p>

View File

@ -1,4 +1,13 @@
import {
IconChild,
IconPredecessor,
IconStatusError,
IconStatusIncalculable,
IconStatusOK,
IconStatusProperty
} from '@/components/Icons';
import Divider from '@/components/ui/Divider'; import Divider from '@/components/ui/Divider';
import IconValue from '@/components/ui/IconValue';
import LabeledValue from '@/components/ui/LabeledValue'; import LabeledValue from '@/components/ui/LabeledValue';
import { type IRSFormStats } from '@/models/rsform'; import { type IRSFormStats } from '@/models/rsform';
@ -11,49 +20,120 @@ function RSFormStats({ stats }: RSFormStatsProps) {
return null; return null;
} }
return ( return (
<div className='flex flex-col sm:gap-1 sm:ml-6 sm:mt-8 sm:w-[16rem]'> <div className='flex flex-col sm:gap-1 sm:ml-6 sm:mt-8 sm:w-[14rem]'>
<Divider margins='my-2' className='sm:hidden' /> <Divider margins='my-2' className='sm:hidden' />
<LabeledValue id='count_all' label='Всего конституент' text={stats.count_all} /> <LabeledValue id='count_all' label='Всего конституент' text={stats.count_all} />
{stats.count_inherited !== 0 ? ( <div className='grid grid-cols-4 gap-1'>
<LabeledValue id='count_inherited' label='Наследованные' text={stats.count_inherited} /> <IconValue
) : null} id='count_owned'
<LabeledValue id='count_errors' label='Некорректные' text={stats.count_errors} /> dense
{stats.count_property !== 0 ? ( icon={<IconPredecessor size='1.25rem' className='clr-text-primary' />}
<LabeledValue id='count_property' label='Неразмерные' text={stats.count_property} /> value={stats.count_all - stats.count_inherited}
) : null} title='Собственные'
{stats.count_incalculable !== 0 ? ( />
<LabeledValue id='count_incalculable' label='Невычислимые' text={stats.count_incalculable} /> <IconValue
) : null} id='count_inherited'
dense
icon={<IconChild size='1.25rem' className='clr-text-primary' />}
value={stats.count_inherited}
title='Наследованные'
/>
</div>
<div className='grid grid-cols-4 gap-1'>
<IconValue
id='count_ok'
dense
icon={<IconStatusOK size='1.25rem' className='clr-text-green' />}
value={stats.count_all - stats.count_errors - stats.count_property - stats.count_incalculable}
title='Корректные'
/>
<IconValue
id='count_property'
dense
icon={<IconStatusProperty size='1.25rem' className='clr-text-primary' />}
value={stats.count_errors}
title='Неразмерные'
/>
<IconValue
id='count_incalculable'
dense
icon={<IconStatusIncalculable size='1.25rem' className='clr-text-red' />}
value={stats.count_incalculable}
title='Невычислимые'
/>
<IconValue
id='count_errors'
dense
icon={<IconStatusError size='1.25rem' className='clr-text-red' />}
value={stats.count_errors}
title='Некорректные'
/>
</div>
<div className='grid grid-cols-4 gap-1'>
<IconValue
id='count_base'
dense
icon={<span className='font-math clr-text-default'>X#</span>}
value={stats.count_base}
title='Базисные множества'
/>
<IconValue
id='count_constant'
dense
icon={<span className='font-math clr-text-default'>C#</span>}
value={stats.count_constant}
title='Константные множества'
/>
<IconValue
id='count_structured'
dense
icon={<span className='font-math clr-text-default'>S#</span>}
value={stats.count_structured}
title='Родовые структуры'
/>
<IconValue
id='count_axiom'
dense
icon={<span className='font-math clr-text-default'>A#</span>}
value={stats.count_axiom}
title='Аксиомы'
/>
<IconValue
id='count_term'
dense
icon={<span className='font-math clr-text-default'>D#</span>}
value={stats.count_term}
title='Термы'
/>
<IconValue
id='count_function'
dense
icon={<span className='font-math clr-text-default'>F#</span>}
value={stats.count_function}
title='Терм-функции'
/>
<IconValue
id='count_predicate'
dense
icon={<span className='font-math clr-text-default'>P#</span>}
value={stats.count_predicate}
title='Предикат-функции'
/>
<IconValue
id='count_theorem'
dense
icon={<span className='font-math clr-text-default'>T#</span>}
value={stats.count_theorem}
title='Теоремы'
/>
</div>
<Divider margins='my-2' /> <Divider margins='my-2' />
<LabeledValue id='count_text_term' label='Термины' text={stats.count_text_term} /> <LabeledValue id='count_text_term' label='Термины' text={stats.count_text_term} />
<LabeledValue id='count_definition' label='Определения' text={stats.count_definition} /> <LabeledValue id='count_definition' label='Определения' text={stats.count_definition} />
<LabeledValue id='count_convention' label='Конвенции' text={stats.count_convention} /> <LabeledValue id='count_convention' label='Конвенции' text={stats.count_convention} />
<Divider margins='my-2' />
{stats.count_base !== 0 ? (
<LabeledValue id='count_base' label='Базисные множества ' text={stats.count_base} />
) : null}
{stats.count_constant !== 0 ? (
<LabeledValue id='count_constant' label='Константные множества ' text={stats.count_constant} />
) : null}
{stats.count_structured !== 0 ? (
<LabeledValue id='count_structured' label='Родовые структуры ' text={stats.count_structured} />
) : null}
{stats.count_axiom !== 0 ? <LabeledValue id='count_axiom' label='Аксиомы ' text={stats.count_axiom} /> : null}
{stats.count_term !== 0 ? <LabeledValue id='count_term' label='Термы ' text={stats.count_term} /> : null}
{stats.count_function !== 0 ? (
<LabeledValue id='count_function' label='Терм-функции ' text={stats.count_function} />
) : null}
{stats.count_predicate !== 0 ? (
<LabeledValue id='count_predicate' label='Предикат-функции ' text={stats.count_predicate} />
) : null}
{stats.count_theorem !== 0 ? (
<LabeledValue id='count_theorem' label='Теоремы ' text={stats.count_theorem} />
) : null}
</div> </div>
); );
} }

View File

@ -134,7 +134,7 @@ div:not(.dense) > p {
} }
li::marker { li::marker {
content: ' '; content: '\2009';
} }
.border { .border {