Skip to content

Commit 51bb693

Browse files
committed
Implement simplify(:(x - (-y))) ==> x + y
1 parent b71363f commit 51bb693

File tree

2 files changed

+7
-1
lines changed

2 files changed

+7
-1
lines changed

src/symbolic.jl

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,9 @@ function simplify(::SymbolParameter{:+}, args)
145145
end
146146
end
147147

148+
isminus(ex::Expr) = ex.head == :call && ex.args[1] == :- && length(ex.args) == 2
149+
isminus(ex) = false
150+
148151
# Assume length(args) == 3
149152
function simplify(::SymbolParameter{:-}, args)
150153
# Remove any 0's in a subtraction
@@ -154,6 +157,9 @@ function simplify(::SymbolParameter{:-}, args)
154157
# Special Case: simplify(:(x - x)) == 0
155158
elseif length(args) == 2 && args[1] == args[2]
156159
return 0
160+
# Special Case: simplify(:(x - (-y))) == x + y
161+
elseif length(args) == 2 && isminus(args[2])
162+
return Expr(:call, :+, args[1], args[2].args[2])
157163
else
158164
return Expr(:call, :-, args...)
159165
end

test/symbolic.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
@test isequal(differentiate(:(exp(x)), :x), :(exp(x)))
2323
@test isequal(differentiate(:(log(x)), :x), :(1 / x))
2424
@test isequal(differentiate(:(sin(x) + sin(x)), :x), :(cos(x) + cos(x)))
25-
@test isequal(differentiate(:(sin(x) - cos(x)), :x), :(-(cos(x),-sin(x)))) # Simplify -(a, -(b)) => +(a, b)
25+
@test isequal(differentiate(:(sin(x) - cos(x)), :x), :(cos(x) + sin(x)))
2626
@test isequal(differentiate(:(x * sin(x)), :x), :(sin(x) + x * cos(x)))
2727
@test isequal(differentiate(:(x / sin(x)), :x), :((sin(x) - x * cos(x)) / (sin(x)^2)))
2828
@test isequal(differentiate(:(sin(sin(x))), :x), :(*(cos(x),cos(sin(x)))))

0 commit comments

Comments
 (0)