2012-04-26 10 views
4

私はプロローグには新しく、タイプチェッカーを実装すると思います。どのくらい私はそれについて行く必要がありますか?これは、例えば次のようになります。プロローグでタイプチェッカーを行うにはどうすればいいですか?

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

私は物事が入力されますどのように教授に尋ねられたとき、それは次のようになります。

instance(s, string). 

は、これが行われている場合を除いて、ために統一を素晴らしい厥私は、クエリの終了時に失われたので、私は発言権を作るとしたら、

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

がどのように私は私が何であるかを確認することができ、実際に等しく、そのようにそれを呼び出しています。だから私はちょうどどこから始めるべきかを知るのに苦労している。その宿題は、ちょうど助言がほしいのですが、私の最初のプロローグプロジェクトについての理解の仕方を助けてください。前もって感謝します。

EDIT:割り当て

はJLSに応じて指定されたJavaプログラム のためのメソッド呼び出しをチェック入力できPrologのプログラムを書きます。事実ベースは、あなたが書いた任意のJavaプログラム
Javaプログラムで定義されたメソッドの任意のコード化でもよく、また、以下にリストされたものである必要はありません。クエリ
モードでは、一致する可能性のあるものをチェックする必要があります。例えば ​​"println(string)"を許可する。 は、必要のないJLSルールをエンコードしないでください。 (与えられた例の1つは、上記のものです。)

+0

Javaのような言語のためにPrologで型チェッカーを実装することは、Prologでの適切な最初の割り当てではありません。最初にPrologを学ばなければなりません! – false

+0

これは、いくつかの言語で学期全体になった方法です!ああ井戸。私は同意する、最高の学習方法ではない。 – Andy

+0

@Andy:あなたの宿題に関する詳しい情報を追加してください。何が尋ねられているのか不明確です。本当に助けてくれません。 – m09

答えて

4

私は以下のことを出発点として意図しました。

type(string). 

は、その文字列が

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

のインスタンスであることを変数のために利用可能なタイプであることを意味し中置演算子は=同じタイプの2つの引数を取り、何も返さないことを意味します。ここに私の定式化です。

is_instance(X, Y) 

Xが物事をテストするタイプY のインスタンスであることを意味し、私は私のtest/0述語の私の変数Inputに含まれる「文」のリストを作成しました。その後、私は物事がうまくいれば再帰的にテストします。式の中で型が正常かどうかを調べるために、第3節を再帰呼び出しとして実装する必要があります。

私がatmしたのは、私の最初のメインの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). 

私はそれがあなたを始めさせるのに役立つことを願っています。

+0

うわー、これは私がこの言語では新しくなったのであまり確かではないことです。しかし、はい、私はあなたが答えに入れる時間を大いに感謝します。私は署名について混乱している。あなたの上には3番目の引数nilがあり、コードにはその引数はありません。何か不足していますか?しかし、これはまた、私に多くの研究を行い、宿題を完了させる出発点となります。 – Andy

関連する問題