圏論プログラミング言語CPLをやってみようと思う。
言語の説明は参考記事にまかせます。
まあ、Esotericな言語です。
参考記事
インストールだけど、
GitHubからクローンして、stack run cpl
が良いと思う。
(2回目からはexeを直接叩く)
cabalコマンドは使わない方が良いと思う。
今回のプログラムは、
終対象、積、冪、自然数を定義したのち、
関数pred
を定義する。
pred
は自然数を-1
する関数で、pred 0
は0
のままだ。
で、pred
の定義がこちら。
let pred = pi2.pr(pair(o, o), pair(s.pi1, pi1));
さっぱり分かりませんね!
なので動きを追ってみましょう。
> set trace on
で簡約の様子が見られるようになります。
......
自然数の仲介射pr
の動きがキモなのですが、
要は以下のように、s
を第二引数に、o
を第一引数に、置換するのです。
pr(X, Y).s.s.o => Y.Y.X pi2.pr( pair(o, o), pair(s.pi1, pi1) ).s.s.o => pi2.pair(s.pi1, pi1).pair(s.pi1, pi1).pair(o, o) ...(イ)
pi1
はpair(,)
の第一要素を取り、pi2
はpair(,)
の第二要素を取ります。
(イ)において、s.pi1
は元の自然数と同数あるのですが、
いちばん頭がpi2
なので、s
を一つ取らないのですね。
よってpred
の動きが実現されるのです。
全然実用的じゃなーい!
パズルとしては面白いかも。