I'm drinking at the moment, so maybe messy but not sad.
The engine supports negation in the standard way: stratification. You can call 'from_antijoin' with a static relation for its second argument but not a variable. It is not discussed in the post because it is a bit of a diversion from the intended message (and because antijoin is computationally not much different from a filter).
If you would like a more general compute model with non-monotonic iteration, I recommend differential dataflow!