The mini-kanren language features four conditional operators: conda
, conde
, condi
and condu
(described here). There are two mini-kanren libraries available for Racket that I am aware of (both described here). Neither of them implements condi
.
My impression (halfway through reading The Reasoned Schemer, which minikanren.org calls "The Book") is that condi
is important: it is the only conditional that takes the "fair disjunction" by interleaving branches, so you don't get stuck infinite-looping in a branch that never terminates when some other does terminate.
EDIT: I may have managed to implement condi
myself, here. In The Reasoned Schemer, conde
differs from condi
only in that the last two arguments to mplus
are flipped in mplusi
, so that's what I implemented. But it's not working any more fairly than conde
, from what I can tell.