Symbolic.jl
===========

## Introduction

The Symbolic package provides limited set of arithmetic operations for Julia's
`Expr`, `Symbol`, and `Real` types wrapped around `SymReal`. However, operations, such as `+` and `*`, are restricted to
have two arguments at most.

## Interface

`SymReal` type can be created using string macro `S"..."` such as `S"x"`
for a variable `x`. This string macro expects a string allowed by `parse`
that returns either a `Real` number, `Symbol`, or `Expr` Julia expressions
having only supported set of functions.

Working set of basic functions: these functions try to give simplified and/or
factorized results. Also, their derivatives are provided with `diff` function.

* ``` + - * / ^ exp sqrt cbrt log ```

## Examples

* More or less works as expected
```
julia> using Symbolic

julia> diff(S"x^h/exp(x^h)",S"x")
S"-(((h * x ^ (h - 1)) * (x ^ h - 1)) / exp(x ^ h))"

julia> S"a^t"*S"a^(t+2)"
S"a ^ (2 * (t + 1))"

julia> S"exp(t)"*S"(ax+b)^t"
S"(e = 2.7182818284590... * (ax + b)) ^ t"

```
[Artificial Neural Network] (https://gist.github.com/tomaklutfu/d25ea8fe58342745eb17)  
[Futurama Pendulum] (https://gist.github.com/tomaklutfu/33c0c3bd5ee1ccccc333)  

* Not expexcted but maybe correct
```
julia> z=SymReal[:f :g
                 :h :i];

julia> z*z*z*z-(z*z)*(z*z)
#A little verbose result shows up
#instead of [S"0" S"0";S"0" S"0"]
#Not checked for correctness

julia> inv(z)
#More complex result than it needs to be
#Not checked for correctness
```
## TODO

* Add tests
* Add more functions
* Support functions that accept more than two
  arguments.
* Suggestions are welcomed.

## Developer
* Lutfullah Tomak - 2018
