Are there a lambda-mu expression equivalent to the yin yang puzzle?
You can get an important hint to solution by thinking how to make the yin-yang puzzle work in a typed language, see this question. OCaml computes the type of yin and yang to be ('a -&gt; 'a) as 'a, which is a recursive type equal to its own function space. Such a type is precisely what it takes to implement the untyped $\lambda$-calculus in a typed language.

What does this have to do with your question? In the untyped $\lambda$-calculus (or typed calculus with general recursive types) we can define $\mu$ and other fixed-point combinators. So, since yin and yang cannot be given types, we must use the untyped $\lambda$-calculus, but then $\mu$ is not needed as a primitive. In fact, the CPS transform of the puzzle will be just pure $\lambda$-calculus.

You can compute the CPS transform in the privacy of your mind. Here is my version, written in Ocaml. To run it, you need to pass -rectypes to Ocaml:

let callcc f k = f k ;;
let yin c = callcc (fun x -&gt; x x) (fun k -&gt; print_char '@'; c k) ;;
let yang c = callcc (fun x -&gt; x x) (fun k -&gt; print_char '*'; c k) ;;
let _  = yin yang (fun x -&gt; x) ;;


Clearly, the let statements are just a convenience. Without them, and with callcc expanded out, we get:

(fun c -&gt; (fun x -&gt; x x) (fun k -&gt; print_char '@'; c k))
(fun c -&gt; (fun x -&gt; x x) (fun k -&gt; print_char '*'; c k))
(fun x -&gt; x)


We could remove the print_char statement and $\eta$-reduce:


Start with:

(fun c -&gt; (fun x -&gt; x x) (fun k -&gt; c k))
(fun c -&gt; (fun x -&gt; x x) (fun k -&gt; c k))
(fun x -&gt; x)

Reduce fun k -&gt; c k to c:

(fun c -&gt; (fun x -&gt; x x) c) (fun c -&gt; (fun x -&gt; x x) c) (fun x -&gt; x)

Reduce fun c -&gt; (fun x -&gt; x x) c to fun x -&gt; x x:

(fun x -&gt; x x) (fun x -&gt; x x) (fun x -&gt; x)



So the essence of the yin-yang puzzle is just self-application of self-application. How appropriate! As a last step, we can put in the print_char statements again, to get a one-liner:

(fun x -&gt; x (fun k -&gt; print_char '@'; x k)) (fun x -&gt; x (fun k -&gt; print_char '*'; x k)) (fun x -&gt; x)