import { LinkTopic } from '../../components/link-topic';
import { HelpTopic } from '../../models/help-topic';

export function HelpRSLangExpressionStructure() {
  return (
    <div>
      <h1>Структурные выражения</h1>
      <p>
        Структурные выражения в языке родов структур используются для преобразований, меняющий{' '}
        <LinkTopic topic={HelpTopic.RSL_TYPIFICATION} text='типизацию' /> аргументов, позволяя порождать структурно
        зависимые или структурно новые понятия.
      </p>

      <h2>Порождение структур</h2>
      <ul>
        <li>
          <b>Булеан / Множество подмножеств</b>: <code>ℬ(X1)</code> — множество всех подмножеств <code>X1</code>.
        </li>
        <li>
          <b>Декартово произведение</b>: <code>X1×X2</code> — множество всех пар элементов из <code>X1</code> и{' '}
          <code>X2</code>.
        </li>
        <li>
          <b>Кортеж</b>: <code>(a, b, c)</code> — упорядоченная n-ка (n ≥ 2).
        </li>
        <li>
          <b>Перечисление</b>: <code>{'{a, b, c}'}</code> — неупорядоченная n-ка (n ≥ 1).
        </li>
        <li>
          <b>Синглетон / буль</b>: <code>bool(a)</code> = <code>{`{a}`}</code> — множество, состоящее из одного
          элемента.
        </li>
      </ul>

      <h2>Производные структуры</h2>

      <ul>
        <li>
          <b>Множество-сумма</b>: <code>red(S1)</code> — объединение элементов всех множеств в <code>S1</code>. Операция
          применима только к множествам, состоящим из множеств.
        </li>
        <li>
          <b>Десинглетон / дебуль</b>: <code>debool({`{a}`})</code> = <code>a</code> — извлечение единственного элемента
          из множества. Операция применима только к множествам с одним элементом.
        </li>
        <li>
          <b>Малая проекция</b>: <code>pr1((a1, …, an))</code> = <code>a1</code>.
        </li>
        <li>
          <b>Большая проекция</b>: <code>Pr1(S1)</code> — множество первых компонентов всех кортежей из <code>S1</code>.
        </li>
      </ul>
      <p>
        Индексы у операций над кортежами для упрощения отображаются равными 1, но их можно заменить на другие
        натуральные числа или их последовательность, разделенная запятой.
      </p>

      <h2>Мультииндексы</h2>
      <p>
        Вместо одного индекса можно использовать <b>мультииндекс</b> — последовательность натуральных чисел через
        запятую. В этом случае проекция или фильтр возвращает сразу несколько позиций кортежа.
      </p>
      <ul>
        <li>
          <code>pr1,3((a1, a2, a3, a4)) = (a1, a3)</code>
        </li>
        <li>
          <code>Pr2,4(S1)</code> — множество пар, составленных из второй и четвёртой компонент кортежей из{' '}
          <code>S1</code>.
        </li>
      </ul>

      <h2>Фильтр</h2>
      <ul>
        <li>
          <b>Фильтр</b>: <code>Fi1[D1](S1)</code> — подмножество <code>S1</code>, в котором для каждого элемента первая
          проекция принадлежит <code>D1</code>.
        </li>
        <li>
          К фильтру применим <b>мультииндексы</b>, тогда нужно указывать столько же параметров в квадратных скобках.
        </li>
        <li>
          Допустимо использование мультииндексов в фильтре с одним параметром. Тогда проверяется принадлежность
          параметру кортежа, составленного из соответствующих проекций элементов фильтруемого множества.
        </li>
        <li>
          <b>Мультифильтр</b>: <code>Fi1,2[D1](S1)</code> отличается от фильтра с мультииндексом{' '}
          <code>Fi1,2[Pr1(D1), Pr2(D2)](S1)</code> тем, что в первом случае проверяется принадлежность парам из D1, а во
          втором — полному декартову произведению проекций D1
        </li>
      </ul>

      <h2>Примеры</h2>
      <ul>
        <li>
          <code>{`ℬ(2) = {{}, {1}, {2}, {1, 2}}`}</code>
        </li>
        <li>
          <code>(1,2,3)</code> — кортеж из трёх чисел
        </li>
        <li>
          <code>pr2((5, 4, 3, 2, 1)) = 4</code>
        </li>
        <li>
          <code>
            Pr3({`{(1, 2, 3),(4, 5, 6)}`}) = {`{3, 6}`}
          </code>
        </li>
        <li>
          <code>
            red({`{{1, 2, 3},{3, 4}}`}) = {`{1, 2, 3, 4}`}
          </code>
        </li>
        <li>
          <code>bool(1) = {`{1}`}</code>, <code>debool({`{1}`}) = 1</code>
        </li>
        <li>
          <code>{`Fi2[{2, 4}]({((1, 2), (3, 4), (5, 6))}) = {((1, 2), (3, 4))}`}</code>
        </li>
      </ul>
    </div>
  );
}
