PROLOG File Stream Manipulation; срок извлечения для переработки - PullRequest
1 голос
/ 02 апреля 2012

Управление потоком файлов 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).

Я искал примеры того, как извлечь термин и использовать его для дальнейшей обработки, но у меня есть не повезло (или, может быть, я не использую правильную терминологию).

Любая помощь будет принята с благодарностью.

1 Ответ

1 голос
/ 02 апреля 2012

Ваш предикат 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 для сопоставления некоторой записи в загруженномlist ...

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

Но есть более простой способ: consult файл и прямой запрос данных.

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

Оба метода (читать или консультироваться), требуют вашегофайл синтаксически правильный.Ваш Prolog сообщит вам о любой проблеме, которая может возникнуть у файла.

После успешной консультации каждый факт (или правило) готов к использованию ...

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