Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Аннотация

Spring neo4j


Это экспериментальный проект, объединяющий химию и абстрактную математику через теорию категорий. В основе лежит оригинальная модель, в которой молекулы и химические реакции описываются как объекты и морфизмы в мультрикатегории.

Проект предлагает:

  • формальное описание химических реакций как композиционных преобразований.
  • собственный синтаксис для описания молекул, реакций и цепочек превращений.
  • серверное API для анализа, хранения и поиска реакционных путей.
  • возможную основу для симуляции синтеза, автоматического вывода продуктов и визуализации реакционных сетей.

Почему это может быть интересно?

  • Для математиков: это живой пример применения категориального мышления в области естественных наук.
  • Для химиков: это инструмент для анализа и формализации реакций без потери смысла.
  • Для программистов: это архитектурно чистый и расширяемый проект на стыке языка, графов и алгебры.

Описание

Над этой частью все еще идет работа, поэтому описание не полное. В оригинальной работе также описываются графы, сети петри а также функторы между всеми этими категориями.

Категория молекулярных реакций

Это мультрикатегория \(\mathbf{Mol}\), в которой все объекты — это молекулы, которые в рамках этой категории не имеют имен или каких-то обозначений. Это некие абстрактные молекулы, без имен, но все же для удобства мы будем их называть обычными именами, например \(\mathsf{H_2O}\). Позже, рассматривая функторы мы опишем имена молекул отдельной структурой. Поэтому сейчас можно сказать что-то на подобии этого:

$$ Ob(\mathbf{Mol}) = \{\mathsf{H_2O}, \mathsf{O_2}, \mathsf{NaOH}, \dots\} $$

Но стоит учитывать, что назвать молекулы вы можете как угодно, например буквами или фигурами, или ограничится самым абстрактным пониманием объекта. Но пока для удобства будем называть молекулы привычными именами.

Морфизмы

Морфизмы в этой категории — это обобщения для реакций, причем нас не интересует, сколько именно молекул участвуют в реакции и в какой именно реакции (сгорание, замещение, окисление). Мы концентрируемся только на том, из каких молекул вообще возможно получить какие и не важно каким образом. Возможно мы еще не открыли определенные реакции для получение неких молекул, но уже оперируем ими так, будто есть несколько способов получить из одних молекул другие (например реакцией из будущего или композицией существующих). Также как и в морфизмах \(\mathbf{Set}\), где один и тот же переход из одного множества в другое может быть описан бесконечно огромным количеством функций. За этими абстракциями (морфизмами) скрывается обычная химия с обычными уравнениями, которые имеют такой же смысл, как и функции в категории \(\mathbf{Set}\).

Давайте рассмотрим пару примеров:

1. Реакция горения метана (органическая реакция окисления):

Химическое уравнение:

$$ \mathsf{CH_3(g) + 2O_2(g) \rightarrow CO_2(g) + 2H_2O(g)} $$

Морфизмы:

$$ f_1 : (\mathsf{CH_3}, \mathsf{O_2}) \to \mathsf{CO_2} $$

$$ f_2 : (\mathsf{CH_3}, \mathsf{O_2}) \to \mathsf{H_2O} $$

Тип реакции: Окислительно-восстановительная (горение), экзотермическая.

Объяснение: Как видите, у этой реакции есть два морфизма. Это обусловлено тем, что у реакции есть два продукта. Для удобной композиции лучше завести два морфизма, чем один с двумя результатами. Также, как вы можете заметить, мы игнорируем количество молекул (вместо \(\mathsf{2H_2O}\) мы оперируем \(\mathsf{H_2O}\)). На данном уровне абстракции мы не думаем об этом. Мы оперируем морфизмами как фактами возможности реакции.


2. Реакция нейтрализации: гидроксид натрия + соляная кислота:

Химическое уравнение:

$$ \mathsf{NaOH(aq) + HCl(aq) \rightarrow NaCl(aq) + H_2O(l)} $$

Морфизмы:

$$ f_1 : (\mathsf{NaOH}, \mathsf{HCl}) \to \mathsf{NaCl} $$

$$ f_2 : (\mathsf{NaOH}, \mathsf{HCl}) \to \mathsf{H_2O} $$

Тип реакции: Обменная, нейтрализация, экзотермическая.


3. Реакция разложения пероксида водорода:

Химическое уравнение:

$$ \mathsf{2H_2O_2(aq) \rightarrow 2H_2O(l) + O_2(g)} $$

Морфизмы:

$$ f_1 : \mathsf{H_2O_2} \to \mathsf{H_2O} $$ $$ f_2 : \mathsf{H_2O_2} \to \mathsf{O_2} $$

Тип реакции: Разложение, окислительно-восстановительная.


4. Реакция замещения: цинк + соляная кислота:

Химическое уравнение:

$$ \mathsf{Zn(s) + 2HCl(aq) \rightarrow ZnCl_2(aq) + H_2(g)} $$

Морфизмы:

$$ f_1 : (\mathsf{Zn}, \mathsf{HCl}) \to \mathsf{ZnCl_2} $$

$$ f_2 : (\mathsf{Zn}, \mathsf{HCl}) \to \mathsf{H_2} $$

Тип реакции: Замещение, окислительно-восстановительная.


5. Термическое разложение карбоната кальция:

Химическое уравнение:

$$ \mathsf{CaCO_3(s) \xrightarrow{Δ} CaO(s) + CO_2(g)} $$

Морфизмы:

$$ f_1 : \mathsf{CaCO_3} \to \mathsf{CaO} $$

$$ f_2 : \mathsf{CaCO_3} \to \mathsf{CO_2} $$

Тип реакции: Разложение.

Тождественные морфизмы

Каждый объект имеет свой тождественный морфизм:

$$ \forall o \in \mathrm{Ob}(\mathbf{Mol}) \ : \ \mathrm{id}_o \in \mathrm{Hom}_{\mathbf{Mol}}(o, o) $$

Например:

$$ id_{H_2O} : H_2O \to H_2O $$

$$ id_{O_2} : O_2 \to O_2 $$ Чаще всего, это означает, что элемент просто покоится и ничего не происходит. Но иногда это может означать изменение агрегатного состояния, например:

$$ \mathsf{Br_{2(g)}} \to \mathsf{Br_{2(l)}} \to \mathsf{Br_{2(s)}} $$

Но поскольку мы абстрагируемся от количества молекул а также от хода реакции и концентрируемся только на участниках и факте реакции, мы игнорируем это, так как в ходе этой реакции мы все равно получим одну и ту же молекулу:

$$ id_{Br_2} : Br_2 \to Br_2 $$

Композиция

Пусть у нас есть морфизм:

$$ f : (A_1, A_2, ..., A_n) \to B $$

и для каждого \(A_i\) есть морфизмы:

$$ g_i : (B_{i1}, B_{i2}, ..., B_{im_i}) \to A_i $$

Тогда мы можем составить композицию:

$$ f \circ (g_1, ..., g_n) : (B_{11}, ..., B_{1m_1}, ..., B_{n1}, ..., B_{nm_n}) \to B $$

Например:

\(f: (A, B) \to C\)

\(g: (D, E) \to A\)

Тогда можно составить:

$$ f \circ (g, id_B) : (D, E) \to C $$

Вот еще один пример:

Давайте попробуем доказать такую реакцю:

$$ (\mathsf{CH_3}, \mathsf{O_2}) \to \mathsf{NaOH} $$

В теории, мы бы могли бы уже ей пользоваться так, будто она возможна, но давайте представим, что нам сейчас важно понять, из каких других реакций может состоять эта? Во первых, давайте найдем реакцию, которая дает \(\mathsf{NaOH}\)):

$$ \mathsf{Na_2O} + \mathsf{H_2O} \rightarrow \mathsf{2NaOH} $$

Отсюда можно сразу вывести морфизм:

$$ f : (\mathsf{Na_2O}, \ \mathsf{H_2O}) \to \mathsf{NaOH} $$

Теперь нам нужна реакция дающая воду. Для получения воды мы можем использовать эту реакцию:

$$ \mathsf{CH_3(g) + 2O_2(g) \rightarrow CO_2(g) + 2H_2O(g)} $$

Для этого нам всего нужно два элемента, поэтому отсюда можно вывести морфизм:

$$ g : (\mathsf{CH_3}, \mathsf{O_2}) \to \mathsf{H_2O} $$

Скорее всего, если вывести огромную компьютерную модель всевозможных реакций и композиций, нам даже не придется думать об реакциях, но для ясности, мы их будем рассматривать. И вот мы уже можем вывести композицию:

$$ f \circ (id_{\mathbf{Na_2O}}, \ g) : (\mathsf{CH_3}, \mathsf{O_2}) \to \mathsf{NaOH} $$

Давайте снова возьмем морфизм \(f\):

$$ f : (\mathsf{Na_2O}, \ \mathsf{H_2O}) \to \mathsf{NaOH} $$

И подумаем, а какие еще композиции можно вывести? По сути, это количество способов вывести \(\mathsf{H_2O}\) \(\times\) количество способов вывести \(\mathsf{Na_2O}\). Мы уже знаем пару способов вывести \(\mathsf{H_2O}\) из упомянутых выше реакций:

$$ g_1 : \mathsf{H_2O_2} \to \mathsf{H_2O} $$

$$ g_2 : (\mathsf{NaOH}, \ \mathsf{HCl}) \to \mathsf{H_2O} $$ $$ g_3 : (\mathsf{CH_3}, \ \mathsf{O_2}) \to \mathsf{H_2O} $$

Используя это мы можем выводить новые композиции:

$$ f \circ (id_{\mathbf{Na_2O}}, \ g_1) : \mathsf{H_2O_2} \to \mathsf{NaOH} $$

$$ f \circ (id_{\mathbf{Na_2O}}, \ g_2) : (\mathsf{NaOH}, \ \mathsf{HCl}) \to \mathsf{NaOH} $$

$$ f \circ (id_{\mathbf{Na_2O}}, \ g_3) : (\mathsf{CH_3}, \ \mathsf{O_2}) \to \mathsf{NaOH} $$

Теперь, давайте выведем несколько способов получения \(\mathsf{Na_2O}\):

$$ 4\mathsf{Na} + \mathsf{O_2} \rightarrow \mathsf{2Na_2O} $$ $$ \mathsf{2Na_2O_2} \xrightarrow{t} \mathsf{2Na_2O} + \mathsf{O_2} $$

А также переведем эти реакции в нужные нам морфизмы:

$$ h_1 : (\mathsf{Na}, \ \mathsf{O_2}) \to \mathsf{Na_2O} $$

$$ h_2 : \mathsf{Na_2O_2} \to \mathsf{Na_2O} $$

И сделать из них новую композицию:

$$ f \circ (h_1, \ g_1) : (\mathsf{Na}, \ \mathsf{O_2}, \ \mathsf{H_2O_2}) \to \mathsf{NaOH} $$

$$ f \circ (h_1, \ g_2) : (\mathsf{Na}, \ \mathsf{O_2}, \ \mathsf{NaOH}, \ \mathsf{HCl}) \to \mathsf{NaOH} $$

$$ f \circ (h_1, \ g_3) : (\mathsf{Na}, \ \mathsf{CH_3}, \ \mathsf{O_2}) \to \mathsf{NaOH} $$

$$ f \circ (h_2, \ g_1) : (\mathsf{Na_2O_2}, \ \mathsf{H_2O_2}) \to \mathsf{NaOH} $$

$$ f \circ (h_2, \ g_2) : (\mathsf{Na_2O_2}, \ \mathsf{NaOH}, \ \mathsf{HCl}) \to \mathsf{NaOH} $$

$$ f \circ (h_2, \ g_3) : (\mathsf{Na_2O_2}, \ \mathsf{CH_3}, \ \mathsf{O_2}) \to \mathsf{NaOH} $$


Давайте еще раз рассмотрим морфизмы \(h_1\) и \(h_2\):

$$ h_1 : (\mathsf{Na}, \ \mathsf{O_2}) \to \mathsf{Na_2O} $$

$$ h_2 : \mathsf{Na_2O_2} \to \mathsf{Na_2O} $$

Тут примечательно то, что из \(\mathsf{Na}\) и \(\mathsf{O_2}\) мы можем получить \(\mathsf{Na_2O_2}\) в ходе реакции:

$$ \mathsf{2Na + O_2} \to \mathsf{Na_2O_2} $$

Это значит, что существует морфизм:

$$ k: (\mathsf{Na}, \ \mathsf{O_2}) \to \mathsf{Na_2O_2} $$

А это значит, что морфизм \(h_1\) может быть описан композицией:

$$ h_2 \circ k : (\mathsf{Na}, \ \mathsf{O_2}) \to \mathsf{Na_2O} $$

Мультифунктор в категорию множеств (\(\mathbf{Mol} \to \mathbf{Set}\))

$$ F : \mathbf{Mol} \to \mathbf{Set} $$

Все объекты из \(\mathbf{Mol}\) превращаются во множества с одним элементом:

$$ F(\mathsf{H_2O}) = \{\mathsf{H_2O}\} $$

$$ F(\mathsf{CO_2}) = \{\mathsf{CO_2}\} $$

$$ \cdots $$

При этом в категории \(\mathbf{Set}\) всегда есть множество всех молекул:

$$ K = \bigcup_{m \in \mathrm{Ob}(\mathbf{Mol})} F(m), \quad K \in \mathbf{Set} $$

Каждому морфизму \(f: (X_1, \dots, X_n) \to Y\) в \(\mathbf{Mol}\) сопоставляется функция:

$$ F(f): F(X_1) \times \dots \times F(X_n) \to F(Y) $$

Эти функции не несут в себе интересной динамики, однако сам функтор \(F\) позволяет нам определить множество всех молекул \(K\), а также использовать его как основу для дальнейших отображений.

$$ \mathsf{H_2O} \in K $$

При этом там не существует молекулы \(2H_2O\):

$$ \mathsf{2H_2O} \notin K $$

Давайте попробуем описать множество всех химических элементов \(E\):

$$ E \subset K $$

$$ \mathsf{H} \in E $$

$$ \mathsf{H_2O} \notin E $$

Давайте также введем подмножества для разных элементов, например металлов или неметеллов:

  • \(NM\) - множество неметаллов:

$$ NM \subset E $$

$$ \{\mathsf{H}, \mathsf{C}, \mathsf{N}, \mathsf{O}\} \subset NM $$

  • \(HM\) - множество полуметаллов:

$$ HM \subset E $$

  • \(M\) - множество металлов:

$$ M \subset E $$

$$ \mathsf{Ti} \in M $$

При этом:

$$ NM \cap M = \emptyset $$

$$ HM \cap M = \emptyset $$

$$ HM \cap NM = \emptyset $$

При этом это множество можно также разделить на разные типы металлов:

  • \(M_{A}\) - Щелочные металлы:

$$ M_A \subset M $$

$$ \mathsf{Na} \in M_{A} $$

Можно еще описать это множество так (все элементы первой группы кроме водорода):

$$ M_A = \{e \in E \mid G(e) = 1\} \setminus \{\mathsf{H}\} = \{\mathsf{Li}, \mathsf{Na}, \mathsf{K}, \mathsf{Rb}, \mathsf{Cs}, \mathsf{Fr}\} $$

Функция \(G\) будет описана чуть ниже. Это такая функция, которая каждому элементу присваивает группу.

  • Щелочноземельные металлы(\(M_{AE}\))

$$ M_{AE} \subset M $$

При этом это все элементы второй группы:

$$ M_{AE} = \{e \in E \mid G(e) = 2\} = \{\mathsf{Be}, \mathsf{Mg}, \mathsf{Ca}, \mathsf{Sr}, \mathsf{Ba}, \mathsf{Ra}\} $$

  • Переходные металлы (\(M_T\)): \(M_T \subset M\)
  • Лантаноиды (\(M_L\)): \(M_L \subset M\)
  • Актиноиды (\(M_{AC}\)): \(M_{AC} \subset M\)
  • Постпереходные металлы (\(M_{PT}\)): \(M_{PT} \subset M\)

Давайте также опишем множество агрегатных состояний, которые может принимать та или иная молекула:

  • Газ \(GF\) (Gas Form)
  • Жидкость \(LF\) (Liquid Form)
  • Твердое \(SF\) (Solid Form)

$$ GF \subset K \quad ;\quad LF \subset K \quad ; \quad SF \subset K $$

Например, молекула \(\mathsf{H_2O}\) находится во всех трех этих множествах одновременно:

$$ \mathsf{H_2O} \in GF \cap LF \cap SF $$

Что означает, что эта молекула может иметь все три агрегатных состояния.


При этом существует функция, для получения картежа всех элементов, которые находятся в молекуле:

$$ \mathbb{E} : K \to \bigcup_{k=1}^\infty E^k $$

Например:

$$ \mathbb{E}(\mathsf{H_2O}) = (\mathsf{H}, \mathsf{H}, \mathsf{O}) $$

$$ \mathbb{E}(\mathsf{O_2}) = (\mathsf{O}, \mathsf{O}) $$

Также есть еще одна функция с таким же именем:

$$ \mathbb{E} : \mathcal{P}(K) \to \bigcup_{k=1}^\infty E^k $$

Для этой функции даже можно составить реализацию:

$$ \mathbb{E}(x \in \mathcal{P}(K)) = \bigcup_{k \in x} \mathbb{E}(k) $$

Как вы помните, наши объекты из \(\mathbf{Mol}\) переходят во множества с одним элементом (\(F(H_2O) = \{H_2O\}\)). Любое такое множество является элементом множества \(\mathcal{P}(K)\), поэтому возможна запись:

$$ \mathbb{E}(F(\mathsf{H_2O})) = (\mathsf{H}, \mathsf{H}, \mathsf{O}), \quad \mathsf{H_2O} \in \mathbf{Mol} $$

Или даже это:

$$ \mathbb{E}(\{ \mathsf{H_2O}, \ \mathsf{O_2} \}) = \mathbb{E}(\mathsf{H_2O}) \cup \mathbb{E}(\mathsf{O_2}) = (\mathsf{H}, \mathsf{H}, \mathsf{O}, \mathsf{O}, \mathsf{O}) $$

Молярная масса

Давайте введем функцию для нахождения малярной массы:

$$ M: E \to \mathbb{R}^+ $$

Например для элемента \(\mathsf{O}\):

$$ M(\mathsf{O}) = 16 $$

Давайте также введем еще одну функцию:

$$ M : K \to \mathbb{R}^+ $$

При этом у этой функции всегда одна реализация:

$$ M(k\in K) = \sum_{e \in \mathbb{E}(k)}M(e) $$

Для молекулы \(\mathsf{O_2}\):

$$ M(\mathsf{O_2}) = M(O) + M(O) = 32 $$

Также есть еще одна функция:

$$ M : \mathcal{P}(K) \to \mathbb{N} $$ $$ M(x \in \mathcal{P}(K)) = \sum_{e \in x} M(e) $$

С которой возможна такая запись:

$$ M(F(\mathsf{O_2})) = M(\mathsf{O}) + M(\mathsf{O}) = 32, \quad \mathsf{O_2} \in \mathbf{Mol} $$ $$ M(\{\mathsf{H_2O}, \ \mathsf{O_2}\}) = M(\mathsf{H_2O}) + M(\mathsf{O_2}) = M(\mathsf{H}) + M(\mathsf{H}) + M(\mathsf{O}) + M(\mathsf{O}) + M(\mathsf{O}) = 50 $$

Атомный номер (число протонов в ядре атома)

Есть также функция, которая каждому элементу присваивает номер из периодической таблицы:

$$ Z : E \to \mathbb{N} $$

$$ Z(\mathsf{N}) = 7 $$ $$ \mathsf{O} \mapsto 8, \quad \mathsf{Ni} \mapsto 28, \quad \mathsf{Ti} \mapsto 22, \quad \cdots $$

Группа

Есть функция, сопоставляющая каждому элементу группу:

$$ G : E \to \mathbb{N} $$

$$ G(\mathsf{Co}) = 9 $$

Период

Есть функция, сопоставляющая каждому элементу период:

$$ P : E \to \mathbb{N} $$

$$ P(\mathsf{K}) = 4 $$

Относительная атомная масса

Есть функция, сопоставляющая каждому элементу относительную атомную массу:

$$ Ar : E \to \mathbb{R}^+ $$

$$ Ar(\mathsf{H}) = 1,008 $$

Массовое число

Есть функция, сопоставляющая каждому элементу массовое число:

$$ A : E \to \mathbb{R}^+ $$

Число нейтронов

Есть функция, сопоставляющая каждому элементу число нейтронов:

$$ N : E \to \mathbb{R}^+ $$

При этом:

$$ N(\mathsf{e}) = A(\mathsf{e}) - Z(\mathsf{e}), \quad e \in E $$

Имена молекул

Как вы помните в категории \(\mathbf{Mol}\) все молекулы не имеют имен и являются абстрактными молекулами. Имена мы даем отдельно, определяя множество \(Names\):

\(Names\) — это привычные имена молекул на подобии \(\mathsf{H_2O}\):

$$ \mathsf{H_2O} \in Names $$

Там также лежат имена, которые редко используются:

$$ \mathsf{OH_2} \in Names $$

Существует функция:

$$ Name : K \to \mathcal{P}(Names) $$

И теперь мы можем полностью абстрагироваться от названий молекул, чтобы не возникало путаницы, что мы подразумеваем под водой (\(\mathsf{H_2O}\) и / или \(\mathsf{OH_2}\)):

$$ Name(▲) = \{\mathsf{H_2O}, \ \mathsf{OH_2}, \ \dots\} $$

В данном случае \(▲\) — это вода. Мы как-бы берем то, что прячется за словами "вода", "\(\mathsf{H_2O}\)}" или "\(\mathsf{OH_2}\)".

Описание

Mol language — это язык для описания химических реакций. Если вы хотите подчеркнуть, что написанный вами файл был написан на языке Mol, вы можете добавить расширение файла: example.mol.

Синтаксис

Запись молекул

Язык Mol ­— это регистрочувствительный язык. Это значит, что очень важно то, как именно вы записываете названия молекул. Сервер Mol (сервер обрабатывающий язык Mol) разделяет каждую молекулу на атомы и проверяет валидность атомов (проверяет, существует ли записанный атом вообще). Лексер языка Mol будет воспринимать за атом все, что начинается с большой буквы, после которой опционально идет любое количество маленьких.

Давайте рассмотрим запись 2FeCl3:

  • 2: первое число будет полностью проигнорировано.
  • Fe: эта запись будет восприниматься как атом, потому что начинается с большой буквы, после которой идут маленькие. Если бы мы написали бы FE, то это воспринималось бы как два атома F и E, но на каком-то этапе нам бы все равно вернулась бы ошибка от сервера "атома E несуществует".
  • Cl: также будет восприниматься как атом.
  • 3: будет означать, что в молекуле есть три атома Cl. Это значение будет учитываться.

Запись реакций

Синтаксис у языка очень простой. Все реакции можно записать в таком виде:

Перечисление реагентов -> Перечисление продуктов

Перечислять молекулы можно с помощью + или с помощью ,: NaOH + HCl или NaOH, HCl. Вы также можете использовать круглые скобки, если это может быть удобным: (NaOH + HCl), (NaOH, HCl). Вот как может выглядеть итоговая запись этой реакции:

NaOH + HCl -> H2O

Вы также можете использовать ;, если хотите написать две реакции в одну строчку:

NaOH + HCl -> H2O ; CuO + H2 -> Cu + H2O

Также для удобства вы можете использовать символ _, который полностью игнорируется языком. Вот пару примеров: H_2O, H_2_O, K_2SO_4.

Коментарии

Язык поддерживает как и блочные, так и строчные комментарии:

// comment

/*
comment
*/

Пример

CH3 + 2O2 -> CO2 + 2H2O ; NaOH + HCl -> NaCl
NaOH + HCl -> H2O

(2H2O2) -> 2H2O + O2


(Zn, HCl) -> ZnCl_2
H2 + Cl2 -> 2HCl
2H2 + O2 -> 2H2O
2Na + Cl2 -> 2NaCl
CaCO3 -> CaO + CO2

// just random comment lol

Fe + S -> FeS
2K + 2H2O -> 2KOH + H2
Zn + 2HCl -> ZnCl2 + H2
CuO + H2 -> Cu + H2O
2Na + 2H2O -> 2NaOH + H2
CaOH2 + CO2 -> CaCO3 + H2O
NH3 + HCl -> NH4Cl
2Fe + 3Cl2 -> 2FeCl3
P + 5Cl2 -> PCl5
3Mg + N2 -> Mg3N2
C + O2 -> CO2
C + O2 -> CO
CO + O2 -> CO2

NaOH + HCl -> NaCl + H2O
H2SO4 + 2KOH -> K2SO4 + 2H2O
NH3 + H2O -> NH4 + OH
CH3COOH + NaOH -> CH3COONa + H2O
H2CO3 + CaOH2 -> CaCO3 + 2H2O
HNO3 + NH3 -> NH4NO3

Zn + CuSO4 -> ZnSO4 + Cu
Fe + CuCl2 -> FeCl2 + Cu

// i don't understand chemistry btw :D

2FeCl3 + H2S -> 2FeCl2 + 2HCl + S
2KMnO4 + 5H2C2O4 + 6H -> 2Mn2 + 10CO2 + 8H2O + 2K
H2O2 + 2KI + H2SO4 -> I2 + 2H2O + K2SO4
2Na + 2H2O -> 2NaOH + H2
Cl2 + 2NaI -> 2NaCl + I2

Основные команды:

  • import - импортирует файл или строчку с кодом mol
  • products — выводит продукты, которые возможно получить из предоставленного списка молекул.
  • reagents — выводит реагенты, которые нужны для получения молекулы указанной в аргументе
  • url — выводит или редактирует текущий адрес к серверу Mol
  • completions — добавляет авто-заполнение для вашей Shell

Команда completions

Команда completions нужна для генерации авто-заполнений в терминале. По факту это означает, что при нажатии кнопки автокомплита вашего терминала (обычно это Tab) после ввода команды mol вы получите подсказки.

Авто-заполнения нужно добавлять отдельно для вашей оболочки:

# bash
mol completions bash > ~/.local/share/bash-completion/completions/mol

# oh-my-zsh
mol completions zsh > ~/.oh-my-zsh/completions/_mol

autoload -U compinit && compinit

Команда выводит скрипт в зависимости от оболочки. Запустите mol completions --help, чтобы увидеть поддерживаемые оболочки.

Место размещения этого скрипта зависит от используемой оболочки и операционной системы. Обратитесь к документации вашей оболочки для получения дополнительной информации о том, где разместить скрипт.

Команда url

Команда url управляет значением url в конфигурационном файле ~/.config/mol.toml. Вы также можете менять это значение вручную. Конфигурационный файл создается при первом запуске и содержит http://localhost:8080 в качестве стандартного аргумента, так как предполагается, что вы будете запускать сервер вручную.

url = "http://localhost:8080"

Чтобы узнать, какой URL сейчас используется, воспользуйтесь флагом -o:

mol url -o

Это просто выведет ULR: http://localhost:8080.

Чтобы установить значение, вызовете команду без флагов и передайте новый адрес:

mol url 'http://localhost:8081'

Вы также можете выполнить mol url --help, для быстрого получения подсказок.

Команда import

Команда import отправляет Mol код на Mol сервер, после чего сервер обновляет граф молекулярных реакций.

Импорт файла

Вы можете импортировать файлы с расширением .mol, о которых шла речь в графе про язык Mol. Для этого есть опция -f:

mol import -f example.mol

Импорт вручную написанной строки

Вы также можете не создавая файл импортировать Mol код:

mol import -s 'CH3 + 2O2 -> CO2 + 2H2O ; NaOH + HCl -> NaCl'

Стандартный поток

Вы также можете пользоваться stdin. Это может быть полезно для скриптов:

echo "CH3 + 2O2 -> CO2 + 2H2O ; NaOH + HCl -> NaCl" | mol import
cat example.mol | mol import

Вы также можете пользоваться всем сразу:

cat example.mol | mol import -f example2.mol -s 'CH3 + 2O2 -> CO2 + 2H2O'

Команда products

Команда products выводит список реакций, которые возможны с переданными в качестве аргумента молекулами. По сути она означает "выведи продукты, которые я могу получить используя эти молекулы в совокупности, допуская то, что мне может понадобиться еще какой-то элемент".

В этом обзоре я буду использовать пример документа mol из предыдущих глав. У вас может быть другой вывод, если вы импортируете больше данных.

Вот пример для воды:

mol products H2O

Вывод:

[NH3, H2O] -> OH
[H2O, NH3] -> NH4
[H2O, Na] -> H2
[H2O, Na] -> NaOH
[H2O, K] -> H2
[H2O, K] -> KOH

Вот еще один пример для натрия:

mol products Na

Вывод:

[H2O, Na] -> H2
[H2O, Na] -> NaOH
[Cl2, Na] -> NaCl

В некоторых из этих реакций участвует также и вода. Давайте попробуем запросить продукты, которые можно получить из воды и натрия одновременно:

mol products Na H2O
[H2O, Na] -> H2
[H2O, Na] -> NaOH

Как видите, команда products вывела только те реакции, в которых одновременно участвуют все молекулы переданные в качестве аргументов (в данном случае H2O и Na). Если бы существовала реакция с тремя реагентами вида H2O + Na + x -> ..., то она также вывелась бы.

Команда reagents

Команда reagents выводит список реагентов, которые необходимы для получения указанного продукта в качестве аргумента. Это что-то на подобии "дай мне реакции, с помощью которых я могу получить молекулу".

В этом обзоре я буду использовать пример документа mol из предыдущих глав. У вас может быть другой вывод, если вы импортируете больше данных.

Пример для воды:

mol reagents H2O

Вывод:

[H2SO4, KI, H2O2] -> H2O
[KMnO4, H, H2C2O4] -> H2O
[H2CO3, CaOH2] -> H2O
[CH3COOH, NaOH] -> H2O
[H2SO4, KOH] -> H2O
[CO2, CaOH2] -> H2O
[CuO, H2] -> H2O
[H2, O2] -> H2O
[H2O2] -> H2O
[NaOH, HCl] -> H2O
[O2, CH3] -> H2O

Для CO2:

[KMnO4, H2C2O4, H] -> CO2
[O2, CO] -> CO2
[C, O2] -> CO2
[CaCO3] -> CO2
[O2, CH3] -> CO2