ETIを使ってみる。
とりあえず、わけがわからんといっていても仕方ないので、
ETを勉強してみます。
http://assam.cims.hokudai.ac.jp/et/indexj.html
ここから、ダウンロード。
コンソール版自己解凍を選びました。
適当にダブルクリックで、デスクトップに回答されます。
eti.exeを実行すると、とりあえず、プロンプトが
[D]>
のようにでます。
DってのがD言語好きな俺的に嬉しい。関係ないけど。
[D]>exit
で終了できます。
ETプログラミング入門テキスト
http://assam.cims.hokudai.ac.jp/ettext/druletext.html
を見ながら、
いきなり、第5章みて、プログラムを作ってみる。
// たし算のテスト (test *X) --> (:= *X (+ 1 2)).
をtest.etrとして保存。
>eti [D]>help d : Change the execution mode to D. n : Change the execution mode to N. load "filename" : Load rules (All previous rules will be deleted.) include "filename" : Add rules. l : Reload current rules. Ctrl+c : Suspend an execution and go into step mode. dd : Toggle the debug mode for D rules. sd : Go into step excution mode D. sn : Go into step execution mode N. dn : Toggle the debug mode for N rules. nr : Show N rules. ex : Toggle exhaustive computation mode. f [filename]: Start logging. cf : Stop logging. r [n] : Retry a previous command. [n] is a number. hist : Show histy of previous commands. dr : Show D rules. sr : Show S-expressions when ETI reads ET rules. (textCode {UNICODE|ASCII}) : Toggle text code which ETI can read and/or write. v : Toggle verbose mode. version : Show the current version. q: Quit ETI. --- More --- sm : Change the syntax mode into S-expression mode. rm : Change the syntax mode into R-expression mode.
helpでヘルプが見れて、load ってのでルールをロードできますので
[D]>load "test.etr" [D]>(test *X) -------------------------D execution --------------------- ---------------------------------------------------------- succeeded. (test 3) execution time: 0 [msec]
となります。
うーむ。lispで出来たprologって感じしか、しないんですけど。
ためしに、以下のことをやってみる。
(test2 *X *A *B) --> (:= *X (+ *A *B)).
をtest.etrに書き加えて、
[D]>load "test.etr" [D]>(test2 *X 1 2) -------------------------D execution --------------------- ---------------------------------------------------------- succeeded. (test2 3 1 2) execution time: 0 [msec]
足し算結果も入ってるとふむ。
[D]>(test2 *X 5 10) -------------------------D execution --------------------- ---------------------------------------------------------- succeeded. (test2 3 1 2) execution time: 0 [msec] [D]>(test2 *X 5 10) -------------------------D execution --------------------- ---------------------------------------------------------- succeeded. (test2 15 5 10) execution time: 0 [msec] [D]>(test2 5 *Y 10) -------------------------D execution --------------------- An illegal calculation.
うーん。*Y求まらないのかぁ。謎だ。prologならもとまると思うんですけど。
次、第6章を見る。
(cube *N *X) --> (:= *X (x (x *N *N) *N)). // 意味:{*Nの三乗が*Xであるという条件(cube)は、 // *X=*N×*N×*Nという条件に置き換えることができる}
をtest.etrに追加。
[D]>load "test.etr" [D]>(cube 3 *X) -------------------------D execution --------------------- ---------------------------------------------------------- succeeded. (cube 3 27) execution time: 0 [msec]
3乗ですなぁ。xでかけるのかぁ。
[D]>load "test.etr" [D]>(cube 3 *X) -------------------------D execution --------------------- ---------------------------------------------------------- succeeded. (cube 3 27) execution time: 0 [msec] [D]>(cube *N 125) -------------------------D execution --------------------- An illegal calculation. [D]>(cube 3 30) -------------------------D execution --------------------- ---------------------------------------------------------- failed. (:= 30 (x (x 3 3) 3)) execution time: 0 [msec] [D]>(cube 2 8) -------------------------D execution --------------------- ---------------------------------------------------------- succeeded. (cube 2 8) execution time: 1 [msec] [D]>(cube 3 *X) -------------------------D execution --------------------- ---------------------------------------------------------- succeeded. (cube 3 27) execution time: 0 [msec]
こんな結果。計算して合ってればsucceeded.あってないときはfailed.
計算できないときは、 An illegal caluclation.
ってかんじですかねぇ。
(pay *N *P) --> (:= *X (x 200 *N)), (:= *P (d (x *X 105) 100)). // 意味:{りんごを*N個買ったときの金額が*Pであるという条件(pay)は、 // *X=200×*Nを計算し、次に*P=*X×105÷100を計算するという条件に置き換えることができる}
をtest.etrに追加して保存。
[D]>load "test.etr" [D]>(pay 10 *x) -------------------------D execution --------------------- ---------------------------------------------------------- succeeded. (pay 10 2100) execution time: 1 [msec] [D]>(pay *x 10) -------------------------D execution --------------------- An unknown parameter is given.
10個りんご買ったら、2100円とあたりまえじゃないかと。
言うかんじ。
逐次実行してるだけなんじゃねーとか思ったり。
(divrem *A *B *X *Y) --> (:= *X (d *A *B)),(:= *Y (mod *A *B)). // 意味:{*A、*B、*X、*Yがdivremを満たすという条件は、*X=*A÷*Bを計算し、 // *A÷*Bの余り*Yを計算するという条件に置き換えることができる} (even *N) --> (:= *M (mod *N 2)),(== *M 0). // 意味:{*Nが偶数である条件は、*Nを2で割ったときの余り*Mが0 // と等しくなるという条件に置き換えることができる。} (equal *A *A) --> . // 意味:{*Aと*Aは等しい(equal)という条件は、 // 真である(無条件を意味する0個のアトム列に置き換えることができる)。}
をtest.etrに書いて
[D]>load "test.etr" [D]>(divrem 10 3 *x *y) -------------------------D execution --------------------- ---------------------------------------------------------- succeeded. (divrem 10 3 3 1) execution time: 0 [msec] [D]>(even 10) -------------------------D execution --------------------- ---------------------------------------------------------- succeeded. (even 10) execution time: 0 [msec] [D]>(even 11) -------------------------D execution --------------------- ---------------------------------------------------------- failed. (== 1 0) execution time: 0 [msec] [D]>(equal *X *X) -------------------------D execution --------------------- ---------------------------------------------------------- succeeded. (equal *A *A) execution time: 0 [msec] [D]>(equal *X *Y) -------------------------D execution --------------------- ---------------------------------------------------------- failed. (equal *A *B) execution time: 0 [msec]
うーむ。とりあえず、動いてます。
まだ、『で?』って感じです。
マッチする、lispってな感じにしか思えないんですけど。
マッチングするってことは、haskellっぽいことができるのかな?