# egglog
This is the repo for the `egglog` tool accompanying the paper
"Better Together: Unifying Datalog and Equality Saturation"
([ACM DL](https://dl.acm.org/doi/10.1145/3591239), [arXiv](https://arxiv.org/abs/2304.04332)).
If you use this work, please use [this citation](./CITATION.bib).
See also the Python binding, which provides a bit more documentation:
https://egglog-python.readthedocs.io/
## Chat
There is a Zulip chat about egglog here:
https://egraphs.zulipchat.com/#narrow/stream/375765-egglog
## Prerequisites & compilation
```
apt-get install make cargo
cargo install cargo-nextest
make all
```
## Usage
```
cargo run [-f fact-path] [-naive] [--to-json] [--to-dot] [--to-svg]
```
or just
```
cargo run
```
for the REPL.
* The `--to-dot` command will save a graphviz dot file at the end of the program, replacing the `.egg` extension with `.dot`.
* The `--to-svg`, which requires [Graphviz to be installed](https://graphviz.org/download/), will save a graphviz svg file at the end of the program, replacing the `.egg` extension with `.svg`.
## Community extensions
* [@hatoo](https://github.com/hatoo) maintains an [egglog-language extension](https://marketplace.visualstudio.com/items?itemName=hatookov.egglog-language) in VS Code (just search for "egglog" in VS Code).
* [@segeljakt](https://github.com/segeljakt) maintains a [Neovim plugin](https://github.com/segeljakt/tree-sitter-egg) for egglog using tree-sitter.
## Development
To run the tests use `make test`.
# Documentation
To view documentation, run `cargo doc --open`.
TODO migrate the following documentation to cargo doc:
### Sort: i64
Signed 64-bit integers supporting these primitives:
```
+ - * / % ; arithmetic
& | ^ << >> not-i64 ; bit-wise operations
< > <= >= ; comparisons
min max log2
to-f64
to-string
```
### Sort: f64
64-bit floating point numbers supporting these primitives:
```
+ - * / % ; arithmetic
< > <= >= ; comparisons
min max neg
to-i64
to-string
```
### Sort: map
A map from a key type to a value type supporting these primitives:
```
empty
insert
get
not-contains
contains
set-union
set-diff
set-intersect
map-remove
```
### Sort: rational
Rational numbers (fractions) with 64-bit precision for numerator and denominator with these primitives:
```
+ - * / ; arithmetic
min max neg abs floor ceil round
rational ; construct from a numerator and denominator
numer denom ; get numerator and denominator
pow log sqrt
< > <= >= ; comparisons
```
These primitives are only defined when the result itself is a pure rational.
### Sort: string
Use double quotes to get a quote: `"Foo "" Bar"` is `Foo " Bar`.
No primitives defined.