An op O is a function which takes one or more tables as argument and returns a table as result. A query Q is a list of ops (so Q is a function). Q is pure if it has no side-effects (materialize or willbe/link with materialize). An op is functional if the columns of the result table are a function of the columns of the argument table. Q is functional if every op in Q is functional. Here is the basic idea: if two queries Q and R are such that (0) they are both pure functional queries, and (1) they are extensionally equivalent (they produce the same result on the same arguments), and (2) (&/Q _lin R)&&/R _lin Q then they both normalize to the same query S. Normalization is a sorting algorithm which is sensitive to (1) dependency relations (2) sticky operations (g_, t_, and i_ functions) (3) cache-affecting operations (selection, sort, and link-with-selection) (4) fixed operations (base basetable table merge colord) The main function