ADPの開発者へのコメントはこちらのコメント欄からお願いいたします。
コメントですが、リアルタイムで反映されます。ネチケットを守って頂くのと、ライセンスを無視した無理な注文は御控えください(場合によってはコメントを削除いたします)。
何分開発者がやっていますのでコメントの返信はタイムラグがあることをご了承ください。
ADPは、Prologからユニフィケーションとバックトラックを借りてきていますが、構文等については、皆様(というか私自身が)とっつきやすいように、普通の言語と同様にしています。
例えば、変数は$で始まるとか、文字列はクオート("や')で囲むとかはPrologとは違います。そのほかホーン節の定義も少し違うのですが、これは私が元としたPrologの方言から来ています。
また、何より決定的に違う面があるのですが、ADPには
・代入
・next述語によるバックトラック後に失敗せずに評価を続ける機能
があります。
代入は副作用を伴いますので、論理型言語であるPrologには代入がありません。しかし、プログラムを作成する上では代入は便利だと考え、ADPは代入をサポートしています。
また、Prologでは、バックトラックで全件を探索するにはfail述語を使い、最終的には失敗でプログラムが終了します。
これはこれでよいのかもしれませんが、ADPではnextという述語を用意し、失敗せずに全件探索を行うことができます。
Prologには、findall述語があり、この述語により全探索の結果をリスト化します。
ADPは代入とnext述語を用いて全探索結果のリスト化ができます。あくまでも私見ですが、代入とnext述語によりADPの方がより表現力が増しているかと思います。
next述語の説明
ADPですが、通常の言語をマスターした人にとって基本的にあまり難しいことを考えなくても良いように、Prologのエッセンス(よいところ)だけを引き出すようにデザインしています。
私は、職業プログラマですが、プログラミング言語を仕事で作る機会はありませんでした。趣味ではちょこちょこやっていた程度です。今回ADPを作るにあったって以下の2点で、C++の仮想関数を使いました。
・パーサー
・ユニフィケーション
ADPの文法ですが、パーサーが書きやすいように作成しています。つまり、変数は$で始まるとか文字列は"や'で始まるとか最初の一文字を読んだ時点で言語要素が判るようにしています。そのタイミングで対応するオブジェクトを作成し、そのオブジェクトでコンパイルを実行するということをやっています。ユニフィケーションも同様にオブジェクト間のマッチングを仮想関数(マルチメソッド)で行っています。
あと、STLを使っているのですが、vectorとかstringを普通に使用していますので、大変楽に開発ができています。
C++を選んだ欠点ですが、他言語インタフェースでCを呼び出す時、オブジェクトの変換が必要になることです。これはオーバーヘッドになりますので、悩ましいところです。もっともC++を呼び出すようにすればオーバーヘッドはなくなりますがC++しかダメってのもな・・・。
どうも、知り合いからのアクセスが多いようなので、たまには軽めの記事をアップします。
私の英語力は元々は、かなりひどく
『高校でかろうじて赤点を取らなかった』
というレベルで、英語の文章はまったく読めなかったのですが、
30歳頃に猛勉強してやっと少し技術文書が読めるようになりました。
それでもTOEICで450点ぐらいだったので元のレベルの低さがわかるでしょう。
その後、結婚して、ヨメさんが外国人としゃべっているのを見て、
『オレもできるのでは?』
という甘い考えで英語の学校(GEOS)に通ったりしました。
以来、仕事で使うわけでもないのであまり上達せずに、授業料を浪費すること、数年が経ち、去年とある資格を受験するために英語の実力が知りたく英検の準2級を受けました。
準2級というと、
英検のページから引用させていただきますと、
日常生活に必要な英語を理解し、また使用することができる。
とのことですが、私自身そんなに実力があるとも思えないのですが・・・まぁ使うことがないのでなんとも言えないところです。
準2級のテストですが、ほとんどが中高生(もうかなりのおっさんなので区別がつかない)で、おっさん、もとい社会人の方はほとんど受験していなくて、面接でも同年代の男性が審査官をやっていたのですが、審査官の方もお子様相手に疲れていたらしく、私の顔をみるなり安堵の表情を浮かべていました。
『社会人になって英語を勉強するとは素晴らしい』
というオーラが伝わり、逆にちょっと引いてしましました。
テストの結果は合格でしたが、多少優遇されていたのでは? とも思いましたが、次の2級のテストで一次試験が通ったところを見ますとどうやら実力のようです。ちなみに2級の一次試験では社会人の受験者が多かったので、
『社会人の英検受験は2級から』
のようです。
で、2次試験ですが、急な仕事が入った為、休みまして、次の回で2次試験を受けます。
WEB-DB用の言語としてベースにPrologを選んだわけですが、(注)あくまでもベースであって基本的に別ものになっています。
なぜ、Prologを選んだかと言いますと、
PrologはRDBとの相性が良い
ということに尽きるかと思います。PrologとRDBの類似性自体はPrologを知る多くの人が感じていることだと思います。
Prologの教科書を読むと必ずと言っていい程、家系図の例題が出ますが、家系図自体がデータベースそのものでしょう。
一方で、インピーダンスミスマッチと言わるぐらい、他の言語(主にオブジェクト指向言語)とRDBはあまり相性がよくないです。O/Rマッパーのようなものを誰しも一度は作ると思いますが、私も実際にJavaでO/Rマッパーを作ってみましたが、どうも今一つでありました。もっとも3年程前に、Ruby On Rails(RoR)を触ってみましたが、RoRにはものすごい力を感じました。一時はADPの開発を止めようかと思いましたが、Ruby実行速度がいまいち(特にWindows版)なのとRuby自体は比較的難解な言語なので続けることにしました。
私はPrologには精通していません。学生自体にちょっとかじった程度です。ですので、Prologの文法や規格をきちんと把握していません。その中でPrologの動作についていまひとつ理解できない部分がありましたので、であればということでADPの文法はオリジナルのものとなっています。