1

型付けされていない言語でカスタム型推論言語を使用するプロジェクトの実現可能性を調査しようとしています。(言語自体は重要ではありませんが、たまたま PHP です)。私の最初のアイデアは、これで型の統一を実行することです。私は Haskell で少しプログラミングしたことがあるので、エンドユーザーの観点から型の統一がどのように機能するかは知っていますが、アルゴリズムの詳細を深く掘り下げたことはありません。

この時点で、PHP コード ファイルを解析し、対応する一連のルールを作成して、それらのルールに対して統合アルゴリズムの実行を開始したいと考えています。車輪を再発明するのではなく、既存の統合アルゴリズムを使用することにしました。AFIAK の Prolog は、最も堅牢な統合アルゴリズムの 1 つです。

検証可能な正しい入力を渡すと、Prolog は "true" を返します。正しくないものを渡すと、"false" が返されます。このシナリオで本当に必要なのは、型が統合されなかった理由を示すエラー メッセージを取得することです。SWI-Prolog で「トレース」モードをオンにすると、多かれ少なかれ探しているもの、型が統合されなかった理由の段階的な説明が得られます。私の中心的な質問は、この情報をプログラムで取得することは可能ですか? 私は C 拡張機能を書き、それが必要であれば Prolog コンパイラに直接リンクするつもりです。また、私は SWI-Prolog とは何の関係もありません。Google で最初に見つけたものです。

また、余談ですが、ウェブ形式または実際の本として、プロローグの優れたチュートリアルを知っている人はいますか?

4

1 に答える 1

2

トレースを使用すると、統合が失敗した理由の詳細な情報は得られませんが、どの目標が失敗したかについての情報は得られると思います。

後者の情報が必要な場合は、コードを計測するという点で、自分でこれを行うことができます。すべての目標を置き換えるだけです

 .. A ..

次のコードで:

 .. in(A), A, out(A) ..

次の定義を使用します。

 in(A) :- write('call '), write(A), nl.
 in(A) :- write('fail '), write(A), nl, fail.

 out(A) :- write('exit '), write(A), nl.
 out(A) :- write('redo '), write(A), nl, fail.

もちろん、 write/1 および nl/0 ステートメントを自分に合ったものに置き換えることができます。ここに例があります。最初にインストルメント化された Prolog テキスト:

?- [user].
mem(X,[X|_]).
mem(X,[_|Y]) :- in(mem(X,Y)), mem(X,Y), out(mem(X,Y)).
^D

次に、インストルメント化されたクエリ:

?- in(mem(X,[1,2])), mem(X,[1,2]), out(mem(X,[1,2])).
call mem(_G1479,[1,2])
exit mem(1,[1,2])
X = 1 ;
redo mem(1,[1,2])
call mem(_G1479,[2])
exit mem(2,[2])
exit mem(2,[1,2])
X = 2 ;
redo mem(2,[1,2])
redo mem(2,[2])
call mem(_G1479,[])
fail mem(_G1479,[])
fail mem(_G1479,[2])
fail mem(_G1479,[1,2])
false.

さよなら

于 2013-04-01T07:09:18.327 に答える