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.