第二種接近遭遇

もしかして、無関係のど素人がETに触れるってのは初なんじゃないか?あろはさんが妙に熱心なのは裏で貴重なサンプル扱いされてないか?研究室で皆で相談しつつ餌を撒いて無いか?…と妙な想像をしつつ。(妙に失礼だなオイ)
論理型言語に触れるのは、以前Prologを弄って記号の汚さに引き返してきた以来ですので、ちょっと楽しみだったり。
http://alohakun.blog7.fc2.com/blog-entry-248.htmlのコメントで紹介いただいたKL1の解説を読んでよくわからないままなんとなくイメージもつかめたよーなつかめてないよーな。
インタプリタを落としました。boost_regex-vc71-mt-p-1_33.dllがまず目につきました。eti window.etcとかでウィンドウが出るのもわかりました。Ctrl+Cでクラッシュするのもわかりました。
ではHello Worldいってみよー。

(as (hello)
  : (print "Hello World!"))
[D]>load "test.etc"

[D]>(hello)
-------------------------D execution ---------------------
"Hello World!"
----------------------------------------------------------
succeeded.
(hello)
execution time: 0 [msec]

[D]>

これはDルール実行モードらしい。
で、まあ、うまくいったので、次は評価戦略を探るために流行のたらいまわし関数。KL1の説明を読む限り、並列実行される各ルールの値を使う方は値が確定するまで待つそうなので、それは言い換えたら遅延評価のことでしょう。
えいやっと、こんなかな。

(tarai *X *Y ?Z *R),{(<= *X *Y)} --> (= *R *Y).
(tarai *X *Y *Z *R),{(>  *X *Y)} -->
	(:= *X1 (- *X 1)),
	(:= *Y1 (- *Y 1)),
	(:= *Z1 (- *Z 1)),
	(tarai *X1 *Y *Z *R1),
	(tarai *Y1 *Z *X *R2),
	(tarai *Z1 *X *Y *R3),
	(tarai *R1 *R2 *R3 *R).

…実際には勿論一発で書けたわけではなくピリオドが無いとかで何度か書き直してます。
では実行。12 6 0というパラメータは検索で上位に来ていた青木日記突込付を参考にさせていただきました。処理時間書いてくれてましたし。

[D]>(tarai 12 6 0 *R)
-------------------------D execution ---------------------

終わらねえ。
えー、何か間違えたでしょうか?

[D]>(tarai 3 2 0 *R),(print *R)
-------------------------D execution ---------------------
----------------------------------------------------------
succeeded.
(tarai 3 2 0 3)
execution time: 1 [msec]
-------------------------D execution ---------------------
3
----------------------------------------------------------
succeeded.
(print 3)
execution time: 0 [msec]

これぐらいの値なら終わりました。…この値は正しいのか?
先のところからHaskell版を丸ごといただいてきて、winhugsに投入。

Main> tarai 3 2 0
3
Main> tarai 12 6 0
12                       

一瞬です。
とりあえず値はあってるのかなー。
もしかD式だからいけないのでしょうか?N式であればうまくいく…?それとも単に恐ろしく遅いだけか?
やはり、さっぱりわかってない…といったあたりで続く。