patternMinor
Are there a lambda-mu expression equivalent to the yin yang puzzle?
Viewed 0 times
expressiontheequivalentareyinyangtherepuzzlelambda
Problem
The yin yang puzzle was written in Scheme. Since it uses call/cc, it is not possible to express it in a pure lambda expression, unless we do a CPS transform.
However, given the fact that $\lambda \mu$-calculus have the power to model call/cc, is it possible to write an equivalent $\lambda \mu$-expression? I am still learning $\lambda \mu$-deductions, so this would be a good example to show how the deduction works.
There is no need to model the "display" command in a pure expression. Ideally only showing how the calculus keep looping and evaluates diffident terms again and again.
UPDATE My translation in $\lambda$-expression with CPS:
In CPS,
Note the above translate is not full CPS, only the concept of call/cc has been translated. But it provides the same behavior and it is not hard to do a full CPS translate.
However, given the fact that $\lambda \mu$-calculus have the power to model call/cc, is it possible to write an equivalent $\lambda \mu$-expression? I am still learning $\lambda \mu$-deductions, so this would be a good example to show how the deduction works.
There is no need to model the "display" command in a pure expression. Ideally only showing how the calculus keep looping and evaluates diffident terms again and again.
UPDATE My translation in $\lambda$-expression with CPS:
(λcallcc.callcc (λyin.callcc (λyang.yin yang))(λcc.cc cc)In CPS,
(λcc.cc cc) is what "call with current continuation" means. So the expression takes it as a parameter. This will result in assign the sub-expression starts λyin assign its continuation into parameter yin. And then in the body, the second callcc assigns the yang of sub-expression starts λyang into itself. Finally, apply yin yang.Note the above translate is not full CPS, only the concept of call/cc has been translated. But it provides the same behavior and it is not hard to do a full CPS translate.
Solution
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
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
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
Clearly, the
We could remove the
-
Start with:
-
Reduce
-
Reduce
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
yin and yang to be ('a -> '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 -> x x) (fun k -> print_char '@'; c k) ;;
let yang c = callcc (fun x -> x x) (fun k -> print_char '*'; c k) ;;
let _ = yin yang (fun x -> x) ;;Clearly, the
let statements are just a convenience. Without them, and with callcc expanded out, we get:(fun c -> (fun x -> x x) (fun k -> print_char '@'; c k))
(fun c -> (fun x -> x x) (fun k -> print_char '*'; c k))
(fun x -> x)We could remove the
print_char statement and $\eta$-reduce:-
Start with:
(fun c -> (fun x -> x x) (fun k -> c k))
(fun c -> (fun x -> x x) (fun k -> c k))
(fun x -> x)-
Reduce
fun k -> c k to c:(fun c -> (fun x -> x x) c) (fun c -> (fun x -> x x) c) (fun x -> x)-
Reduce
fun c -> (fun x -> x x) c to fun x -> x x:(fun x -> x x) (fun x -> x x) (fun x -> 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 -> x (fun k -> print_char '@'; x k)) (fun x -> x (fun k -> print_char '*'; x k)) (fun x -> x)Code Snippets
let callcc f k = f k ;;
let yin c = callcc (fun x -> x x) (fun k -> print_char '@'; c k) ;;
let yang c = callcc (fun x -> x x) (fun k -> print_char '*'; c k) ;;
let _ = yin yang (fun x -> x) ;;(fun c -> (fun x -> x x) (fun k -> print_char '@'; c k))
(fun c -> (fun x -> x x) (fun k -> print_char '*'; c k))
(fun x -> x)(fun c -> (fun x -> x x) (fun k -> c k))
(fun c -> (fun x -> x x) (fun k -> c k))
(fun x -> x)(fun c -> (fun x -> x x) c) (fun c -> (fun x -> x x) c) (fun x -> x)(fun x -> x x) (fun x -> x x) (fun x -> x)Context
StackExchange Computer Science Q#11417, answer score: 3
Revisions (0)
No revisions yet.