標題: Erlang, Oz/Mozart, Prolog, 単一化
---
Erlangのこと、あれこれやってたから、弾さんのコメントがあった。
[URL]
そろそろerlangについて一言いっとくか
で、
--- ここから ---
変数束縛が
Variable = Value.
なのに、関数定義が
function(Aargument) -> blah, blah, blah.
てのはどうよ?
--- ここまで ---
と書いているが、弾さん、こんなのさ、どうよ?と挑発されたら、「お前がバ
カ」の一言で終わり。\(^O^)/
= が単なる変数束縛だと思っているところが、もう、アウト!\(^O^)/
これ、ココロは、Prologの単一化(ユニフィケーション, unification)なん
だよ。だから、関数定義とは別の記号を使っているんだと思うけどね。
ま、個人的には同じ記号だろうが別の記号だろうが、どうでもいいことだけ
ど、変数の束縛は単一化の特殊ケースだということは、知っておいていいと思
う。
HaskellやOCamlなどもそう思うし、Erlang, Oz/Mozart(MozartはOzの実装)
もそうだけど、Prolog以後のヨーロッパの言語って、Prolog的なものをうまく
入れてるなと思う。これらの言語にあるパターンマッチは、おれには全部
Prologの単一化の簡略版に思えるからね。
HaskellもOCamlもErlangもそうだけど、このパターンマッチは、Prologとは
違って、片方向なんだよね。
[URL]
Joe Armstrong著「Programming Erlang: Software for a Concurrent World」
では、= の動作は、Prologの単一化でバックトラックがないものくらいに考え
てくれなんて脚注があるが、片方向だと、フツー、単一化とは言いがたいので、
それでパターンマッチだといってるんだろうね。言葉も一般向けだし。
他の言語の = が片方向なのに比べ、Ozの = は双方向になっている。どうい
う意味かといえば、Ozで、X, Z, Bが宣言はされているが、未束縛だとすると、
[X 'b' Z] = ['a' B 'c']
と書いたら、Xは'a'、Zは'c'、Bは'b'になる。
ちゃんとした単一化だから。= の左辺と右辺の両方を書き換えてマッチさせ
ようとしているわけ。Oz言語の仕様を実装したMozartでやると実際そうなる。
プログラミングスタイルとしては、推奨されないようだが。
この辺のことは、たびたび紹介しているCTM、つまり、
[URL]
セイフ・ハリディ, ピーター・ヴァン・ロイ, 羽永洋訳「コンピュータプログ
ラミングの概念・技法・モデル」
でアルゴリズムも含めて詳しく書いてある。その他ぼくが書いたCTMのことは、
ウェブやブログにつけている検索窓に CTM を入れて検索してもらえば。
Oz/Mozart, CTMの補足については、このあと別に書く。
で、ふと、思ったのが、いま、日本では関数型言語が注目されているなどと
いうが、最近、関数型言語に触れた人は、Prologや単一化や論理型プログラミ
ングや制約プログラミングなど、全然、知らないんじゃないかと。
弾さんですら、あんなこと書いているくらいだし。\(^O^)/
おれも、ほとんど知らないけどさ。\(^O^)/
知らないけど、知ったことにして、人に薦めて焚きつけてしまうのがおれの
すごいところ。\(^O^)/
そこで、我が情報省は、緊急アンケートをした。\(^O^)/
関数型言語をかじった人、1000人に聞きました。
おい、日本にかじった奴、1000人もいないと思うぞ。
そ、そうか。^^; じゃ、100人に聞きました。あなたは、Prologや単一化や
論理型プログラミングを知っていますか?
そしたら、あなた、100人中3.5人しか知りませんでした。\(^O^)/
ほんとかよ、そのアンケート。
まあ、そういうことにしないと後の話につながらないので、テキトーよ。こ
セコメントをする