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
; Step with alternating feet, left before right
(relation left (i64))
(relation right (i64))
(relation middle (i64))

(left 0)
(right 0)

(ruleset step-left)
(rule ((left x) (right x))
      ((left (+ x 1)))
      :ruleset step-left)

(ruleset step-right)
(rule ((left x) (right y) (= x (+ y 1)))
      ((right x))
      :ruleset step-right)

(ruleset step-middle)
(rule ((left x))
      ((middle x))
      :ruleset step-middle)

(unstable-combined-ruleset
  my-combination 
  step-left step-right 
  step-middle)

(run-schedule (repeat 1 my-combination))

(check (left 1))
(check (right 0))
;; middle didn't observe anything except original step
(check (middle 0))
(fail (check (left 2)))
(fail (check (right 1)))
(fail (check (middle 1)))
(fail (check (middle 2)))


(run-schedule
      (repeat 9
            (saturate step-right)
            my-combination
            (saturate step-right)))

(check (left 10))
(check (right 10))
;; middle didn't get a chance to observe (left 10)
(check (middle 9))
(fail (check (middle 10)))
(fail (check (left 11)))
(fail (check (right 11)))