歴史的な問題なんだけど、構文が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:
Post a Comment