1

ファイルストリーム操作 PROLOG

私は、新しい学生プロファイル (成績証明書) を取得し、それを Student_profiles のデータベースと比較して、完全に一致しない場合に最適な一致を見つけることができる、学術的アドバイスのためのケースベースの推論サブシステムに取り組んでいます。

私はまだ言語にあまり慣れていないので、ファイルを開いて特定の述語を抽出しようとしています。

student_profile/4 : student_profile(L1, name, L2, L3)

にありstudent.plます。

.pl ファイルから述語を抽出したら、それを変数に割り当てて分割し、最初の引数 (この場合はL1) を抽出して計算できるようにしたいと考えています。

これは私がこれまでに持っているものです:
ファイルを開くと、学生のプロファイルまたはトランスクリプトにある述語の完全なリストを見ることができます.

load :- open('h:/AAS/Novel_Profiles/vivian.pl', read, Stream),
        read(Stream, X),
        read_data(Stream, X, StudentP),
        write(StudentP),
        close(Stream).

read_data(_Stream, end_of_file, []) :- !.

read_data(Stream, X, [X|StudentP]) :-
    read(Stream, Y),
    read_data(Stream, Y, StudentP).

用語を抽出してさらに処理する方法の例を探しましたが、運がありませんでした (または、正しい用語を使用していない可能性があります)。

どんな助けでも大歓迎です。

4

1 に答える 1

1

load述語は、後で使用するために、読み取ったリストを「返す」か、assertz でキャッシュする必要があります...

load(StudentData) :- open('h:/AAS/Novel_Profiles/vivian.pl', read, Stream),
        read(Stream, X),
        read_data(Stream, X, StudentData),
        write(StudentP),
        close(Stream).

次に、 member/2 を使用して、ロードされたリスト内のレコードと一致させることができます...

?- load(L),
   member(student_profile(Student, vivian, L2, L3), L),
   writeln(vivian(Student, L2, L3)).

しかし、もっと簡単な方法があります:consultファイルを使用して、データを直接クエリします。

load :- consult('h:/AAS/Novel_Profiles/vivian.pl').

どちらの方法 (読み取りまたは参照) でも、ファイルが構文的に正しい必要があります。プロローグは、ファイルに問題がある可能性があることを通知します。

コンサルトが成功すると、各ファクト (またはルール) を使用できるようになります...

?- student_profile(Student, vivian, L2, L3),
   writeln(vivian(Student, L2, L3)).
于 2012-04-02T19:28:51.450 に答える