Once encoded, tms can be sorted, just as words can be sorted, and we may ask whether the ith tm accepts the jth binary word.
Let l1 be the set of words wi that are accepted by tmi. Given a word wi, reverse engineer it to find its index i. If wi is written in binary, this is a straightforward process. The index of the empty word is 0. The index of 0 is 1 and the index of 1 is 2. The index of 00 is 3 and the index of 01 is 4, and so on. Next, generate one valid tm after another, until you find the ith tm. Finally, invoke the universal tm on tmi and wi. The entire procedure is re, hence l1 is re.
Let l2 be the complement of l1. This is a valid language. Suppose l2 is re. In particular, tmj accepts l2. It accepts wj iff it does not accept wj, which is a contradiction. Therefore l2 is not re. this language acts as the cornerstone of many important theorems.
Context sensitive lenguages come from context sensitive grammars, which can be generated in order. Let m1 crank out context sensitive grammars, and convert them into the corresponding bounded turing machines. We thus have a list of turing machines that accept context sensitive languages, and all the context sensitive languages are represented, often more than once.
Define a new language l as follows. Given a word wi, find its index i, generate the ith context sensitive grammar and the corresponding turing machine, see if tmi accepts wi, and return the opposite.
Suppose l is context sensitive. Some tmj on the list accepts l. It accepts wj iff it does not accept wj. This is a contradiction, hence l is not a context sensitive language.
Build a turing machine that accepts l. Find the index of the input word, generate the ith context sensitive grammar in lexicographical order, convert it to a tm, and run the tm on the input word. Since every tm on the list is recursive, the process terminates. In other words, l is a recursive language.
We have built a language that is recursive, and not context sensitive, demonstrating proper containment.