好評だったので、(といってもtwitterで5,6人にリツイートされただけですが)
今回は、ラムダ計算を日本語で作ってみました。
:- op(1200,xfx,ならば).
:- op(1000,xfy,かつ).
:- op(750,xfx,[の環境で]).
:- op(720,xf,[の要素]).
:- op(700,xfx,が).
:- op(700,xfx,[を評価すると,の型は]).
:- op(20,xf,[で関数適用,が変数,が整数]).
:- op(10,xfx,[を]).
term_expansion(A ならば B,B:-A).
A,B ならば A かつ B.
integer(A) ならば A が整数.
atom(A) ならば A が変数.
B is A ならば A が B.
A が (_,A) の要素.
A が E の要素 ならば A が (E,_) の要素.
% 評価規則
I が整数 ならば _ の環境で I を評価すると I.
E の環境で T1 を評価すると V1 かつ E の環境で T2 を評価すると V2 かつ V1+V2 が C
ならば E の環境で T1+T2 を評価すると C.
E の環境で T1 を評価すると V1 かつ E の環境で T2 を評価すると V2 かつ V1-V2 が C
ならば E の環境で T1-T2 を評価すると C.
E の環境で T1 を評価すると V1 かつ E の環境で T2 を評価すると V2 かつ V1*V2 が C
ならば E の環境で T1*T2 を評価すると C.
E の環境で T1 を評価すると V1 かつ E の環境で T2 を評価すると V2 かつ V1 div V2 が C
ならば E の環境で T1/T2 を評価すると C.
X が変数 かつ (X=V) が E の要素 ならば E の環境で X を評価すると V.
E の環境で 'ラムダ抽象'(X,T) を評価すると 'クロージャ'(E, X, T).
E の環境で T1 を評価すると 'クロージャ'(E1,X,T), E の環境で T2 を評価すると V2 かつ
(E1,X=V2) の環境で T を評価すると V
ならば E の環境で T1 を T2 で関数適用 を評価すると V.
:- '空' の環境で 'ラムダ抽象'(x,x+1) を評価すると 'クロージャ'('空',x,x+1).
:- '空' の環境で 1 を評価すると 1.
:- ('空',x=10) の環境で x を評価すると 10.
:- '空' の環境で 'ラムダ抽象'(x,x+1) を 1 で関数適用 を評価すると 2.
:- halt.
日本語でラムダ計算を実装して実行してみることが出来ます。
たしかに面白いけど、こんな、わけのわからないことをして何の意味があるのだとお思いかも知れません。しかしそう思うことこそが、日本のIT教育の敗北であるように思います。なぜならば、ここに書いてあるプログラムの内容は計算機科学の初歩の初歩であるからです。日本語で書けば読みやすいけれども、長くなるし、国際的に共有しづらいものであるからこそ、記号を使った式が有効であるのです。はじめに定義を書いておき、その定義を使って文章を書くということは、論理的に整合性の取れた文章を書くことにもつながるのですから。