Анализ выражений Julia для преобразования в символьные выражения
Выражения Julia, такие как :(y - x)
, принципиально отличаются от символьных выражений, поскольку для них не определена алгебра. Таким образом, при создании специфичных для доменов языков (DSL) и анализе файлов может оказаться очень полезным преобразование выражений Julia в выражения Symbolics.jl для дальнейшей работы. Для этого используется функция parse_expr_to_symbolic
, которая проводит анализ.
К ограничениям, упомянутым в docstrings |
#
Symbolics.parse_expr_to_symbolic
— Function
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
. Таким образом, переменные, которые получаются в результате такого анализа, не могут быть равны символьной переменной, определенной в другом месте.