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っぽいことができるのかな?