{"id":11,"date":"2016-01-25T19:35:36","date_gmt":"2016-01-25T19:35:36","guid":{"rendered":"http:\/\/143.198.247.44\/wordpress\/?p=11"},"modified":"2024-10-04T16:34:45","modified_gmt":"2024-10-04T16:34:45","slug":"skiing-with-y-iota-and-ackermann","status":"publish","type":"post","link":"https:\/\/www.type.sh\/index.php\/2016\/01\/25\/skiing-with-y-iota-and-ackermann\/","title":{"rendered":"SKIing with Y*, Iota and Ackermann"},"content":{"rendered":"<p>(Source code for this post is here: <a title=\"Source on GitHub\" href=\"https:\/\/github.com\/mikebern\/lambda_ski_iota\" target=\"_blank\" rel=\"noopener\">https:\/\/github.com\/mikebern\/lambda_ski_iota<\/a>\u00a0)<\/p>\n<p>There are only six atomic operations for Turing machines &#8211; read and write to the tape, move the tape left or right one square,\u00a0\u00a0change state based on the observed symbol and halt. Yet,\u00a0it&#8217;s not hard to see, at least at a high level, how a program in an imperative language such as C or Fortran would be translated to a program for a Turing machine &#8211; variables are cells on the tape, operations are modifications of those cells and control structures move the tape according to the specified conditions. \u00a0This connection becomes much less obvious for functional programming languages such as Lisp or Haskell, and indeed they are based on another computation paradigm &#8211; lambda calculus.<\/p>\n<p>Lambda calculus actually predated Turing machines. The first paper on the former was published in 1932, while on the latter in 1937. \u00a0It is deemed impossible to directly compare their computation powers, but Church-Turing <em>thesis<\/em>\u00a0postulates that they are able to compute exactly the same class of functions, called <em>computable functions<\/em>. \u00a0Both lambda calculus and Turing machines had inspired creation of high-level programming languages, the first being Fortran followed by Lisp with a gap between the two of less than a year.<\/p>\n<p>So the question arises &#8211; what is the &#8216;assembly language&#8217; for the functional languages? The answer is quite surprising &#8211; using only 3 <em>combinators<\/em>\u00a0&#8211; <strong>S<\/strong>, <strong>K<\/strong>, <strong>I<\/strong> we can express any lambda function. This system is called <a href=\"https:\/\/en.wikipedia.org\/wiki\/SKI_combinator_calculus\" target=\"_blank\" rel=\"noopener\">SKI-calculus<\/a>\u00a0. Sometimes it is written as <strong>SK(I)<\/strong> or to emphasize that\u00a0<strong>I<\/strong> can be easily expressed using <strong>S<\/strong> and <strong>K<\/strong> (<strong>I =(S K K)<\/strong>)<em>.<\/em> Can we do better than 2 combinators? \u00a0Yes! All three can be expressed with only one function called <em><a href=\"https:\/\/en.wikipedia.org\/wiki\/Combinatory_logic#One-point_basis\" target=\"_blank\" rel=\"noopener\"><strong>X<\/strong><\/a><\/em>! There are actually quite a few versions of <strong>X<\/strong>. The one that we use here has its own name &#8211; <em>Iota<\/em>  (see\u00a0<a href=\"https:\/\/en.wikipedia.org\/wiki\/Iota_and_Jot\" target=\"_blank\" rel=\"noopener\">Wikipedia<\/a>). For other versions see Fokker, <a href=\"http:\/\/www.type.sh\/wp-content\/uploads\/2016\/01\/FokkerX.pdf\" target=\"_blank\" rel=\"noopener\">The systematic construction of a one-combinator basis<\/a>, there is also Hankin <strong>X<\/strong> combinator, described in his book <a href=\"http:\/\/www.amazon.com\/Lambda-Calculi-Computer-Scientists-Graduate\/dp\/0198538405\" target=\"_blank\" rel=\"noopener\">Lambda Calculi, A Guide for Computer Scientists<\/a> on p. 61.<\/p>\n<p>It follows that all algorithms can be written using just\u00a0<strong>X<\/strong>\u00a0and parentheses. For instance,\u00a0<\/p>\n<details>\n<summary>Quick Sort in <strong>SKI<\/strong> calculus<\/summary>\n<p><span style=\"font-size: xx-small;\"><br \/>\n((S (K (S I I)) (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) I)) (K (S I I)))))) (K (K I)))) (S (K (S (S (S (K (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) I)) (K I))))) (K (K I)))) (S (K (S (K (S I (K (S (K K) I)))) I)) I)) (K (((S (S (K S) (S (K K) (S (K S) (S (K (S I)) (S (K K) I))))) (K (S (K K) I))) (S (K K) I)) (S (K K) I)))))) (S (S (K S) (S (K (S (K (S (K (S (S (K ((S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (K (S (K (S (K (S I I)) (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) I)) (K (S I I)))))) (K (K I))))))) (S (K (S (S (K S) (S (K K) (S (K S) (S (K (S (S (K (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) I)) (K I))))) (K (K I)))) (S (K (S (K (S I (K (S (K K) I)))) I)) I)))) (S (K K) I))))))) (S (K K) (S (S (K S) (S (K K) (S (K S) (S (S (K S) (S (K K) I)) (K (S (K (S (K (S I (K (S (K K) I)))) (S (K (S I (K (K I)))) I))) I)))))) (K (S (S (K S) (S (K K) I)) (K (S (K (S (K (S I (K (K I)))) (S (K (S I (K (K I)))) I))) I))))))))))) (K (K I))) (S (K (S (K ((S (S (K S) (S (K K) (S (K S) (S (K (S I)) (S (K K) I))))) (K (S (K K) I))) (K I))))) (S (S (K S) (S (K K) (S (K (S (S (K S) (S (K K) (S (K S) (S (K (S I)) (S (K K) I))))) (K (S (K K) I)))) I))) (K I))))) I))) (S (K K) I))))) (S (S (K S) (S (K K) I)) (K (S (S (K (S (S (K S) (S (K K) (S (K (S (K (S I I)) (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) I)) (K (S I I)))))) (K (K I))))) (S (K (S (K (S (S (S (K (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) I)) (K I))))) (K (K I)))) (S (K (S (K (S I (K (S (K K) I)))) I)) I)) (K (((S (S (K S) (S (K K) (S (K S) (S (K (S I)) (S (K K) I))))) (K (S (K K) I))) (S (K K) I)) (S (K K) I)))))))) (S (S (K S) (S (K (S (K S))) (S (S (K S) (S (K K) (S (K S) (S (K (S (K (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) I)) (K I))))) (K (K I)))))) (S (S (K S) (S (K K) I)) (K (S (K (S (K (S I (K (S (K K) I)))) (S (K (S I (K (K I)))) I))) I))))))) (K (S (K (S (S (K (S (K (S (K ((S (S (K S) (S (K K) (S (K S) (S (K (S I)) (S (K K) I))))) (K (S (K K) I))) (K I))))) (S (S (K S) (S (K K) (S (K (S (S (K S) (S (K K) (S (K S) (S (K (S I)) (S (K K) I))))) (K (S (K K) I)))) I))) (K I)))) (S (K (S (K (S I (K (S (K K) I)))) (S (K (S I (K (K I)))) I))) I)))) (S (S (K S) (S (K K) I)) (K (S (K (S (K (S I (K (K I)))) (S (K (S I (K (K I)))) I))) I)))))))) (K (S (S (K S) (S (K K) I)) (K (S (K (S (K (S I (K (K I)))) (S (K (S I (K (K I)))) I))) I))))))))) (K I))) (S (K (S (S (K (S (S (K S) (S (K (S (K (S (S (K S) (S (S (K S) (S (K K) I)) (K I))) (S (K K) I))))) (S (S (K S) (S (K K) (S (K (S (K (S (K (S (S I (K (K (K I)))) (K (S (K K) I)))))) (S (S (K S) (S (K K) (S (K (S (S (K S) (S (K (S (K S))) (S (K (S (K (S (K S))))) (S (K (S (K (S (K K))))) (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (K (S (S I (K (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) (S (K (S (S (K S) (S (K (S (K S))) (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) I)) (K (S (K (S (K (S I)))) (S (K (S (K K))) (S (K (S I)) (S (K K) I))))))))) (K (K (S (K K) I)))))) (K (K (K I))))) I))) (K I))))) (K (K I))))))) (S (K K) I))))) (K (K I))))))) (K (K (K I))))) I))) (K I)))) I))) (K I)))) (S (K (S (K (S (S I (K (K I))) (K (S (K K) I)))))) (S (K (S (S (K (S (S (K S) (S (K (S (K (S (S (K S) (S (S (K S) (S (K K) I)) (K I))) (S (K K) I))))) (S (S (K S) (S (K K) (S (K (S (K (S (K (S (S I (K (K (K I)))) (K (S (K K) I)))))) (S (S (K S) (S (K K) (S (K (S (S (K S) (S (K (S (K S))) (S (K (S (K (S (K S))))) (S (K (S (K (S (K K))))) (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (K (S (S I (K (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) (S (K (S (S (K S) (S (K (S (K S))) (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) I)) (K (S (K (S (K (S I)))) (S (K (S (K K))) (S (K (S I)) (S (K K) I))))))))) (K (K (S (K K) I)))))) (K (K (K I))))) I))) (K I))))) (K (K I))))))) (S (K K) I))))) (K (K I))))))) (K (K (K I))))) I))) (K I)))) I))) (K I)))) (S (K (S (S (K (S (K (S (K (S (S I (K (K (K I)))) (K (S (K K) I)))))) (S (S (K S) (S (K K) (S (K (S (S (K S) (S (K (S (K S))) (S (K (S (K (S (K S))))) (S (K (S (K (S (K K))))) (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (K (S (S I (K (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) (S (K (S (S (K S) (S (K (S (K S))) (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) I)) (K (S (K (S (K (S I)))) (S (K (S (K K))) (S (K (S I)) (S (K K) I))))))))) (K (K (S (K K) I)))))) (K (K (K I))))) I))) (K I))))) (K (K I))))))) (S (K K) I))))) (K (K I))))))) (K (K (K I))))) I))) (K I)))) I))) (S (K K) I)))) I))) (S (K K) I))))) I))) (S (K K) (S (K (S (K (S I (K (S (K K) I)))) (S (K (S I (K (K I)))) I))) I)))) I))))) (S (K (S (S (K (S (K (S (S (K ((S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (K (S (K (S (K (S I I)) (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) I)) (K (S I I)))))) (K (K I))))))) (S (K (S (S (K S) (S (K K) (S (K S) (S (K (S (S (K (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) I)) (K I))))) (K (K I)))) (S (K (S (K (S I (K (S (K K) I)))) I)) I)))) (S (K K) I))))))) (S (K K) (S (S (K S) (S (K K) (S (K S) (S (S (K S) (S (K K) I)) (K (S (K (S (K (S I (K (S (K K) I)))) (S (K (S I (K (K I)))) I))) I)))))) (K (S (S (K S) (S (K K) I)) (K (S (K (S (K (S I (K (K I)))) (S (K (S I (K (K I)))) I))) I))))))))))) (K (K I))) (S (K (S (K ((S (S (K S) (S (K K) (S (K S) (S (K (S I)) (S (K K) I))))) (K (S (K K) I))) (K I))))) (S (S (K S) (S (K K) (S (K (S (S (K S) (S (K K) (S (K S) (S (K (S I)) (S (K K) I))))) (K (S (K K) I)))) I))) (K I))))) I))) (S (K K) I))) (S (S (K (S (S (K S) (S (K K) (S (K (S (K (S I I)) (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) I)) (K (S I I)))))) (K (K I))))) (S (K (S (K (S (S (S (K (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) I)) (K I))))) (K (K I)))) (S (K (S (K (S I (K (S (K K) I)))) I)) I)) (K (((S (S (K S) (S (K K) (S (K S) (S (K (S I)) (S (K K) I))))) (K (S (K K) I))) (S (K K) I)) (S (K K) I)))))))) (S (S (K S) (S (K (S (K S))) (S (S (K S) (S (K K) (S (K S) (S (K (S (K (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) I)) (K I))))) (K (K I)))))) (S (S (K S) (S (K K) I)) (K (S (K (S (K (S I (K (S (K K) I)))) (S (K (S I (K (K I)))) I))) I))))))) (K (S (K (S (S (K (S (K (S (K ((S (S (K S) (S (K K) (S (K S) (S (K (S I)) (S (K K) I))))) (K (S (K K) I))) (K I))))) (S (S (K S) (S (K K) (S (K (S (S (K S) (S (K K) (S (K S) (S (K (S I)) (S (K K) I))))) (K (S (K K) I)))) I))) (K I)))) (S (K (S (K (S I (K (S (K K) I)))) (S (K (S I (K (K I)))) I))) I)))) (S (S (K S) (S (K K) I)) (K (S (K (S (K (S I (K (K I)))) (S (K (S I (K (K I)))) I))) I)))))))) (K (S (S (K S) (S (K K) I)) (K (S (K (S (K (S I (K (K I)))) (S (K (S I (K (K I)))) I))) I))))))))) (K I))) (S (K (S (S (K (S (S (K S) (S (K (S (K (S (S (K S) (S (S (K S) (S (K K) I)) (K I))) (S (K K) I))))) (S (S (K S) (S (K K) (S (K (S (K (S (K (S (S I (K (K (K I)))) (K (S (K K) I)))))) (S (S (K S) (S (K K) (S (K (S (S (K S) (S (K (S (K S))) (S (K (S (K (S (K S))))) (S (K (S (K (S (K K))))) (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (K (S (S I (K (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) (S (K (S (S (K S) (S (K (S (K S))) (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) I)) (K (S (K (S (K (S I)))) (S (K (S (K K))) (S (K (S I)) (S (K K) I))))))))) (K (K (S (K K) I)))))) (K (K (K I))))) I))) (K I))))) (K (K I))))))) (S (K K) I))))) (K (K I))))))) (K (K (K I))))) I))) (K I)))) I))) (K I)))) (S (K (S (S (K (S (K (S (K (S (S I (K (K (K I)))) (K (S (K K) I)))))) (S (S (K S) (S (K K) (S (K (S (S (K S) (S (K (S (K S))) (S (K (S (K (S (K S))))) (S (K (S (K (S (K K))))) (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (K (S (S I (K (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) (S (K (S (S (K S) (S (K (S (K S))) (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) I)) (K (S (K (S (K (S I)))) (S (K (S (K K))) (S (K (S I)) (S (K K) I))))))))) (K (K (S (K K) I)))))) (K (K (K I))))) I))) (K I))))) (K (K I))))))) (S (K K) I))))) (K (K I))))))) (K (K (K I))))) I))) (K I)))) I))) (S (K K) I)))) I))) (S (K K) (S (K (S (K (S I (K (S (K K) I)))) (S (K (S I (K (K I)))) I))) I)))) I)))) (S (S (K S) (S (K K) I)) (K (S (S (K (S (S (K S) (S (K K) (S (K (S (K (S I I)) (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) I)) (K (S I I)))))) (K (K I))))) (S (K (S (K (S (S (S (K (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) I)) (K I))))) (K (K I)))) (S (K (S (K (S I (K (S (K K) I)))) I)) I)) (K (((S (S (K S) (S (K K) (S (K S) (S (K (S I)) (S (K K) I))))) (K (S (K K) I))) (S (K K) I)) (S (K K) I)))))))) (S (S (K S) (S (K (S (K S))) (S (S (K S) (S (K K) (S (K S) (S (K (S (K (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) I)) (K I))))) (K (K I)))))) (S (S (K S) (S (K K) I)) (K (S (K (S (K (S I (K (S (K K) I)))) (S (K (S I (K (K I)))) I))) I))))))) (K (S (K (S (S (K (S (K (S (K ((S (S (K S) (S (K K) (S (K S) (S (K (S I)) (S (K K) I))))) (K (S (K K) I))) (K I))))) (S (S (K S) (S (K K) (S (K (S (S (K S) (S (K K) (S (K S) (S (K (S I)) (S (K K) I))))) (K (S (K K) I)))) I))) (K I)))) (S (K (S (K (S I (K (S (K K) I)))) (S (K (S I (K (K I)))) I))) I)))) (S (S (K S) (S (K K) I)) (K (S (K (S (K (S I (K (K I)))) (S (K (S I (K (K I)))) I))) I)))))))) (K (S (S (K S) (S (K K) I)) (K (S (K (S (K (S I (K (K I)))) (S (K (S I (K (K I)))) I))) I))))))))) (K I))) (S (S (K S) (S (K K) (S (K (S (S (K S) (S (K (S (K (S (S (K S) (S (S (K S) (S (K K) I)) (K I))) (S (K K) I))))) (S (S (K S) (S (K K) (S (K (S (K (S (K (S (S I (K (K (K I)))) (K (S (K K) I)))))) (S (S (K S) (S (K K) (S (K (S (S (K S) (S (K (S (K S))) (S (K (S (K (S (K S))))) (S (K (S (K (S (K K))))) (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (K (S (S I (K (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) (S (K (S (S (K S) (S (K (S (K S))) (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) I)) (K (S (K (S (K (S I)))) (S (K (S (K K))) (S (K (S I)) (S (K K) I))))))))) (K (K (S (K K) I)))))) (K (K (K I))))) I))) (K I))))) (K (K I))))))) (S (K K) I))))) (K (K I))))))) (K (K (K I))))) I))) (K I)))) I))) (K I)))) (S (K (S (K (S (S I (K (K I))) (K (S (K K) I)))))) (S (K (S (S (K (S (S (K S) (S (K (S (K (S (S (K S) (S (S (K S) (S (K K) I)) (K I))) (S (K K) I))))) (S (S (K S) (S (K K) (S (K (S (K (S (K (S (S I (K (K (K I)))) (K (S (K K) I)))))) (S (S (K S) (S (K K) (S (K (S (S (K S) (S (K (S (K S))) (S (K (S (K (S (K S))))) (S (K (S (K (S (K K))))) (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (K (S (S I (K (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) (S (K (S (S (K S) (S (K (S (K S))) (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) I)) (K (S (K (S (K (S I)))) (S (K (S (K K))) (S (K (S I)) (S (K K) I))))))))) (K (K (S (K K) I)))))) (K (K (K I))))) I))) (K I))))) (K (K I))))))) (S (K K) I))))) (K (K I))))))) (K (K (K I))))) I))) (K I)))) I))) (K I)))) (S (K (S (S (K (S (K (S (K (S (S I (K (K (K I)))) (K (S (K K) I)))))) (S (S (K S) (S (K K) (S (K (S (S (K S) (S (K (S (K S))) (S (K (S (K (S (K S))))) (S (K (S (K (S (K K))))) (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (K (S (S I (K (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) (S (K (S (S (K S) (S (K (S (K S))) (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) I)) (K (S (K (S (K (S I)))) (S (K (S (K K))) (S (K (S I)) (S (K K) I))))))))) (K (K (S (K K) I)))))) (K (K (K I))))) I))) (K I))))) (K (K I))))))) (S (K K) I))))) (K (K I))))))) (K (K (K I))))) I))) (K I)))) I))) (S (K K) I)))) I))) (S (K K) I))))) (S (K (S (K (S I (K (S (K K) I)))) (S (K (S I (K (K I)))) I))) I)))) (K I))) I)))))))<\/span><br \/>\n<\/details>\n<p>and<\/p>\n<details>\n<summary>Sieve of\u00a0Eratosthenes in <strong>X<\/strong> calculus<\/summary>\n<p><span style=\"font-size: xx-small;\"><br \/>\n(((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) (X X) (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))) ((X (X (X X))) ((X (X (X (X X)))) (X X) (X X))))))) ((X (X (X X))) ((X (X (X X))) (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))) ((X (X (X X))) (X X)))))) ((X (X (X X))) ((X (X (X X))) (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) (X X) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))))) (X X))) (X X))) ((X (X (X X))) ((((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X)))))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X)))))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X)))) ((X (X (X X))) (X X)))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X)))))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))))) (X X)))) ((X (X (X X))) (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) (X X) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) (X X) ((X (X (X X))) ((X (X (X X))) (X X))))) (X X)))) (X X))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) (X X) (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))) ((X (X (X X))) ((X (X (X (X X)))) (X X) (X X))))))) ((X (X (X X))) ((X (X (X X))) (X X)))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))) ((X (X (X X))) (X X)))))) ((X (X (X X))) ((X (X (X X))) (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) (X X) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))))) (X X))) (X X))) ((X (X (X X))) ((((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X)))))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))))))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))) ((X (X (X X))) (X X)))))) ((X (X (X X))) ((X (X (X X))) (X X))))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) (X X) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) (X X) ((X (X (X X))) ((X (X (X X))) (X X))))) (X X)))) (X X)))))))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X)))))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X)))) ((X (X (X X))) (X X)))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X)))))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))))) (X X)))) ((X (X (X X))) (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) (X X) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) (X X) ((X (X (X X))) ((X (X (X X))) (X X))))) (X X)))) (X X))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) (X X) ((X (X (X X))) ((X (X (X X))) (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) (X X) ((X (X (X X))) ((X (X (X X))) (X X))))) (X X)))) (X X))))))))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) (X X) ((X (X (X X))) ((X (X (X X))) (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) (X X) ((X (X (X X))) ((X (X (X X))) (X X))))) (X X)))) (X X)))))))))) ((X (X (X X))) (X X)))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) (X X) ((X (X (X X))) ((X (X (X X))) (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))) ((X (X (X X))) (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X)))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) (X X) ((X (X (X X))) ((X (X (X X))) ((X (X (X X))) (X X))))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) (X X) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X)))))))))) ((X (X (X X))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))))))) ((X (X (X X))) ((X (X (X X))) ((X (X (X X))) (X X)))))) (X X)))) ((X (X (X X))) (X X)))))) ((X (X (X X))) ((X (X (X X))) (X X)))))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X)))))) ((X (X (X X))) ((X (X (X X))) (X X)))))))) ((X (X (X X))) ((X (X (X X))) ((X (X (X X))) (X X)))))) (X X)))) ((X (X (X X))) (X X))))) (X X)))) ((X (X (X X))) (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) (X X) ((X (X (X X))) ((X (X (X X))) ((X (X (X X))) (X X))))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) (X X) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X)))))))))) ((X (X (X X))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))))))) ((X (X (X X))) ((X (X (X X))) ((X (X (X X))) (X X)))))) (X X)))) ((X (X (X X))) (X X)))))) ((X (X (X X))) ((X (X (X X))) (X X)))))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X)))))) ((X (X (X X))) ((X (X (X X))) (X X)))))))) ((X (X (X X))) ((X (X (X X))) ((X (X (X X))) (X X)))))) (X X)))) ((X (X (X X))) (X X))))) (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X)))) ((X (X (X X))) (X X)))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) (X X) (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))) ((X (X (X X))) ((X (X (X (X X)))) (X X) (X X))))))) ((X (X (X X))) ((X (X (X X))) (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))) ((X (X (X X))) (X X)))))) ((X (X (X X))) ((X (X (X X))) (X X))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))) ((X (X (X X))) (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X)))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) (X X) ((X (X (X X))) ((X (X (X X))) ((X (X (X X))) (X X))))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) (X X) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X)))))))))) ((X (X (X X))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))))))) ((X (X (X X))) ((X (X (X X))) ((X (X (X X))) (X X)))))) (X X)))) ((X (X (X X))) (X X)))))) ((X (X (X X))) ((X (X (X X))) (X X)))))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X)))))) ((X (X (X X))) ((X (X (X X))) (X X)))))))) ((X (X (X X))) ((X (X (X X))) ((X (X (X X))) (X X)))))) (X X)))) ((X (X (X X))) (X X))))) (X X)))) ((X (X (X X))) (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) (X X) ((X (X (X X))) ((X (X (X X))) (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))) ((X (X (X X))) (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X)))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) (X X) ((X (X (X X))) ((X (X (X X))) ((X (X (X X))) (X X))))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) (X X) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X)))))))))) ((X (X (X X))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))))))) ((X (X (X X))) ((X (X (X X))) ((X (X (X X))) (X X)))))) (X X)))) ((X (X (X X))) (X X)))))) ((X (X (X X))) ((X (X (X X))) (X X)))))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X)))))) ((X (X (X X))) ((X (X (X X))) (X X)))))))) ((X (X (X X))) ((X (X (X X))) ((X (X (X X))) (X X)))))) (X X)))) ((X (X (X X))) (X X))))) (X X)))) ((X (X (X X))) (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) (X X) ((X (X (X X))) ((X (X (X X))) ((X (X (X X))) (X X))))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) (X X) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X)))))))))) ((X (X (X X))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))))))) ((X (X (X X))) ((X (X (X X))) ((X (X (X X))) (X X)))))) (X X)))) ((X (X (X X))) (X X)))))) ((X (X (X X))) ((X (X (X X))) (X X)))))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X)))))) ((X (X (X X))) ((X (X (X X))) (X X)))))))) ((X (X (X X))) ((X (X (X X))) ((X (X (X X))) (X X)))))) (X X)))) ((X (X (X X))) (X X))))) (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))))) (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X)))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) (X X) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) (X X) ((X (X (X X))) ((X (X (X X))) (X X))))) (X X)))) (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) (X X) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) (X X) ((X (X (X X))) ((X (X (X X))) (X X))))) (X X)))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) (X X) ((X (X (X X))) ((X (X (X X))) (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) (X X) ((X (X (X X))) ((X (X (X X))) (X X))))) (X X)))) (X X)))) (X X)))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) (X X) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) (X X) ((X (X (X X))) ((X (X (X X))) (X X))))) (X X)))) (X X))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X)))))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X)))) ((X (X (X X))) (X X)))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X)))))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))))) (X X)))) ((X (X (X X))) (X X))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) (X X) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X)))))))))) ((X (X (X X))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))))))) ((X (X (X X))) ((X (X (X X))) ((X (X (X X))) (X X)))))) (X X)))) ((X (X (X X))) (X X)))))) ((X (X (X X))) ((X (X (X X))) (X X)))))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X)))))) ((X (X (X X))) ((X (X (X X))) (X X)))))))) ((X (X (X X))) ((X (X (X X))) ((X (X (X X))) (X X)))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) (X X) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) (X X) ((X (X (X X))) ((X (X (X X))) (X X))))) (X X)))) (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) (X X) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) (X X) ((X (X (X X))) ((X (X (X X))) (X X))))) (X X)))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) (X X) ((X (X (X X))) ((X (X (X X))) (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) (X X) ((X (X (X X))) ((X (X (X X))) (X X))))) (X X)))) (X X)))) (X X)))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X)))))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X)))) ((X (X (X X))) (X X)))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X)))))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))))) (X X)))) ((X (X (X X))) (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) (X X) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) (X X) ((X (X (X X))) ((X (X (X X))) (X X))))) (X X)))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) (X X) ((X (X (X X))) ((X (X (X X))) (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) (X X) ((X (X (X X))) ((X (X (X X))) (X X))))) (X X)))) (X X)))) (X X))) ((X (X (X X))) ((((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X)))))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))))))))))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X)))))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X)))) ((X (X (X X))) (X X)))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X)))))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))))) (X X)))) ((X (X (X X))) (X X))))) (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X)))))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X)))) ((X (X (X X))) (X X)))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X)))))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))))) (X X)))) ((X (X (X X))) (X X))))) (X X)) ((X (X (X X))) ((((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X)))))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))))))))) (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) (X X) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) (X X) ((X (X (X X))) ((X (X (X X))) (X X))))) (X X)))) (X X))))))) (X X)))))))<br \/>\n<\/span><br \/>\n<\/details>\n<p>The focus of this post is to introduce\u00a0a tool (written in Clojure) that lets you play with <strong>SKI<\/strong> and <strong>X<\/strong> encodings. The inspiration for me to write this entry was this post <a href=\"http:\/\/habrahabr.ru\/post\/258825\/\" target=\"_blank\" rel=\"noopener\">\u03bb-\u0438\u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0438 LISP<\/a> (in Russian), which showed how to encode Boolean logic, Church numerals and arithmetic operations on them, <strong>Y<\/strong> combinator and a few very common functions such as <em>map<\/em>, <em>reduce<\/em> and <em>filter<\/em> in pure lambda calculus. The translator then can translate all these functions and the functions that use them\u00a0into\u00a0<strong>SKI<\/strong>\u00a0and\u00a0<strong>X<\/strong>\u00a0 expressions.<\/p>\n<p>The main challenges to overcome were dealing with the variable arity of lambda functions, which is not straightforward\u00a0to deal with in Clojure, and more importantly making Clojure &#8220;lazier&#8221; to make sure that we can implement <strong>Y<\/strong>\u00a0combinator and the functions that are using it. It was also interesting to implement a lesser known variant \u00a0of <strong>Y<\/strong> combinator for mutually recursive functions, called <strong>Y*<\/strong> and obtain its translation. Finally, it was interesting to implement <em>map<\/em> and <em>filter<\/em> by just using <em>reduce<\/em> (<em>fold<\/em>) functions. While not terribly surprising, it means that we only need <strong>Y<\/strong> combinator for <em>fold<\/em> &#8211; <em>map<\/em> and <em>filter<\/em> can use <strong>Y<\/strong> indirectly by relying on <em>fold<\/em> in their implementation.<\/p>\n<p>Why do we need our own numbers, arithmetic and logic operations? We cannot use any build-in numbers or arithmetic operators because we want everything to be expressed using just combinators. One of the possibilities is to use <a href=\"https:\/\/en.wikipedia.org\/wiki\/Church_encoding\" target=\"_blank\" rel=\"noopener\">Church encoding<\/a>, which is what we are using\u00a0in this post.\u00a0For example, \u00a0the expression 7*7-7 has this representation in <strong>SKI<\/strong>:<br \/>\n<span style=\"font-size: xx-small;\">(((S (S (K S) (S (K (S (K S))) (S (K (S (K (S (K S))))) (S (K (S (K (S (K K))))) (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (K (S (S I (K (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) (S (K (S (S (K S) (S (K (S (K S))) (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) I)) (K (S (K (S (K (S I)))) (S (K (S (K K))) (S (K (S I)) (S (K K) I))))))))) (K (K (S (K K) I)))))) (K (K (K I))))) I))) (K I))))) (K (K I))))))) (S (K K) I))))) (K (K I))))))) (K (K (K I)))) (((S (S (K S) (S (K (S (K S))) (S (K (S (K (S (K S))))) (S (K (S (K (S (K K))))) (S (S (K S) (S (K K) (S (K S) (S (K K) I)))) (K (S (S (K S) (S (K K) I)) (K I)))))))) (K (K (K I)))) ((S (K (S (S (K S) (S (K K) I)))) (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) I)) (K I))))) (K (K I)))) ((S (K (S (S (K S) (S (K K) I)))) (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) I)) (K I))))) (K (K I)))) ((S (K (S (S (K S) (S (K K) I)))) (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) I)) (K I))))) (K (K I)))) ((S (K (S (S (K S) (S (K K) I)))) (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) I)) (K I))))) (K (K I)))) ((S (K (S (S (K S) (S (K K) I)))) (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) I)) (K I))))) (K (K I)))) ((S (K (S (S (K S) (S (K K) I)))) (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) I)) (K I))))) (K (K I)))) ((S (K (S (S (K S) (S (K K) I)))) (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) I)) (K I))))) (K (K I)))) (K I))))))))) ((S (K (S (S (K S) (S (K K) I)))) (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) I)) (K I))))) (K (K I)))) ((S (K (S (S (K S) (S (K K) I)))) (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) I)) (K I))))) (K (K I)))) ((S (K (S (S (K S) (S (K K) I)))) (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) I)) (K I))))) (K (K I)))) ((S (K (S (S (K S) (S (K K) I)))) (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) I)) (K I))))) (K (K I)))) ((S (K (S (S (K S) (S (K K) I)))) (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) I)) (K I))))) (K (K I)))) ((S (K (S (S (K S) (S (K K) I)))) (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) I)) (K I))))) (K (K I)))) ((S (K (S (S (K S) (S (K K) I)))) (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) I)) (K I))))) (K (K I)))) (K I)))))))))) ((S (K (S (S (K S) (S (K K) I)))) (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) I)) (K I))))) (K (K I)))) ((S (K (S (S (K S) (S (K K) I)))) (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) I)) (K I))))) (K (K I)))) ((S (K (S (S (K S) (S (K K) I)))) (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) I)) (K I))))) (K (K I)))) ((S (K (S (S (K S) (S (K K) I)))) (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) I)) (K I))))) (K (K I)))) ((S (K (S (S (K S) (S (K K) I)))) (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) I)) (K I))))) (K (K I)))) ((S (K (S (S (K S) (S (K K) I)))) (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) I)) (K I))))) (K (K I)))) ((S (K (S (S (K S) (S (K K) I)))) (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) I)) (K I))))) (K (K I)))) (K I)))))))))<\/span><\/p>\n<p>The\u00a0<strong>X<\/strong>\u00a0version\u00a0of the same is lengthier:\u00a0<\/p>\n<details>\n<summary>42 in <strong>X<\/strong><\/summary>\n<p><span style=\"font-size: xx-small;\"><br \/>\n((((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) (X X) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X)))))))))) ((X (X (X X))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))))))) ((X (X (X X))) ((X (X (X X))) ((X (X (X X))) (X X)))))) (X X)))) ((X (X (X X))) (X X)))))) ((X (X (X X))) ((X (X (X X))) (X X)))))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X)))))) ((X (X (X X))) ((X (X (X X))) (X X)))))))) ((X (X (X X))) ((X (X (X X))) ((X (X (X X))) (X X))))) ((((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))) ((X (X (X X))) (X X))))))))) ((X (X (X X))) ((X (X (X X))) ((X (X (X X))) (X X))))) (((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))) ((X (X (X X))) (X X)))))) ((X (X (X X))) ((X (X (X X))) (X X))))) (((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))) ((X (X (X X))) (X X)))))) ((X (X (X X))) ((X (X (X X))) (X X))))) (((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))) ((X (X (X X))) (X X)))))) ((X (X (X X))) ((X (X (X X))) (X X))))) (((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))) ((X (X (X X))) (X X)))))) ((X (X (X X))) ((X (X (X X))) (X X))))) (((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))) ((X (X (X X))) (X X)))))) ((X (X (X X))) ((X (X (X X))) (X X))))) (((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))) ((X (X (X X))) (X X)))))) ((X (X (X X))) ((X (X (X X))) (X X))))) (((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))) ((X (X (X X))) (X X)))))) ((X (X (X X))) ((X (X (X X))) (X X))))) ((X (X (X X))) (X X)))))))))) (((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))) ((X (X (X X))) (X X)))))) ((X (X (X X))) ((X (X (X X))) (X X))))) (((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))) ((X (X (X X))) (X X)))))) ((X (X (X X))) ((X (X (X X))) (X X))))) (((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))) ((X (X (X X))) (X X)))))) ((X (X (X X))) ((X (X (X X))) (X X))))) (((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))) ((X (X (X X))) (X X)))))) ((X (X (X X))) ((X (X (X X))) (X X))))) (((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))) ((X (X (X X))) (X X)))))) ((X (X (X X))) ((X (X (X X))) (X X))))) (((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))) ((X (X (X X))) (X X)))))) ((X (X (X X))) ((X (X (X X))) (X X))))) (((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))) ((X (X (X X))) (X X)))))) ((X (X (X X))) ((X (X (X X))) (X X))))) ((X (X (X X))) (X X))))))))))) (((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))) ((X (X (X X))) (X X)))))) ((X (X (X X))) ((X (X (X X))) (X X))))) (((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))) ((X (X (X X))) (X X)))))) ((X (X (X X))) ((X (X (X X))) (X X))))) (((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))) ((X (X (X X))) (X X)))))) ((X (X (X X))) ((X (X (X X))) (X X))))) (((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))) ((X (X (X X))) (X X)))))) ((X (X (X X))) ((X (X (X X))) (X X))))) (((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))) ((X (X (X X))) (X X)))))) ((X (X (X X))) ((X (X (X X))) (X X))))) (((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))) ((X (X (X X))) (X X)))))) ((X (X (X X))) ((X (X (X X))) (X X))))) (((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))))) ((X (X (X (X X)))) ((X (X (X X))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))))) ((X (X (X (X X)))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X (X X))))) ((X (X (X (X X)))) ((X (X (X X))) (X (X (X X)))) (X X))) ((X (X (X X))) (X X)))))) ((X (X (X X))) ((X (X (X X))) (X X))))) ((X (X (X X))) (X X))))))))))<\/span><br \/>\n<\/details>\n<p>\u00a0As you can see the representations are very verbose, partly by the nature of encodings, partly by the fact that no optimizations were done in the translator. The code above is actually a valid Clojure code, and can be executed. Below I describe the necessary scaffolding to make that happen.<\/p>\n<h3>Project layout<\/h3>\n<p>This is a <a href=\"http:\/\/leiningen.org\/\" target=\"_blank\" rel=\"noopener\">leiningen<\/a> project consisting of four source files and a couple of test files. The source files are listed below in order of\u00a0dependencies\u00a0between them.<\/p>\n<ol>\n<li><em>combinator_definitions.clj<\/em> &#8211; contains definitions of all combinators and supporting functions.<\/li>\n<li><em>lambda_to_ski_translator.clj<\/em> &#8211; this file contains the source code for the translator.<\/li>\n<li><em>ski_encoding.clj<\/em> &#8211; contains definitions of functions and their translations to <strong>SKI<\/strong> calculus.<\/li>\n<li><em>iota_encoding.clj<\/em> &#8211; contains code to translate from <strong>SKI<\/strong> calculus to <strong>X<\/strong>\u00a0and also contains a few examples.<\/li>\n<\/ol>\n<p>Executing <em>iota_encoding.clj<\/em> will pull dependencies and execute the code from all other source files. The code was developed in <a href=\"http:\/\/lighttable.com\/\" target=\"_blank\" rel=\"noopener\">LightTable<\/a>.<\/p>\n<p>I wanted to write\u00a0a simple self-contained system, which is easy to understand and modify, so translations produced are far from optimal, but the code is quite compact and follows from the first principles. There are other related\u00a0projects, notably, <a href=\"https:\/\/github.com\/thomcc\/unlambda-clj\" target=\"_blank\" rel=\"noopener\">unlambda<\/a>, <a href=\"https:\/\/github.com\/msullivan\/LazyK\" target=\"_blank\" rel=\"noopener\">LazyK<\/a>, and <a href=\"https:\/\/hackage.haskell.org\/package\/pointfree\" target=\"_blank\" rel=\"noopener\">pointfree<\/a> package of Haskell (used by the <a href=\"https:\/\/wiki.haskell.org\/Lambdabot\" target=\"_blank\" rel=\"noopener\">LamdaBot<\/a>).<\/p>\n<h3>Working with Variadic Functions<\/h3>\n<p>First, we need to get around the fact that a function application in Clojure would throw an <em>ArityException<\/em> if we don&#8217;t supply the exact number of arguments that the function expects:<\/p>\n<pre class=\"brush: clojure; title: ; notranslate\" title=\"\">\r\n(defn fun1 &#x5B;x] x)\r\n(fun1) ; throws ArityException - too few parameters\r\n(fun1 fun1 fun1) ; throws ArityException - too many parameters\r\n<\/pre>\n<p>In contrast,\u00a0<em><strong>\u03bbx.x<\/strong><\/em> and <em><strong>(\u03bbx.x) (\u03bby.y) (\u03bbz.z)<\/strong><\/em>\u00a0are both well-formed lambda expressions and evaluate to <em><strong>\u03bbx.x<\/strong><\/em> and <em><strong>\u03bbz.z<\/strong><\/em> respectively. The first expression expects one argument, but gets none, while in the second expression,\u00a0<em><strong>(\u03bbx.x)\u00a0<\/strong><\/em>expects one argument but gets two &#8211;\u00a0<em><strong>(\u03bby.y)<\/strong><\/em> and\u00a0<em><strong>(\u03bbz.z)<\/strong><\/em>\u00a0(so it consumes the first one, returns a function, which, in turn, consumes the the second argument, returning another function).<\/p>\n<p>To resolve this difficulty we will use <em>variadize<\/em>\u00a0function defined in <em>combinator_definitions.clj<\/em>. Below is given the strict variant of this function &#8211; it works well for arithmetics and boolean logic but is not &#8220;lazy enough&#8221; to work for\u00a0<strong>Y<\/strong> and <strong>Y*<\/strong> combinators. Modifications to cover these fixed-point combinators are given below.<\/p>\n<pre class=\"brush: clojure; title: ; notranslate\" title=\"\">\r\n(defn variadize-strict\r\n  (&#x5B;fnct] (variadize-strict fnct (arg-count fnct)))\r\n  (&#x5B;fnct num-args]\r\n   (if (zero?  num-args) (fnct)\r\n       (fn &#x5B;&amp; args]\r\n         (cond\r\n           (&gt; (count args) num-args) (apply (apply fnct (take num-args args)) (drop num-args args))\r\n           (= (count args) num-args) (apply fnct args)\r\n           :else (variadize-strict (reduce partial fnct args) (- num-args (count args))))))))<\/pre>\n<p>The function takes the function to be &#8220;variadized&#8221; and the number of arguments it expects. If that number is not provided, it&#8217;s determined using Java reflection by <em>arg-count<\/em> function. The function returned by <em>variadize-strict<\/em> keeps track of the argument it had been supplied with at the moment of the call. If this number is less than the expected number, we use partial application (curring), it it&#8217;s exactly the expected number then we simply apply the <em>variadized-strict<\/em>\u00a0to the arguments, and if there more arguments than the function is expecting, then we apply the function to the number of arguments it expects and the remaining arguments are supplied to the result of the that application. Please see unit-tests in <em>combinator_definitions_test.clj<\/em> \u00a0for examples.<\/p>\n<p>Since we have only four basic combinators that we are working with &#8211; <strong>S<\/strong>, <strong>K<\/strong>, <strong>I<\/strong>, and <strong>X<\/strong>, it&#8217;s straightforward to variadize all of them. For instance, here is how we are defining\u00a0<strong>S<\/strong>:<\/p>\n<pre class=\"brush: clojure; title: ; notranslate\" title=\"\">\r\n(defn S-def &#x5B;f g x] (f x (g x))) (def S (variadize S-def))\r\n<\/pre>\n<p>Note that implementation of the same functionality just by using multi-arity and variadic functions in Clojure is not straightforward, and will likely to result in more convoluted code.<\/p>\n<h3>A note on SKI combinatorial calculus<\/h3>\n<p>Here are definitions of <strong>S<\/strong>, <strong>K<\/strong>, and <strong>I<\/strong> (see <a href=\"https:\/\/en.wikipedia.org\/wiki\/SKI_combinator_calculus\" target=\"_blank\" rel=\"noopener\">SKI combinator calculus<\/a>):<\/p>\n<ul>\n<li><strong>I<\/strong> x = x<\/li>\n<li><strong>K<\/strong> x y = x<\/li>\n<li><strong>S<\/strong> x y z = x z (y z)<\/li>\n<\/ul>\n<p>When I looked at the definitions for the first time they didn&#8217;t make much sense to me &#8211; why these arbitrary functions were chosen as a basis, and why is it complete? In fact, choosing these functions for the basis makes a perfect sense and it can be shown by just a couple of examples. <strong>S<\/strong> is the most complicated one, so let&#8217;s start with it. This combinator captures the case of &#8216;function application&#8217; &#8211; when we apply a function <em>x<\/em> to its single argument <em>y<\/em>, and, in addition, both <em>x<\/em> and <em>y<\/em> depend on the same value <em>z<\/em>. We don&#8217;t have to worry about applying a function to several arguments because that can be taken care of by currying.<\/p>\n<p>Consider (a bit contrived) example of a function that doubles it&#8217;s argument: \u00a0<em><strong>\u03bbz.<\/strong><\/em>(<em><strong>\u03bbv. sum\u00a0<em><strong>z\u00a0<em><strong>v) (<em><strong>\u03bby.y\u00a0<\/strong><\/em>z)<\/strong><\/em><\/strong><\/em><\/strong><\/em>\u00a0: \u00a0<em>z<\/em> is the argument to be doubled and <em>sum<\/em> is a function that just adds its\u00a0two arguments. \u00a0Can we use <strong>S<\/strong> to express this function? Yes, it&#8217;s quite trivial &#8211; <em>x<\/em> (in the definition of <strong>S<\/strong>) is (<em><strong>\u03bbv. sum\u00a0<em><strong>z\u00a0<em><strong>v)<\/strong><\/em><\/strong><\/em><\/strong><\/em>, \u00a0y is\u00a0<em><strong><em><strong><em><strong>(<em><strong>\u03bby.y\u00a0<\/strong><\/em>z)<\/strong><\/em><\/strong><\/em><\/strong><\/em>, which obviously evaluates to <em>z<\/em>\u00a0(it&#8217;s in this overcomplicated form just to illustrate the point that both <em>x<\/em> and <em>y<\/em> depend on <em>z<\/em>)<em>,<\/em>\u00a0and <em>z<\/em> is <strong>z<\/strong>. Temporarily adding <em>sum<\/em> to our set of basic combinators, we see that our function is translated to <strong><em>(S sum I)<\/em><\/strong>:<\/p>\n<pre class=\"brush: clojure; title: ; notranslate\" title=\"\">\r\n(defn sum-def &#x5B;x y] (+ (get-val x) (get-val y)))\r\n(def sum (variadize sum-def))\r\n(def SKI-Double (S sum I))\r\n((SKI-Double 10)) ; 20\r\n<\/pre>\n<p>The purpose of\u00a0<em>variadize<\/em> was explained above, ignore for the moment <em>get-val<\/em> and the extra pair of parentheses in the last line (they will be explained later). The last line outputs the expected result &#8211; &#8217;20&#8217;.<\/p>\n<p>Let&#8217;s use the translator on the same function:<\/p>\n<pre class=\"brush: clojure; title: ; notranslate\" title=\"\">\r\n(translate-lambda-to-ski &#039;SKI-Double-Translated (template (fn &#x5B;z#] ((fn &#x5B;v#] (sum z# v#)) ((fn &#x5B;y#] y#) z#)))))\r\n((SKI-Double-Translated 10)) ; apply translated function to 10\r\n(get @ski-translations &#039;SKI-Double-Translated) ; extract SKI-expression\r\n(((S (S (S (K S) (S (K K) (S (K sum) I))) (K I)) (S (K I) I)) 10)); apply SKI-expression to 10\r\n<\/pre>\n<p>Function <em>translate-lambda-to-ski<\/em> from <em>lambda_to_ski_translator.clj<\/em> translates the given lambda function to <strong>SKI<\/strong>-calculus and instantiates the translation under the name given as the first parameter, in this case <em>SKI-Double-Translated<\/em>.<\/p>\n<p>To see the actual translation, we can use <em>get<\/em> on <em>ski-translations <\/em>atom, and we can actually run it directly to get the same result. Note though, that translator produces an expression that is larger than the optimal one, which we obtained before.<\/p>\n<p>Let&#8217;s see why do we need <strong>K<\/strong>. Suppose now that function <em>x<\/em> does not depend on <em>z<\/em>, and only <em>y<\/em> depends on <em>z<\/em>. For instance, instead of <em>sum<\/em> we now use <em>add5<\/em> &#8211; a function that adds &#8216;5&#8217; to its argument:<\/p>\n<pre class=\"brush: clojure; title: ; notranslate\" title=\"\">\r\n(defn add5-def &#x5B;x] (sum 5 (get-val x)))\r\n(def add5 (variadize add5-def))\r\n(def SKI-Add5 (S (K add5) I))\r\n((SKI-Add5 10)) ; 15\r\n<\/pre>\n<p>Now <em>add5<\/em> does not need <em>z<\/em> &#8211; so we need to discard it, and <strong>K<\/strong> does it for us as shown. We can also apply our translator again and get a longer translation, but with the same result:<\/p>\n<pre class=\"brush: clojure; title: ; notranslate\" title=\"\">\r\n(translate-lambda-to-ski &#039;SKI-Add5-Translated (template (fn &#x5B;z#] ((fn &#x5B;v#] (add5 v#)) ((fn &#x5B;y#] y# ) z#)))))\r\n((SKI-Add5-Translated 10))\r\n(get @ski-translations &#039;SKI-Add5-Translated)\r\n(((S (K (S (K add5) I)) (S (K I) I)) 10)) ; 15\r\n<\/pre>\n<h3>SKI Translator<\/h3>\n<p>Our translator follows the simple rules given in <a href=\"https:\/\/en.wikipedia.org\/wiki\/Combinatory_logic#Completeness_of_the_S-K_basis\" target=\"_blank\" rel=\"noopener\">Wikipedia<\/a>. Its source code is in <em>lambda_to_ski_translator.clj<\/em> and comments there explain how it works.<\/p>\n<p>Here is another example of how to use \u00a0translator:<\/p>\n<pre class=\"brush: clojure; title: ; notranslate\" title=\"\">\r\n; One of possible implementations of &#039;Minus&#039; in SKI calculus\r\n(translate-lambda-to-ski &#039;SKI-Minus2 (template (fn &#x5B;m# n#] ((n# SKI-Pred) m#))))\r\n<\/pre>\n<p>It produces output:<\/p>\n<pre class=\"brush: clojure; title: ; notranslate\" title=\"\">\r\n(S (K (S (S I (K (S (S (K S) (S (K (S (K S))) (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) I)) (K (S (K (S (K (S I)))) (S (K (S (K K))) (S (K (S I)) (S (K K) I))))))))) (K (K (S (K K) I)))))) (K (K (K I)))))))) (S (K K) I))\r\n<\/pre>\n<p>And &#8216;def&#8217;s this expression under name <em>Ski-Minus2<\/em>, so we can call it like this:<\/p>\n<pre class=\"brush: clojure; title: ; notranslate\" title=\"\">\r\n; 5 - 3\r\n(to-int (SKI-Minus2 SKI-Five SKI-Three))\r\n<\/pre>\n<p>There are many more examples with the translator in <em>ski_encoding.clj<\/em>.<\/p>\n<p>A few implementation notes:<\/p>\n<ul>\n<li>The name (<em>SKI-Minus2<\/em>) has to start with the prefix &#8216;SKI-&#8216;, this is because X translator will later take &#8216;SKI-Minus2&#8217; translation and will generate <em>X-Minus2<\/em> function that only uses <strong>X<\/strong> combinator. \u00a0Translation to <strong>X<\/strong> versions will be done for all functions stored in <em>ski-translations<\/em> atom.<\/li>\n<li>Before translation <em>translate-lambda-to-ski<\/em> will expand all previously translated functions to their definitions (recursively). In our example, <em>SKI-Pred<\/em> will be replaced by its (source) definition. You can see the definition to be translated by running:\n<pre class=\"brush: clojure; title: ; notranslate\" title=\"\">\r\n(get @expanded-sources &#039;SKI-Minus2)\r\n<\/pre>\n<\/li>\n<li>It also stores the source of the function (as given) in the atom <em>sources<\/em> and the translation in the atom <em>ski-translations<\/em>:\n<pre class=\"brush: clojure; title: ; notranslate\" title=\"\">\r\n(get @sources &#039;SKI-Minus2)\r\n(get @ski-translations &#039;SKI-Minus2)\r\n<\/pre>\n<\/li>\n<li><em>template<\/em> keyword is defined in <em>backtick<\/em> library. Its effect is similar to &#8216; but in addition it also supports gensym. This is essential for the translator &#8211; when we are expanding of names, we want to make sure that there are no variable name collisions &#8211; the translator does not handle variable shading. For the same reason, it is also required that the variable names are not reused in the function definition, but that is fairly easy to ensure. For instance, the definition \u00a0(fn [x#] \u00a0((fn [x#] x#) x#) should be changed\u00a0to\u00a0(fn [x#] \u00a0((fn [y#] y#) x#) .<\/li>\n<\/ul>\n<h3>Church encoding<\/h3>\n<p>In order to use only <strong>S<\/strong>, <strong>K<\/strong>, <strong>I<\/strong> and <strong>X<\/strong> combinators our system should be self-contained &#8211; we cannot use Clojure\u00a0numbers or lists as they obviously cannot be represented in terms of the combinators. So we use <a href=\"https:\/\/en.wikipedia.org\/wiki\/Church_encoding\" target=\"_blank\" rel=\"noopener\">Church encoding<\/a>\u00a0to introduce our own booleans, numbers, lists and functions on them &#8211; all defined as\u00a0functions in lambda calculus and then translated to <strong>SKI<\/strong> and <strong>X<\/strong> encodings. The implementation contains a subset of arithmetic and Boolean functions and only supports natural numbers. For lists, we use <a href=\"https:\/\/en.wikipedia.org\/wiki\/Church_encoding#Two_pairs_as_a_list_node\" target=\"_blank\" rel=\"noopener\">&#8220;Two pairs as a list node&#8221;<\/a>.<\/p>\n<p>To extract the values from the Church primitives use:<\/p>\n<ul>\n<li>for booleans:\n<pre class=\"brush: clojure; title: ; notranslate\" title=\"\">\r\n(to-bool (SKI-Or SKI-True SKI-False)) ; true\r\n<\/pre>\n<\/li>\n<li>for numbers:\n<pre class=\"brush: clojure; title: ; notranslate\" title=\"\">\r\n(to-int (SKI-Minus SKI-Two SKI-Two)) ; 0\r\n<\/pre>\n<\/li>\n<li>for lists of integers:\n<pre class=\"brush: clojure; title: ; notranslate\" title=\"\">\r\n(to-int-list (X-Cons X-One (X-Cons X-Two (X-Cons X-Three X-Nil)))) ; (1,2,3)\r\n<\/pre>\n<\/li>\n<\/ul>\n<p>All these functions are defined in <em>ski_encoding.clj <\/em>.<\/p>\n<h3>Making Clojure lazy<\/h3>\n<p>So we can do some arithmetic and logic computations completely in <strong>SKI<\/strong>, but how do we do recursive calculations? Obviously, we cannot just call a function from its body because its name is not one of <strong>S<\/strong>, <strong>K<\/strong>, <strong>I<\/strong>, or <strong>X<\/strong>. To make recursion possible we will abstract recursion by using <strong>Y<\/strong> combinator and then translate it to <strong>SKI<\/strong>-calculus. \u00a0<strong>Y<\/strong>\u00a0and its derivation is well explained in this <a href=\"http:\/\/mvanier.livejournal.com\/2897.html\" target=\"_blank\" rel=\"noopener\">post<\/a>.<\/p>\n<p>It is not hard to find a working implementation of <strong>Y<\/strong> in Clojure. Let look at the example from\u00a0<a href=\"http:\/\/blog.podsnap.com\/y-combinator.html\" target=\"_blank\" rel=\"noopener\">Deriving the Y-combinator in Clojure<\/a>\u00a0:<\/p>\n<pre class=\"brush: clojure; title: ; notranslate\" title=\"\">\r\n(defn Y &#x5B;f] ((fn &#x5B;g] (g g)) (fn &#x5B;h] (fn &#x5B;n] ((f (h h)) n)))))\r\n(def fact-maker (fn &#x5B;g] (fn &#x5B;n] (if (= 0 n) 1 (* n (g (- n 1)))))))\r\n((Y fact-maker) 5) ; 120\r\n<\/pre>\n<p>Everything is swell. But here is a bit of problem if we are working with Church arithmetics. There <em>if<\/em>\u00a0 is not the Clojure <em>if<\/em>, but a user defined function, and as such it does not have the &#8216;magic&#8217; of the Clojure\u00a0<em>if<\/em>, which evaluates only true- or false-branches based on the condition. This is equivalent to replacing <em>if<\/em> with <em>my-if<\/em>:<\/p>\n<pre class=\"brush: clojure; title: ; notranslate\" title=\"\">\r\n(defn Y &#x5B;f] ((fn &#x5B;g] (g g)) (fn &#x5B;h] (fn &#x5B;n] ((f (h h)) n)))))\r\n(defn my-if &#x5B;cond a b] (if cond a b))\r\n(def fact-maker (fn &#x5B;g] (fn &#x5B;n] (my-if (= 0 n) 1 (* n (g (- n 1)))))))\r\n((Y fact-maker) 5) ; StackOverflowError!\r\n<\/pre>\n<p>And we get an exception &#8211; Clojure is a strict language. We can get around by modifying <em>fact-maker<\/em>\u00a0by wrapping <em>if<\/em> branches in anonymous functions. \u00a0We call the modified function\u00a0f<em>act-maker2<\/em>:<\/p>\n<pre class=\"brush: clojure; title: ; notranslate\" title=\"\">\r\n(defn Y &#x5B;f] ((fn &#x5B;g] (g g)) (fn &#x5B;h] (fn &#x5B;n] ((f (h h)) n)))))\r\n(defn my-if &#x5B;cond a b] (if cond a b))\r\n(def fact-maker2 (fn &#x5B;g]\r\n (fn &#x5B;n] ((my-if (= 0 n) (fn &#x5B;] 1) (fn &#x5B;] (* n (g (- n 1)))))))))\r\n((Y fact-maker2) 5) ; again 120\r\n<\/pre>\n<p>This uses a standard trick to introduce laziness &#8211; wrap an expression into an anonymous function to delay its computation.\u00a0But what do we do for <strong>SKI<\/strong>-calculus? \u00a0There is no way to use an anonymous function in an\u00a0<strong>SKI<\/strong>-expression! A solution that I use is to push laziness to the combinator level, i.e. making <strong>S<\/strong>, <strong>K<\/strong>, <strong>I<\/strong> and <strong>X<\/strong> lazy. It has two main ingredients:<\/p>\n<ol>\n<li>Use <em>delay<\/em> and <em>force<\/em>\u00a0functions of Clojure. When a combinator gets it arguments it wraps it with <em>delay<\/em> and uses <em>force<\/em> to get the result at the moment when the result of computation is needed. The &#8220;delay&#8221; is achieved with the <em>variadize<\/em> function from <em>ski_encoding.clj<\/em>, which is used in the definitions of all combinators as shown above.\n<pre class=\"brush: clojure; title: ; notranslate\" title=\"\">\r\n(defn variadize\r\n  (&#x5B;fnct] (variadize fnct (arg-count fnct)))\r\n  (&#x5B;fnct num-args]\r\n   (if (zero?  num-args) (DelayedEval. (delay (fnct)))\r\n       (fn &#x5B;&amp; args]\r\n         (cond\r\n           (&gt; (count args) num-args)\r\n           (DelayedEval. (delay (apply (apply fnct (take num-args args)) (drop num-args args))))\r\n           (= (count args) num-args) (DelayedEval. (delay (apply fnct args)))\r\n           :else (variadize (reduce partial fnct args) (- num-args (count args))))))))\r\n<\/pre>\n<\/li>\n<li>The above works well, except for the fact that we need to call\u00a0<em>force<\/em> before each application, i.e.<em> (force S (force K &#8230;) &#8230;),<\/em> otherwise we would get an exception as we are dealing with delayed computations and not functions.\u00a0To resolve this problem, we have <em>DelayedEval<\/em> record which inherits from <em>clojure.lang.IFn<\/em>, and overrides its <em>invoke<\/em> and <em>applyTo<\/em> methods, so that these methods call <em>force<\/em> when called, thus making use of &#8220;force&#8221; transparent. \u00a0<em>DelayedEval<\/em> is generated using macros to avoid copy-pasting methods that differ only in the number of arguments (inspired by <a href=\"https:\/\/github.com\/alandipert\/desiderata\/blob\/master\/src\/clj\/alandipert\/desiderata\/invoke.clj\" target=\"_blank\" rel=\"noopener\">link<\/a>), but the end result is similar to this:\n<pre class=\"brush: clojure; title: ; notranslate\" title=\"\">\r\n(defrecord DelayedEval &#x5B;delayed-exp]\r\n  clojure.lang.IFn\r\n  (invoke &#x5B;this] (let &#x5B;exp (force delayed-exp)] (if (instance? DelayedEval exp) (exp) exp)))\r\n\r\n  (invoke &#x5B;this arg] ((force delayed-exp) arg))\r\n  (invoke &#x5B;this arg arg2] ((force delayed-exp) arg arg2))\r\n  (invoke &#x5B;this arg arg2 arg3] ((force delayed-exp) arg arg2 arg3))\r\n  (invoke &#x5B;this arg arg2 arg3 arg4] ((force delayed-exp) arg arg2 arg3 arg4))\r\n  (applyTo &#x5B;this args] (apply (force delayed-exp) args)));\r\n<\/pre>\n<\/li>\n<li>At some point we need to extract the actual result. \u00a0We do that with an extra pair of parentheses. This works \u00a0because we defined <em>invoke[this]<\/em> in <em>DelayedEval\u00a0<\/em>to recursively evalute itself, until we get an expression which is not <em>DelayedEval.\u00a0<\/em>For instance, we use it in <em>to-int<\/em> function in\u00a0<em>ski_encoding.clj<\/em>:\n<pre class=\"brush: clojure; title: ; notranslate\" title=\"\">\r\n(defn to-int &#x5B;ski-int-expr] ((ski-int-expr ski-plus-one 0)))\r\n<\/pre>\n<p>Another place we use the same trick is get-val function in <em>combinator_definitions.clj<\/em>:<\/p>\n<pre class=\"brush: clojure; title: ; notranslate\" title=\"\">\r\n(defn get-val &#x5B;delayed-val] (if (instance? DelayedEval delayed-val) (delayed-val) delayed-val))\r\n<\/pre>\n<p>This function is needed when we do\u00a0conversions from Church encoded numbers to regular numbers. Given a DelayedEval expression we evaluate it recursively to get a value that we can use in a regular arithmetic operation.<\/li>\n<\/ol>\n<p>Combination of <em>variadize<\/em> and <em>DelayedEval<\/em> makes it possible to get a working translation of <strong>Y<\/strong> to <strong>SKI<\/strong>-calculus.<\/p>\n<h3>Y combinator<\/h3>\n<p>The tool produces this output\u00a0<\/p>\n<details>\n<summary><strong>SKI<\/strong> translation of <strong>Y<\/strong><\/strong><\/summary>\n<p><span style=\"font-size: xx-small;\"><br \/>\n((S (K (S I I)) (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) I)) (K (S I I)))))) (K (K I)))) (S (K (S (S (S (K (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) I)) (K I))))) (K (K I)))) (S (K (S (K (S I (K (S (K K) I)))) I)) I)) (K (((S (S (K S) (S (K K) (S (K S) (S (K (S I)) (S (K K) I))))) (K (S (K K) I))) (S (K K) I)) (S (K K) I)))))) (S (S (K S) (S (K (S (K (S (K (S (S (K ((S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (K (S (K (S (K (S I I)) (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) I)) (K (S I I)))))) (K (K I))))))) (S (K (S (S (K S) (S (K K) (S (K S) (S (K (S (S (K (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) I)) (K I))))) (K (K I)))) (S (K (S (K (S I (K (S (K K) I)))) I)) I)))) (S (K K) I))))))) (S (K K) (S (S (K S) (S (K K) (S (K S) (S (S (K S) (S (K K) I)) (K (S (K (S (K (S I (K (S (K K) I)))) (S (K (S I (K (K I)))) I))) I)))))) (K (S (S (K S) (S (K K) I)) (K (S (K (S (K (S I (K (K I)))) (S (K (S I (K (K I)))) I))) I))))))))))) (K (K I))) (S (K (S (K ((S (S (K S) (S (K K) (S (K S) (S (K (S I)) (S (K K) I))))) (K (S (K K) I))) (K I))))) (S (S (K S) (S (K K) (S (K (S (S (K S) (S (K K) (S (K S) (S (K (S I)) (S (K K) I))))) (K (S (K K) I)))) I))) (K I))))) I))) (S (K K) I))))) (S (S (K S) (S (K K) I)) (K (S (S (K (S (S (K S) (S (K K) (S (K (S (K (S I I)) (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) I)) (K (S I I)))))) (K (K I))))) (S (K (S (K (S (S (S (K (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) I)) (K I))))) (K (K I)))) (S (K (S (K (S I (K (S (K K) I)))) I)) I)) (K (((S (S (K S) (S (K K) (S (K S) (S (K (S I)) (S (K K) I))))) (K (S (K K) I))) (S (K K) I)) (S (K K) I)))))))) (S (S (K S) (S (K (S (K S))) (S (S (K S) (S (K K) (S (K S) (S (K (S (K (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) I)) (K I))))) (K (K I)))))) (S (S (K S) (S (K K) I)) (K (S (K (S (K (S I (K (S (K K) I)))) (S (K (S I (K (K I)))) I))) I))))))) (K (S (K (S (S (K (S (K (S (K ((S (S (K S) (S (K K) (S (K S) (S (K (S I)) (S (K K) I))))) (K (S (K K) I))) (K I))))) (S (S (K S) (S (K K) (S (K (S (S (K S) (S (K K) (S (K S) (S (K (S I)) (S (K K) I))))) (K (S (K K) I)))) I))) (K I)))) (S (K (S (K (S I (K (S (K K) I)))) (S (K (S I (K (K I)))) I))) I)))) (S (S (K S) (S (K K) I)) (K (S (K (S (K (S I (K (K I)))) (S (K (S I (K (K I)))) I))) I)))))))) (K (S (S (K S) (S (K K) I)) (K (S (K (S (K (S I (K (K I)))) (S (K (S I (K (K I)))) I))) I))))))))) (K I))) (S (K (S (S (K (S (S (K S) (S (K (S (K (S (S (K S) (S (S (K S) (S (K K) I)) (K I))) (S (K K) I))))) (S (S (K S) (S (K K) (S (K (S (K (S (K (S (S I (K (K (K I)))) (K (S (K K) I)))))) (S (S (K S) (S (K K) (S (K (S (S (K S) (S (K (S (K S))) (S (K (S (K (S (K S))))) (S (K (S (K (S (K K))))) (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (K (S (S I (K (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) (S (K (S (S (K S) (S (K (S (K S))) (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) I)) (K (S (K (S (K (S I)))) (S (K (S (K K))) (S (K (S I)) (S (K K) I))))))))) (K (K (S (K K) I)))))) (K (K (K I))))) I))) (K I))))) (K (K I))))))) (S (K K) I))))) (K (K I))))))) (K (K (K I))))) I))) (K I)))) I))) (K I)))) (S (K (S (K (S (S I (K (K I))) (K (S (K K) I)))))) (S (K (S (S (K (S (S (K S) (S (K (S (K (S (S (K S) (S (S (K S) (S (K K) I)) (K I))) (S (K K) I))))) (S (S (K S) (S (K K) (S (K (S (K (S (K (S (S I (K (K (K I)))) (K (S (K K) I)))))) (S (S (K S) (S (K K) (S (K (S (S (K S) (S (K (S (K S))) (S (K (S (K (S (K S))))) (S (K (S (K (S (K K))))) (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (K (S (S I (K (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) (S (K (S (S (K S) (S (K (S (K S))) (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) I)) (K (S (K (S (K (S I)))) (S (K (S (K K))) (S (K (S I)) (S (K K) I))))))))) (K (K (S (K K) I)))))) (K (K (K I))))) I))) (K I))))) (K (K I))))))) (S (K K) I))))) (K (K I))))))) (K (K (K I))))) I))) (K I)))) I))) (K I)))) (S (K (S (S (K (S (K (S (K (S (S I (K (K (K I)))) (K (S (K K) I)))))) (S (S (K S) (S (K K) (S (K (S (S (K S) (S (K (S (K S))) (S (K (S (K (S (K S))))) (S (K (S (K (S (K K))))) (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (K (S (S I (K (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) (S (K (S (S (K S) (S (K (S (K S))) (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) I)) (K (S (K (S (K (S I)))) (S (K (S (K K))) (S (K (S I)) (S (K K) I))))))))) (K (K (S (K K) I)))))) (K (K (K I))))) I))) (K I))))) (K (K I))))))) (S (K K) I))))) (K (K I))))))) (K (K (K I))))) I))) (K I)))) I))) (S (K K) I)))) I))) (S (K K) I))))) I))) (S (K K) (S (K (S (K (S I (K (S (K K) I)))) (S (K (S I (K (K I)))) I))) I)))) I))))) (S (K (S (S (K (S (K (S (S (K ((S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (K (S (K (S (K (S I I)) (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) I)) (K (S I I)))))) (K (K I))))))) (S (K (S (S (K S) (S (K K) (S (K S) (S (K (S (S (K (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) I)) (K I))))) (K (K I)))) (S (K (S (K (S I (K (S (K K) I)))) I)) I)))) (S (K K) I))))))) (S (K K) (S (S (K S) (S (K K) (S (K S) (S (S (K S) (S (K K) I)) (K (S (K (S (K (S I (K (S (K K) I)))) (S (K (S I (K (K I)))) I))) I)))))) (K (S (S (K S) (S (K K) I)) (K (S (K (S (K (S I (K (K I)))) (S (K (S I (K (K I)))) I))) I))))))))))) (K (K I))) (S (K (S (K ((S (S (K S) (S (K K) (S (K S) (S (K (S I)) (S (K K) I))))) (K (S (K K) I))) (K I))))) (S (S (K S) (S (K K) (S (K (S (S (K S) (S (K K) (S (K S) (S (K (S I)) (S (K K) I))))) (K (S (K K) I)))) I))) (K I))))) I))) (S (K K) I))) (S (S (K (S (S (K S) (S (K K) (S (K (S (K (S I I)) (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) I)) (K (S I I)))))) (K (K I))))) (S (K (S (K (S (S (S (K (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) I)) (K I))))) (K (K I)))) (S (K (S (K (S I (K (S (K K) I)))) I)) I)) (K (((S (S (K S) (S (K K) (S (K S) (S (K (S I)) (S (K K) I))))) (K (S (K K) I))) (S (K K) I)) (S (K K) I)))))))) (S (S (K S) (S (K (S (K S))) (S (S (K S) (S (K K) (S (K S) (S (K (S (K (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) I)) (K I))))) (K (K I)))))) (S (S (K S) (S (K K) I)) (K (S (K (S (K (S I (K (S (K K) I)))) (S (K (S I (K (K I)))) I))) I))))))) (K (S (K (S (S (K (S (K (S (K ((S (S (K S) (S (K K) (S (K S) (S (K (S I)) (S (K K) I))))) (K (S (K K) I))) (K I))))) (S (S (K S) (S (K K) (S (K (S (S (K S) (S (K K) (S (K S) (S (K (S I)) (S (K K) I))))) (K (S (K K) I)))) I))) (K I)))) (S (K (S (K (S I (K (S (K K) I)))) (S (K (S I (K (K I)))) I))) I)))) (S (S (K S) (S (K K) I)) (K (S (K (S (K (S I (K (K I)))) (S (K (S I (K (K I)))) I))) I)))))))) (K (S (S (K S) (S (K K) I)) (K (S (K (S (K (S I (K (K I)))) (S (K (S I (K (K I)))) I))) I))))))))) (K I))) (S (K (S (S (K (S (S (K S) (S (K (S (K (S (S (K S) (S (S (K S) (S (K K) I)) (K I))) (S (K K) I))))) (S (S (K S) (S (K K) (S (K (S (K (S (K (S (S I (K (K (K I)))) (K (S (K K) I)))))) (S (S (K S) (S (K K) (S (K (S (S (K S) (S (K (S (K S))) (S (K (S (K (S (K S))))) (S (K (S (K (S (K K))))) (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (K (S (S I (K (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) (S (K (S (S (K S) (S (K (S (K S))) (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) I)) (K (S (K (S (K (S I)))) (S (K (S (K K))) (S (K (S I)) (S (K K) I))))))))) (K (K (S (K K) I)))))) (K (K (K I))))) I))) (K I))))) (K (K I))))))) (S (K K) I))))) (K (K I))))))) (K (K (K I))))) I))) (K I)))) I))) (K I)))) (S (K (S (S (K (S (K (S (K (S (S I (K (K (K I)))) (K (S (K K) I)))))) (S (S (K S) (S (K K) (S (K (S (S (K S) (S (K (S (K S))) (S (K (S (K (S (K S))))) (S (K (S (K (S (K K))))) (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (K (S (S I (K (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) (S (K (S (S (K S) (S (K (S (K S))) (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) I)) (K (S (K (S (K (S I)))) (S (K (S (K K))) (S (K (S I)) (S (K K) I))))))))) (K (K (S (K K) I)))))) (K (K (K I))))) I))) (K I))))) (K (K I))))))) (S (K K) I))))) (K (K I))))))) (K (K (K I))))) I))) (K I)))) I))) (S (K K) I)))) I))) (S (K K) (S (K (S (K (S I (K (S (K K) I)))) (S (K (S I (K (K I)))) I))) I)))) I)))) (S (S (K S) (S (K K) I)) (K (S (S (K (S (S (K S) (S (K K) (S (K (S (K (S I I)) (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) I)) (K (S I I)))))) (K (K I))))) (S (K (S (K (S (S (S (K (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) I)) (K I))))) (K (K I)))) (S (K (S (K (S I (K (S (K K) I)))) I)) I)) (K (((S (S (K S) (S (K K) (S (K S) (S (K (S I)) (S (K K) I))))) (K (S (K K) I))) (S (K K) I)) (S (K K) I)))))))) (S (S (K S) (S (K (S (K S))) (S (S (K S) (S (K K) (S (K S) (S (K (S (K (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) I)) (K I))))) (K (K I)))))) (S (S (K S) (S (K K) I)) (K (S (K (S (K (S I (K (S (K K) I)))) (S (K (S I (K (K I)))) I))) I))))))) (K (S (K (S (S (K (S (K (S (K ((S (S (K S) (S (K K) (S (K S) (S (K (S I)) (S (K K) I))))) (K (S (K K) I))) (K I))))) (S (S (K S) (S (K K) (S (K (S (S (K S) (S (K K) (S (K S) (S (K (S I)) (S (K K) I))))) (K (S (K K) I)))) I))) (K I)))) (S (K (S (K (S I (K (S (K K) I)))) (S (K (S I (K (K I)))) I))) I)))) (S (S (K S) (S (K K) I)) (K (S (K (S (K (S I (K (K I)))) (S (K (S I (K (K I)))) I))) I)))))))) (K (S (S (K S) (S (K K) I)) (K (S (K (S (K (S I (K (K I)))) (S (K (S I (K (K I)))) I))) I))))))))) (K I))) (S (S (K S) (S (K K) (S (K (S (S (K S) (S (K (S (K (S (S (K S) (S (S (K S) (S (K K) I)) (K I))) (S (K K) I))))) (S (S (K S) (S (K K) (S (K (S (K (S (K (S (S I (K (K (K I)))) (K (S (K K) I)))))) (S (S (K S) (S (K K) (S (K (S (S (K S) (S (K (S (K S))) (S (K (S (K (S (K S))))) (S (K (S (K (S (K K))))) (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (K (S (S I (K (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) (S (K (S (S (K S) (S (K (S (K S))) (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) I)) (K (S (K (S (K (S I)))) (S (K (S (K K))) (S (K (S I)) (S (K K) I))))))))) (K (K (S (K K) I)))))) (K (K (K I))))) I))) (K I))))) (K (K I))))))) (S (K K) I))))) (K (K I))))))) (K (K (K I))))) I))) (K I)))) I))) (K I)))) (S (K (S (K (S (S I (K (K I))) (K (S (K K) I)))))) (S (K (S (S (K (S (S (K S) (S (K (S (K (S (S (K S) (S (S (K S) (S (K K) I)) (K I))) (S (K K) I))))) (S (S (K S) (S (K K) (S (K (S (K (S (K (S (S I (K (K (K I)))) (K (S (K K) I)))))) (S (S (K S) (S (K K) (S (K (S (S (K S) (S (K (S (K S))) (S (K (S (K (S (K S))))) (S (K (S (K (S (K K))))) (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (K (S (S I (K (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) (S (K (S (S (K S) (S (K (S (K S))) (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) I)) (K (S (K (S (K (S I)))) (S (K (S (K K))) (S (K (S I)) (S (K K) I))))))))) (K (K (S (K K) I)))))) (K (K (K I))))) I))) (K I))))) (K (K I))))))) (S (K K) I))))) (K (K I))))))) (K (K (K I))))) I))) (K I)))) I))) (K I)))) (S (K (S (S (K (S (K (S (K (S (S I (K (K (K I)))) (K (S (K K) I)))))) (S (S (K S) (S (K K) (S (K (S (S (K S) (S (K (S (K S))) (S (K (S (K (S (K S))))) (S (K (S (K (S (K K))))) (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (K (S (S I (K (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) (S (K (S (S (K S) (S (K (S (K S))) (S (S (K S) (S (K (S (K S))) (S (K (S (K K))) (S (S (K S) (S (K K) I)) (K (S (K (S (K (S I)))) (S (K (S (K K))) (S (K (S I)) (S (K K) I))))))))) (K (K (S (K K) I)))))) (K (K (K I))))) I))) (K I))))) (K (K I))))))) (S (K K) I))))) (K (K I))))))) (K (K (K I))))) I))) (K I)))) I))) (S (K K) I)))) I))) (S (K K) I))))) (S (K (S (K (S I (K (S (K K) I)))) (S (K (S I (K (K I)))) I))) I)))) (K I))) I)))))))<br \/>\n<\/span><\/details>\n<p> It is not compact as <strong>Y =<\/strong>\u00a0<strong>(<span class=\"pl-en\">S<\/span> (<span class=\"pl-en\">K<\/span> (<span class=\"pl-en\">S<\/span> I I)) (<span class=\"pl-en\">S<\/span> (<span class=\"pl-en\">S<\/span> (<span class=\"pl-en\">K<\/span> S) K) (<span class=\"pl-en\">K<\/span> (<span class=\"pl-en\">S<\/span> I I)))))<\/strong>\u00a0from <a href=\"https:\/\/en.wikipedia.org\/wiki\/Fixed-point_combinator#Other_fixed-point_combinators\" target=\"_blank\" rel=\"noopener\">Wikipedia<\/a>, but results are the same. In the code the Wikipedia version is defined as\u00a0<strong>Y-Wiki<\/strong>.<\/p>\n<p>With <strong>Y<\/strong> and <strong>Y-Wiki<\/strong> combinators working we can get <strong>SKI<\/strong> and <strong>X<\/strong> translations of a few interesting functions (<em>ski_encoding.clj<\/em>):<\/p>\n<h4>Factorial<\/h4>\n<pre class=\"brush: clojure; title: ; notranslate\" title=\"\">\r\n(translate-lambda-to-ski &#039;SKI-Fact-Maker (template (fn &#x5B;g#]\r\n                                                     (fn &#x5B;n#] (SKI-If (SKI-Eq?  SKI-Zero n#) SKI-One (SKI-Mul n# (g# (SKI-Minus n# SKI-One))))))))\r\n\r\n(translate-lambda-to-ski &#039;SKI-Fact &#039;(SKI-Y SKI-Fact-Maker))\r\n(to-int (SKI-Fact SKI-Five)); 125\r\n<\/pre>\n<h4>McCarthy 91 function<\/h4>\n<p><a href=\"https:\/\/en.wikipedia.org\/wiki\/McCarthy_91_function\" target=\"_blank\" rel=\"noopener\">McCarthy 91<\/a>\u00a0is a curious recursive function that \u00a0evaluates to\u00a091 for all natural numbers <i>n<\/i>\u00a0\u2264\u00a0100, and to\u00a0<i>n<\/i>\u00a0\u2212\u00a010 for <i>n<\/i> &gt; 100:<\/p>\n<p><a href=\"https:\/\/www.type.sh\/wp-content\/uploads\/2024\/10\/mccarthy-91.png\" rel=\"attachment wp-att-296\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-296\" src=\"https:\/\/www.type.sh\/wp-content\/uploads\/2024\/10\/mccarthy-91.png\" alt=\"mccarthy-91\" width=\"324\" height=\"48\" \/><\/a><\/p>\n<pre class=\"brush: clojure; title: ; notranslate\" title=\"\">\r\n(translate-lambda-to-ski &#039;SKI-McCarthy-Maker (template (fn &#x5B;f#]\r\n                                                         (fn &#x5B;n#] (SKI-If (SKI-Leq? n# SKI-Hundred) (f# (f# (SKI-Plus n# SKI-Eleven))) (SKI-Minus n# SKI-Ten))))))\r\n\r\n(translate-lambda-to-ski &#039;SKI-McCarthy &#039;(SKI-Y SKI-McCarthy-Maker))\r\n(to-int (SKI-McCarthy SKI-Eleven)); 91\r\n<\/pre>\n<h4>List functions<\/h4>\n<p>As mentioned above, we have an <a href=\"https:\/\/en.wikipedia.org\/wiki\/Church_encoding#Two_pairs_as_a_list_node\" target=\"_blank\" rel=\"noopener\">implementation<\/a> of lists, which combined with <strong>Y<\/strong> gives us all essential functions to work with lists<\/p>\n<pre class=\"brush: clojure; title: ; notranslate\" title=\"\">\r\ntranslate-lambda-to-ski &#039;SKI-Map (template (fn &#x5B;f# l#]\r\n                                              ((SKI-Y\r\n                                                (fn &#x5B;r#]\r\n                                                  (fn &#x5B;m#]\r\n                                                    (SKI-If (SKI-Nil? m#) SKI-Nil\r\n                                                            (SKI-Cons (f# (SKI-Head m#)) (r# (SKI-Tail m#))))))) l#))))\r\n\r\n(translate-lambda-to-ski &#039;SKI-Filter (template (fn &#x5B;f# l#]\r\n                                                 ((SKI-Y\r\n                                                   (fn &#x5B;r#]\r\n                                                     (fn &#x5B;m#]\r\n                                                       (SKI-If (SKI-Nil? m#) SKI-Nil\r\n                                                               (SKI-If (f# (SKI-Head m#))\r\n                                                                       (SKI-Cons (SKI-Head m#) (r# (SKI-Tail m#)))\r\n                                                                       (r# (SKI-Tail m#))))))) l#))))\r\n\r\n;fold right\r\n(translate-lambda-to-ski &#039;SKI-Reduce (template (fn &#x5B;f# z# l#]\r\n                                                 ((SKI-Y\r\n                                                   (fn &#x5B;r#]\r\n                                                     (fn &#x5B;m#]\r\n                                                       (SKI-If (SKI-Nil? m#) z#\r\n                                                               (f# (SKI-Head m#) (r# (SKI-Tail m#))))))) l#))))\r\n\r\n;fold left\r\n(translate-lambda-to-ski &#039;SKI-ReduceL (template (fn &#x5B;f# z# l#]\r\n                                                  ((SKI-Y\r\n                                                    (fn &#x5B;r#]\r\n                                                      (fn &#x5B;m# a#]\r\n                                                        (SKI-If (SKI-Nil? m#) a#\r\n                                                                (r#  (SKI-Tail m#) (f# (SKI-Head m#) a#)))))) l# z#))))\r\n\r\n<\/pre>\n<p><em>SKI-Reduce<\/em> is an implementation of <em>fold-right<\/em>. In fact, as shown in the code, it is enough to have\u00a0<em>SKI-Reduce<\/em>,<em>\u00a0<\/em>to implement <em>map<\/em>, <em>filter<\/em>,<br \/>\n<em>length<\/em>, and <em>concat<\/em> functions. We can even <a href=\"http:\/\/stackoverflow.com\/questions\/6172004\/writing-foldl-using-foldr\" target=\"_blank\" rel=\"noopener\">implement<\/a> <em>fold-left<\/em> using <em>SKI-Reduce<\/em>:<\/p>\n<pre class=\"brush: clojure; title: ; notranslate\" title=\"\">\r\n(translate-lambda-to-ski &#039;SKI-ReduceL2 (template (fn &#x5B;f# z# l#] (SKI-Reduce (fn &#x5B;b# g# a#] (g# (f# a# b#))) I l# z#))))\r\n<\/pre>\n<h4>Ackermann function<\/h4>\n<p><a href=\"https:\/\/en.wikipedia.org\/wiki\/Ackermann_function\" target=\"_blank\" rel=\"noopener\">Ackermann function<\/a>\u00a0is defined as:<\/p>\n<p><a href=\"https:\/\/www.type.sh\/wp-content\/uploads\/2024\/10\/ackermann-300x51-1.png\" rel=\"attachment wp-att-302\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-302\" src=\"https:\/\/www.type.sh\/wp-content\/uploads\/2024\/10\/ackermann-300x51-1.png\" alt=\"ackermann\" width=\"300\" height=\"51\" \/><\/a><\/p>\n<p>Note, that the function is recursive in two parameters, while <strong>Y<\/strong> supports only one. But since we have lists, we can overcome this by packing <em>m<\/em> and <em>n<\/em>\u00a0into two element list when we need to pass them as a single argument, and unpack them when we need to have access to their\u00a0values (see implementation in <em>ski_encoding.clj<\/em>).<\/p>\n<h4>Quick Sort and Sieve of\u00a0Eratosthenes<\/h4>\n<p>Having lists, <strong>Y<\/strong>, and <em>SKI-Filter<\/em> we can build some interesting algorithms on lists. <em>ski_encoding.clj<\/em> contains implementations for Quick Sort and Sieve of Eratosthenes. For Sieve of Eratosthenes we also need <em>SKI-Mod m n<\/em>, which computes the remainder of <em>m\/n<\/em>. It&#8217;s implemented as a recursive function of two arguments and uses the same trick of packing the two arguments into a list as in the implementation of Ackermann function.<\/p>\n<h4>Y*<\/h4>\n<p>Our last example is an implementation of <strong>Y*<\/strong>, which is a fix point combinator for mutually recursive functions. It&#8217;s a modified version of Y* combinator found <a href=\"http:\/\/stackoverflow.com\/questions\/4899113\/fixed-point-combinator-for-mutually-recursive-functions\" target=\"_blank\" rel=\"noopener\">here<\/a>. The classic <em>even?<\/em> and <em>odd?<\/em> functions are implemented. We pack two &#8220;maker&#8221; functions into a list, pass the list to <strong>Y*<\/strong> to find the common fix-point of these functions, which is a again a list of two functions &#8211; the first function is <em>even?<\/em>\u00a0and the second function is <em>odd?<\/em>.<\/p>\n<p>Another example where we use <strong>Y*<\/strong> is <em>SKI-FunkyMap<\/em>, which applies its function only to odd elements in the list (indexed from 0).<\/p>\n<h3>X Translator<\/h3>\n<p>Translation to <strong>X<\/strong> is quite simple. We take all functions that were translated by SKI Translator, and replace each of <strong>S<\/strong>, <strong>K<\/strong>, <strong>I<\/strong> by its representation in <strong>X<\/strong>. The names of functions are modified by replacing the prefix &#8220;SKI&#8221; to the prefix &#8220;X&#8221;, i.e. function <em>SKI-Cons<\/em> becomes <em>X-Cons<\/em>. \u00a0The code is in <em>iota_encoding.clj<\/em>, and the mapping rules are the following:<\/p>\n<ol>\n<li><strong>S<\/strong> becomes\u00a0<strong>(X (X (X (X X))))<\/strong><\/li>\n<li><strong>K<\/strong> becomes\u00a0<strong>(X (X (X X)))<\/strong><\/li>\n<li><strong>I<\/strong> becomes <strong>(X X)<\/strong><\/li>\n<\/ol>\n<p>The same approach, of course, can be used for other complete bases for Lambda calculus, for instance, <a href=\"https:\/\/en.wikipedia.org\/wiki\/B,_C,_K,_W_system\" target=\"_blank\" rel=\"noopener\"><strong>B<\/strong>, <strong>C<\/strong>, <strong>K<\/strong>, <strong>W<\/strong> system<\/a>. But obviously, a direct translation would be much more efficient.<\/p>\n<p>We can run <strong>X<\/strong> programs and get their sources the same way as we do for <strong>SKI<\/strong> programs:<\/p>\n<pre class=\"brush: clojure; title: ; notranslate\" title=\"\">\r\n(to-int (X-Ackermann (X-Cons X-Three (X-Cons X-Three X-Nil))))\r\n(get iota-translations &#039;X-Ackermann)\r\n<\/pre>\n<p>Note though, that <em>iota-translations<\/em> is a regular <em>map<\/em> and not an <em>atom<\/em> as in the case of <em>ski-translations<\/em>.<\/p>\n<h3>Interesting topics<\/h3>\n<ul>\n<li>It would be interesting to add support for <a href=\"https:\/\/en.wikipedia.org\/wiki\/Church_encoding#Signed_numbers\" target=\"_blank\" rel=\"noopener\">signed\u00a0integers<\/a>. Currently all examples use the natural numbers only.<\/li>\n<li><a href=\"https:\/\/en.wikipedia.org\/wiki\/Joy_(programming_language)\" target=\"_blank\" rel=\"noopener\">Joy<\/a> \u00a0is a stack based programming language, \u00a0such languages also have their systems of (concatenative)\u00a0combinators. \u00a0Look\u00a0<a href=\"https:\/\/github.com\/robertkleffner\/CaKe\" target=\"_blank\" rel=\"noopener\">here<\/a> for an interesting discussion and implementation.<\/li>\n<li>For derivation of <strong>X<\/strong>, take a look at this paper: Fokker, <a href=\"http:\/\/www.type.sh\/wp-content\/uploads\/2016\/01\/FokkerX.pdf\" target=\"_blank\" rel=\"noopener\">The systematic construction of a one-combinator basis<\/a>. It contains a derivation of <strong>X<\/strong>, as well as, a number of other complete bases for lambda calculus. It&#8217;s quite simple to modify the code to use any of these other bases.<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>(Source code for this post is here: https:\/\/github.com\/mikebern\/lambda_ski_iota\u00a0) There are only six atomic operations for Turing machines &#8211; read and write to the tape, move the tape left or right one square,\u00a0\u00a0change state based on the observed symbol and halt. Yet,\u00a0it&#8217;s not hard to see, at least at a high level, how a program in\u2026 <span class=\"read-more\"><a href=\"https:\/\/www.type.sh\/index.php\/2016\/01\/25\/skiing-with-y-iota-and-ackermann\/\">Read More &raquo;<\/a><\/span><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9],"tags":[6],"class_list":["post-11","post","type-post","status-publish","format-standard","hentry","category-functional-programming","tag-clojure"],"_links":{"self":[{"href":"https:\/\/www.type.sh\/index.php\/wp-json\/wp\/v2\/posts\/11","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.type.sh\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.type.sh\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.type.sh\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.type.sh\/index.php\/wp-json\/wp\/v2\/comments?post=11"}],"version-history":[{"count":8,"href":"https:\/\/www.type.sh\/index.php\/wp-json\/wp\/v2\/posts\/11\/revisions"}],"predecessor-version":[{"id":38,"href":"https:\/\/www.type.sh\/index.php\/wp-json\/wp\/v2\/posts\/11\/revisions\/38"}],"wp:attachment":[{"href":"https:\/\/www.type.sh\/index.php\/wp-json\/wp\/v2\/media?parent=11"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.type.sh\/index.php\/wp-json\/wp\/v2\/categories?post=11"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.type.sh\/index.php\/wp-json\/wp\/v2\/tags?post=11"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}