# Lambda Calculus
## Boolean logic
```
TRUE := λt. λf. t
FALSE := λt. λf. f
IF_THEN_ELSE := λl. λm. λn. l m n
OR := λl. λr. l l r
AND := λl. λr. l r l
IS_ZERO := λn. n (λx. FALSE) TRUE
LEQ := λm. λn. IS_ZERO (SUB m n)
```
## Arithmetic
```
c_0 := λs. λz. z
c_1 := λs. λz. s z
c_2 := λs. λz. s (s z)
SUCC := λn. λs. λz. s (n s z)
PLUS := λm. λn. λs. λz. m s (n s z)
PRED := λn. λf. λx. n (λg. λh. h (g f)) (λu. x) (λu. u)
SUB := λm. λn. n PRED m
mult := λm. λn. m (PLUS n) c0
POW := λm. λn. n m
```
## Data Structures
```
PAIR := λx. λy. λf. f x y
FIRST := λp. p TRUE
SECOND := λp. p FALSE
```
# Racket
- [Quick: An Introduction to Racket with Pictures](https://docs.racket-lang.org/quick/)
# Haskell
- [CodeWorld](https://code.world/haskell)
- [CodeWorld Docs](https://code.world/doc.html?shelf=help/haskell.shelf)
# Prolog
- [SWISH](https://swish.swi-prolog.org/)
- [SWISH Docs](https://www.swi-prolog.org/pldoc/man?section=builtin)
-
```prolog
```
# Miscellaneous
True or false? Racket expressions are evaluated using call-by-value strategy.
??