Hello,
I would like to use the SymbolicUtils composing rewriter Fixpoint(rw)
which
returns a rewriter which applies
rw
repeatedly until there are no changes to be made
to apply a custom rule to a Symbolics.jl expression until nothing
is returned.
However, rereading the SymbolicUtils.jl and TermInterface.jl documentation it is not clear to me how to do this - specifically how to set up the interface between Symbolics.jl and SymbolicUtils.jl.
The MNWE is
# test_symbolics_main.jl
using Symbolics
function main()
@variables x, t
@variables Φ(x, t)
Dx = Differential(x)
D2x = Dx * Dx
Dt = Differential(t)
# The rule that I would like to apply
r = @rule Dt(Dx(~Φ)) => Dx(Dt(~Φ))
# The test expression to which I would like to apply the rule
∂2Φ∂t2 = Dt(Dx(Dx(Φ))) - 2*Dt(Φ)*Φ
# The rewrite I would like to perform
γ2 = Fixpoint(r)(∂2Φ∂t2)
# The problem
@show istree(∂2Φ∂t2) # returns "false" . Not an expression tree.
end
begin
main()
end
The SymbolicUtils.jl documentation states
In particular, you should define methods from TermInterface.jl for an expression tree type
T
with symbol typesS
to work with SymbolicUtils.jl
and the TermInterface.jl documentation states
You should define the following methods for an expression tree type
T
with symbol typesS
to work with TermInterface.jl . . .
istree(x::T)
oristree(x::Type{T})
Without an example, it is not clear to me, a Symbolics neophyte, what is meant and how to proceed.
In the above MNWE,
should @variables
be replaced by @syms
?
should ∂2Φ∂t2
be defined as ∂2Φ∂t2::Symbolics.Term
?