egglog 2.0.0

egglog is a language that combines the benefits of equality saturation and datalog. It can be used for analysis, optimization, and synthesis of programs. It is the successor to the popular rust library egg.
Documentation
(check (= 0 (& 10 0)))
(check (= 8 (& 8 10)))
(check (= 10 (| 8 10)))
(check (= 2 (^ 8 10)))
(check (= 8 (<< 1 3)))
(check (= 1 (>> 8 3)))
(check (= 2 (% 8 3)))
(check (= 2 (/ 8 3)))
(check (= -1 (not-i64 0)))

; bitsets
;(function bs-union (i64 i64) i64)
;(rewrite (bs-union a b) (| a b))

;(function bs-inter (i64 i64) i64)
;(rewrite (bs-inter a b) (& a b))

;(function bs-comp (i64) i64)
;(rewrite (bs-comp a) (bvnot a))

; singleton set
;(function bs-sing (i64) i64)
;(rewrite (bs-sing a) (1 << a))

;(function bs-insert (i64 i64) i64)
;(rewrite (bs-insert s x) (| s (1 << a))

;(function bs-diff (i64 i64) i64)
;(rewrite (bs-diff a b) (^ a (bs-inter a b))

;(let bs-empty 0)

;(let bs-subset (i64 i64) bool)
;(rewrite (bs-subset x y) (is-zero (bs-diff x y)))

;(let bs-is-elem (i64 i64) bool)
;(rewrite (bs-is-elem s x) (not (is-zero (bs-inter s (sing x)))))