How does egglog handle boolean values?#
Some functions, like << return an optional int.
Others, like < return an optional unit.
How do these get translated into the type system of the language?
Are optional values automatically unwrapped?
It looks like we can use them as conditionals as well, like this (check (< 1 2)).
Let’s look at how check will be implemented in egglog:
The rule for parsing
checkinparse.lalrpopis:"(" "check" <Fact> ")" => Command::Check(<>)
The
Command::Checkcommand is handled inrun_commandto callcheck_fact.If the fact is an expression, it has to be a call which returns the
Unitsort.
Let’s see what happens if we call check on something that is not true:
from egglog.bindings import *
egraph = EGraph()
egraph.check_fact(Fact(
Call(
"<",
[Lit(Int(2)), Lit(Int(1))]
)
))
We get:
PanicException: prim was partial... do we allow this?
And what if we call check with a non-unit value?
from egglog.bindings import *
egraph = EGraph()
egraph.check_fact(Fact(
Call(
"+",
[Lit(Int(2)), Lit(Int(1))]
)
))
Yep, it fails on us:
Type mismatch: expr = (+ 2 1), expected = Unit, actual = i64, reason: mismatch
So there is not Bool type, there is only Option<Unit>. 🤷♀️
!= operator#
What about the != operator defined by the unit type?
It works on any two values which have the same sort, and returns a boolean.