4

したがって、私はプロローグが初めてで、型チェッカーを実装することになっています。具体的にどうすればいいのでしょうか?これは例です:

String s; int i; i = s.length(); // OK (example given in the homework)

どのように入力するのか教授に聞いたところ、次のようになります。

instance(s, string).

これは素晴らしいことですが、これが行われた場合を除いて、クエリの終了時に i の統合が失われるため、言うと、ファクトに等しいと言って、そのように呼び出すと、

equals(i, s, '.', 'length').

私が何であるかを確認するにはどうすればよいですか。そのため、どこから始めればよいかを知るのに苦労しています。それは宿題なので、アドバイスが欲しいだけです。最初のプロローグプロジェクトをどのように進めるかを理解するのに役立ちます。前もって感謝します。

編集:割り当て

JLS に従って、特定の Java プログラムのメソッド呼び出しを型チェックできる Prolog プログラムを作成します。ファクト ベースは、作成した重要な Java プログラムで定義されたメソッドの任意のエンコーディングに
加えて、最低限、以下にリストされているものにすることができます。クエリ
モードでは、潜在的な一致をチェックする必要があります。たとえば、「println(string)」を許可します。不要な JLS ルールをエンコードする必要はありません。(上の例は一例です。)

4

1 に答える 1

4

出発点として、以下を意図しました。これが私の形式化です:

type(string).

string は、変数がインスタンスになるために使用可能な型であることを意味します

signature(=, [X, X, nil]).

は、中置演算子 = が同じ型の 2 つの引数を取り、何も返さないことを意味します。

is_instance(X, Y)

Xこれは型のインスタンスであることを意味します。物事をテストするために、述語Y の変数に含まれる「ステートメント」のリストを作成しました。次に、問題がないか再帰的にテストします。3 番目の句を再帰呼び出しとして実装して、式で型が適切かどうかを確認する必要があります。Inputtest/0

私がしたことは、最初の主check/2節でinstance/2用語を処理し、次の節で残りのすべてを処理することです。

:- dynamic is_instance/2.

type(string).
type(int).

signature(=, [X, X, nil]).

test :-
    retractall(is_instance(_, _)),
    Input = [instance(s, string), instance(i, int), =(i, length(s))],
    check(Input, ReturnTypes),

check([], []).
check([instance(Variable, Type)|Terms], [nil|ReturnTypes]) :-
    !,
    ( is_instance(Variable, _) -> syntax_error('Variable already declared')
    ; \+ type(Type) -> syntax_error('Using a non-existing type'),
    ; Term =.. [is_instance, Variable, Type],
      assertz(Term)),
    check(Terms, ReturnTypes).

check([Term|Terms], [Type|ReturnTypes]) :-
    Term =.. [Name|Arguments],
    % Here we have to call ourselves with our list of arguments
    % and then check that everything is fine and then we'll unify Type
    % with the return value of Name.
    check(Terms, ReturnTypes).

始めるのに役立つことを願っています。

于 2012-04-26T20:09:42.270 に答える