Skip to content

Instantly share code, notes, and snippets.

@takanuva
Last active March 11, 2020 16:42
Show Gist options
  • Save takanuva/99e6261bfbfdf4b13f00f8d62acd0399 to your computer and use it in GitHub Desktop.
Save takanuva/99e6261bfbfdf4b13f00f8d62acd0399 to your computer and use it in GitHub Desktop.
Conversion between Scott encoding and Church endocing for naturals in CoC
\/(N: *) ->
\/(z: N) ->
\/(s: N -> N) ->
N
./ChurchSucc ./ChurchZero
\(n: ./Church ) ->
\(N: *) ->
\(z: N) ->
\(s: N -> N) ->
s (n N z s)
./ChurchSucc ./ChurchTwo
\(n: ./Church ) ->
n ./Scott ./ScottZero ./ScottSucc
./ChurchSucc ./ChurchOne
\(N: *) ->
\(z: N) ->
\(s: N -> N) ->
z
./ScottToChurch
(./ScottSucc
(./ChurchToScott
(./ChurchSucc
(./ScottToChurch ./ScottThree ))))
\(F: * -> *) ->
\/(A: *) ->
(F A -> A) ->
A
./ScottF (./Mu ./ScottF )
\(n: ./Scott ) ->
\(R: *) ->
\(a: R) ->
\(f: ./Scott -> R) ->
n R a (\(x: ./Mu ./ScottF ) -> f (./ScottOut x))
\(X: *) -> \/(R: *) -> R -> (X -> R) -> R
\(X: *) ->
\(Y: *) ->
\(f: X -> Y) ->
\(x: ./ScottF X) ->
\(R: *) ->
\(r: R) ->
\(ym: Y -> R) ->
x R r (\(xv: X) -> ym (f xv))
\(X: *) ->
\(k: ./ScottF X -> X) ->
\(t: ./Mu ./ScottF ) ->
t X k
\(s: ./Scott ) ->
\(X: *) ->
\(k: ./ScottF X -> X) ->
k ((./ScottFmap (./Mu ./ScottF ) X) (./ScottFold X k) s)
./ScottSucc ./ScottZero
\(t: ./Mu ./ScottF ) ->
./ScottFold (./Scott ) (./ScottFmap (./Scott ) (./Mu ./ScottF ) ./ScottIn ) t
\(n: ./Scott ) ->
./ScottCase n ./Scott ./ScottZero (\(pred: ./Scott ) -> pred)
\(n: ./Scott ) ->
\(X: *) ->
\(x: X) ->
\(y: ./Mu ./ScottF -> X) ->
y (./ScottIn n)
./ScottSucc ./ScottTwo
\(n: ./Scott ) ->
./ScottFold
./Church
(\(k: ./ScottF ./Church ) -> k ./Church ./ChurchZero ./ChurchSucc )
(./ScottIn n)
./ScottSucc ./ScottOne
\(X: *) ->
\(x: X) ->
\(y: ./Mu ./ScottF -> X) ->
x
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment