Документация Engee

Анализ выражений Julia для преобразования в символьные выражения

Выражения Julia, такие как :(y - x), принципиально отличаются от символьных выражений, поскольку для них не определена алгебра. Таким образом, при создании специфичных для доменов языков (DSL) и анализе файлов может оказаться очень полезным преобразование выражений Julia в выражения Symbolics.jl для дальнейшей работы. Для этого используется функция parse_expr_to_symbolic, которая проводит анализ.

К ограничениям, упомянутым в docstrings parse_expr_to_symbolic, следует относиться серьезно. Поскольку выражения Julia не содержат символьных метаданных, информация ограничена, и поэтому для выполнения анализа требуется эвристика.

parse_expr_to_symbolic(ex, mod::Module)

Применяет функцию parse_expr_to_symbolic в текущем модуле, т. е. parse_expr_to_symbolic(ex, mod), где mod — это модуль вызывающего объекта функции.

Аргументы

  • ex: анализируемое выражение

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

Пример

ex = :(y(t) ~ x(t))
parse_expr_to_symbolic(ex,Main) # дает символьное выражение `y(t) ~ x(t)` в пустом Main

# Теперь сделаем целую систему

ex = [:(y ~ x)
      :(y ~ -2x + 3 / z)
      :(z ~ 2)]
eqs = parse_expr_to_symbolic.(ex, (Main,))

@variables x y z
ex = [y ~ x
      y ~ -2x + 3 / z
      z ~ 2]
all(isequal.(eqs,ex)) # верно

Ограничения

Символьность связана с определениями среды

Анализ символьного выражения должен распознавать разницу между функциями, числами и глобальными объектами, определенными в среде Julia, и теми, которые должны стать символьными. Эта функциональность решает проблему так: она не определяет как символьные те объекты, которые уже определены в выбранном модуле mod. Например, в f(x,y) f будет несимвольной, если функция f (с именем f) определена в mod, т. е. если isdefined(mod,:f) имеет значение true. Когда символ определен, он будет заменен ее значением. Примечательно следующее: поведение анализа меняется в зависимости от среды, в которой он применяется.

Например:

parse_expr_to_symbolic(:(x - y),@__MODULE__) # x - y
x = 2.0
parse_expr_to_symbolic(:(x - y),@__MODULE__) # 2.0 - y

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

Метаданные пусты

Поскольку все переменные, определяемые выражениями, не определяются с помощью стандартных @variables, метаданные, которые были бы связаны или могут быть связаны с любой из сгенерированных переменных, отсутствуют. Все они имеют пустые метаданные, но определены в области Real. Таким образом, переменные, которые получаются в результате такого анализа, не могут быть равны символьной переменной, определенной в другом месте.