I wrote these for my own use, so they do have some real-world testing. A list relation is like a relational table, where each row is a list — confusingly, the code calls them “tuples”, though they’re not FSet tuples. It has a fixed arity: all rows in a relation must have length equal to that arity. There are some query operations that retrieve rows from the relation given patterns the rows must match.
A query registry can be used with one or more list relations of different arities to provide a simple trigger mechanism, to detect when rows about to be added to the database match any of a set of registered queries. Row patterns can be registered along with query objects; there is an operation to take a row and return the set of query objects associated with registered patterns that match the row.