Не удается загрузить модуль библиотеки (readutil) в пролог GNU? - PullRequest
1 голос
/ 26 марта 2019

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

    :- use_module(library(readutil)).

    read_from_file(File) :-
                 open(File,read,Stream),
                 read_line_to_codes(Stream,Codes),
                 write(Codes),
                 close(Stream).

Я получаю ошибку:

uncaught exception: error(existence_error(procedure,read_line_to_codes/2),read_from_file/0)

Как правильно импортировать этот модуль? Описание модуля находится здесь: http://www.swi -prolog.org / pldoc / man? Section = readutil

Ответы [ 2 ]

0 голосов
/ 26 марта 2019

Я нашел ответ на свой вопрос, который требует копирования исходного кода пролога SWI для этого конкретного предиката в ваш собственный код:

/*This is a copied predicate from SWI prolog */
read_line_to_codes(Stream, Codes) :-
    get_code(Stream, C0),
    (   C0 == -1
    ->  Codes0 = end_of_file
    ;   read_1line_to_codes(C0, Stream, Codes0)
    ),
    Codes = Codes0.

read_1line_to_codes(-1, _, []) :- !.
read_1line_to_codes(10, _, []) :- !.
read_1line_to_codes(13, Stream, L) :-
    !,
    get_code(Stream, C2),
    read_1line_to_codes(C2, Stream, L).

read_1line_to_codes(C, Stream, [C|T]) :-
    get_code(Stream, C2),
    read_1line_to_codes(C2, Stream, T).
0 голосов
/ 26 марта 2019
Альтернатива

A portable , которую вы можете использовать с GNU Prolog и дюжиной других систем Prolog, - это установить Logtalk (версия 3.24.0 или более поздняя) и использовать библиотеку reader, которая обеспечиваетAPI похож на SWI-Prolog library(readutil).Вы можете обратиться к API библиотеки reader по адресу:

https://logtalk.org/library/reader_0.html

Использование просто.Запустите Logtalk с GNU Prolog в качестве внутреннего компилятора с помощью сценария gplgt или gplgt.sh (если используется система POSIX) или ярлыка меню «Пуск» (если используется Windows).Загрузите библиотеку с помощью запроса:

| ?- {library(reader_loader)}.

или с помощью цели logtalk_load(library(reader_loader), если не в интерпретаторе верхнего уровня.После загрузки вы можете играть с API.Например:

| ?- reader::file_to_codes('$LOGTALKUSER/VERSION.txt', Codes).

Codes = [51,46,50,53,46,48,45,98,50,49,10]

yes

| ?- reader::file_to_chars('$LOGTALKUSER/VERSION.txt', Codes).

Codes = ['3','.','2','5','.','0',-,b,'2','1','\n']

yes
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...