Sunday, 12 April 2009

Erlang

某氏がはまっているらしい。Erisson なんだよね。ホームパーティの準備の合間に、ちょっと復習してみました。

 http://erlang.org/

歴史的な問題なんだけど、構文がProlog。なんだけど、Backtrackは無い。ってことは、cut がない。と言うことは Unification を除く Prolog の厄介な部分はほとんどありません。Prolog は述語でtrue/false だけど、Erlang は値を返す。

 X = a, X(1).

みたいなことができる(構文は違うけど、Hilogっぽい)。spawn とか stream 通信とかが入ってる(Delta Prolog like)。悪くは無いです。

初心者がPrologで「普通の言語と違う〜」と思ったところを全部、普通の言語っぽく直した言語っつう感じ。

  -module(ap).
  -export([ap/2,rev/1]).

  ap([],X) -> X;
  ap([H|X],Y) -> [H|ap(X,Y)].

  rev(X) -> rev(X,[]).
  rev([],X) -> X;
  rev([H|X],Y) -> rev(X,[H|Y]).

Prolog だと、

  ap([],X,X).
  ap([H|X],Y,[H|Z]):-ap(X,Y,Z).

  rev(X,Y) :- rev(X,[],Y).
  rev([],X,X).
  rev([H|X],Y,Z):-rev(X,[H|Y],Z).

ってな感じ。似てるっちゃ似てるが、違うと言えば違う。DCG使うのに近いかも。

前に見た時にも、Prolog で全部できるんだからPrologで良いじゃん、とか思った。

実装的にはBacktrackない方が簡単だし、理解もしやすいけどね。

Prologの論理的意味論はどうするとか無くもないけど、Prologだって差分リスト使いまくりだと、意味論もへったくれも無くなってしまうので、それほどえばれない。

Unification があるので、並列実行での代入の遅延に対処しやすいのかな?

top level のEshell からの抜け方がわからない。C-\ で取り敢えず抜けるらしい。X=1 とかのbinding がEshellで二度と外せないのは、どうかな。X=1, X1=2, X2=3... とかやるんだろうか〜

No comments: