Skip to content

Instantly share code, notes, and snippets.

@amuradyan
Last active May 24, 2022 18:22
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save amuradyan/b1b391bcd1ac91ba85a04b6de4ddd6fa to your computer and use it in GitHub Desktop.
Save amuradyan/b1b391bcd1ac91ba85a04b6de4ddd6fa to your computer and use it in GitHub Desktop.
Some Church encodings
type Boolian = (Any, Any) => Any
val troo = (a: Any, _: Any) => a
val fols = (_: Any, b: Any) => b
// Logic
val not = (b: Boolian) => b(fols, troo)
not(troo) == fols
not(fols) == troo
val and = (b1: Boolian, b2: Boolian) => b1(b2(troo, fols), fols)
and(troo, troo) == troo
and(troo, fols) == fols
and(fols, troo) == fols
and(fols, fols) == fols
val or = (b1: Boolian, b2: Boolian) => b1(troo, b2(troo, fols))
or(troo, troo) == troo
or(troo, fols) == troo
or(fols, troo) == troo
or(fols, fols) == fols
// Branching
val eef = (p: Boolian, p1: Any, p2: Any) => p(p1, p2)
eef(troo, "yay", "nay")
eef(fols, "yay", "nay")
val yourNameIsJosh: Boolian = troo
val yourNameIsNotJosh: Boolian = fols
val youAreFromNY: Boolian = troo
val youAreNotFromNY: Boolian = fols
val areYouJoshFromNY = (isYourNameJosh: Boolian, areYouFromNY: Boolian) =>
and(isYourNameJosh, areYouFromNY).asInstanceOf[Boolian]
eef(areYouJoshFromNY(yourNameIsJosh, youAreFromNY), "yay", "nay")
eef(areYouJoshFromNY(yourNameIsJosh, youAreNotFromNY), "yay", "nay")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment