Many rules, one relation

The full non-recursive reach used one rule for each number of stops. Each rule is its own expression; the relation is their union.

The one-stop rule is just line itself (the head keeps both columns, in order). Union it with the two-stop join:

reach := line ∪ π#1, #4( σ#2 = #3( line × line ) )
Several rules for one predicate always combine with . Each rule contributes its tuples, and the relation collects them all.