こわくない CPL (0) CPLの導入
圏論プログラミング言語 CPL - M59のブログでは、CPLの紹介と、データ型についての考察をしました。ここでは、理屈抜きでCPLで遊ぶための記事を書きます。CPLで実際にプログラムが書けるようになるのが目的です。
CPLのインストール
CPL: An interpreter of Hagino's Categorical Programming Language (CPL).
cabalを使ってインストールできます。こんな感じにインストールしました。自分の環境ではreadlineが使えなかったので、-f -Readlineオプションを指定しています。Readlineが使えなくても、Haskelineがかわりに使われるので問題ありませんでした。
cabal get cpl cd CPL-0.0.7 cabal sandbox init cabal install --bindir ~/.cabal/bin --datadir ~/.cabal/share -f -Readline
CPLを起動してみましょう。
% cpl Categorical Programming Language (Haskell version) version 0.0.7 Type help for help cpl>
とりあえず、helpコマンドを使って、どのようなコマンドが使えるか調べましょう。
cpl> help exit exit the interpreter quit ditto bye ditto edit enter editing mode simp [full] <exp> evaluate expression show <exp> print type of expression show object <functor> print information of functor load <filename> load from file set trace [on|off] enable/disable trace reset remove all definitions
cplはexitでもquitでもbyeでも終了できます。
cpl> bye %
プログラムの読込み
下のCPLのプログラムをコピーして、fib.cplなどといったファイル名で保存してください。
# 終対象 right object 𝟙 with ! is end object; # 積 right object prod(a, b) with pair is π₁: prod -> a π₂: prod -> b end object; # 冪 right object exp(a, b) with λ is ev: prod(exp, b) -> a end object; # 自然数 left object ℕ with pr is 0: 𝟙 -> ℕ s: ℕ -> ℕ end object; # 加算 let add = ev.prod(pr(λ(π₂), exp(s, I)), I); # フィボナッチ数 let fib = π₁.pr(pair(0, s.0), pair(π₂, add)); # fib(6)を計算する simp fib.s.s.s.s.s.s.0;
cplコマンドにファイル名を渡すと、データ型が定義され、プログラムが実行されます。
% cpl fib.cpl
Categorical Programming Language (Haskell version)
version 0.0.7
Type help for help
> right object 𝟙 with ! is
> end object
right object 𝟙 is defined
> right object prod(a, b) with pair is
> π₁: prod -> a
> π₂: prod -> b
> end object
right object prod(+,+) is defined
> right object exp(a, b) with λ is
> ev: prod(exp, b) -> a
> end object
right object exp(+,-) is defined
> left object ℕ with pr is
> 0: 𝟙 -> ℕ
> s: ℕ -> ℕ
> end object
left object ℕ is defined
> let add = ev.prod(pr(λ(π₂), exp(s, I)), I)
add = ev.prod(pr(λ(π₂),exp(s,I)),I)
: prod(ℕ,ℕ) -> ℕ
> let fib = π₁.pr(pair(0, s.0), pair(π₂, add))
fib = π₁.pr(pair(0,s.0),pair(π₂,add))
: ℕ -> ℕ
> simp fib.s.s.s.s.s.s.0
s.s.s.s.s.s.s.s.0
: 𝟙 -> ℕ
%-iオプションを付けると、ファイルを読み込んだ後、インタラクティブモードに入ります。
% cpl fib.cpl -i
Categorical Programming Language (Haskell version)
version 0.0.7
...
> simp fib.s.s.s.s.s.s.0
s.s.s.s.s.s.s.s.0
: 𝟙 -> ℕ
cpl>
実行時トレース
set traceコマンドで、実行時のトレースのオン・オフを切り替えられます。
cpl> set trace on
cpl> simp fib.s.0
0:fib.s.0*I
1[1]:s.0*I
2[2]:0*I
3[1]:s*0
4:fib*s.0
5:π₁.pr(pair(0,s.0),pair(π₂,add))*s.0
6[1]:pr(pair(0,s.0),pair(π₂,add))*s.0
7[1]:pair(π₂,add).pr(pair(0,s.0),pair(π₂,add))*0
8[2]:pr(pair(0,s.0),pair(π₂,add))*0
9[2]:pair(0,s.0)*I
10[1]:pair(π₂,add)*pair(0,s.0)
11:π₁*pair(π₂,add).pair(0,s.0)
12:π₂*pair(0,s.0)
13:s.0*I
14[1]:0*I
15:s*0
16:I*s.0
s.0
: 𝟙 -> ℕ
cpl>