An e-graph compactly represents many equivalent programs. Commonly used in Equality Saturation and modern theorem-provers.

It’s a data-structure that represents equivalence relations over terms.

It is made up of equivalence classes (or e-classes) which are sets of equivalence nodes (e-nodes). e-nodes are n-ary operators from whatever domain you are operating in (e.g. / or * for math).

Instead of destructive rewrites over the tree of nodes, we can grow the e-graph by representing the transformed program as new equivalences. The following is an example of rewriting to be .

Originally, the e-class containing * just has one item which points to a and 2. We extend the e-class by adding << which points to a and 1, semantically saying that a * 2 is equivalent to a << 1. Note the Hash consing on the nodes to prevent duplication.

Finally, we can pick one ‘best’ e-node in each e-class. This is called ‘extracting’ the optimized term.