// later: transitive closure over mapped_follows() .decl later(later_l:label, earlier_l:label) later(l2, l1) :- mapped_follows(l2, l1). later(l3, l1) :- later(l3, l2), later(l2, l1). // earlier: this is a convenience wrapper .decl earlier(earlier_l:label, later_l:label) earlier(l1, l2) :- later(l2, l1). .decl equal_or_earlier(earlier_l:label, later_l:label) equal_or_earlier(l, l) :- mapped_follows(l, _). equal_or_earlier(l, l) :- mapped_follows(_, l). equal_or_earlier(l1, l2) :- earlier(l1, l2). .decl first(l:label) first(l) :- mapped_follows(_, l), !later(l, _). .decl last(l:label) last(l) :- mapped_follows(l, _), !earlier(l, _).