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

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

:- use_module(library(readutil)).

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

Я получаю сообщение об ошибке:

error(existence_error(procedure,read_line_to_codes/2),read_from_file/0)

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


person Mandy    schedule 26.03.2019    source источник
comment
Ваш код работает у меня без изменений на SWI 7.4.2 в Windows. На какой системе вы работаете? Возможно, вам нужен другой пакет ОС?   -  person firefrorefiddle    schedule 26.03.2019
comment
У меня есть пролог GNU, и я нахожусь в Windows   -  person Mandy    schedule 26.03.2019
comment
Тогда вам следует обратиться к документации GNU Prolog. library(readutil) является частью SWI Prolog.   -  person firefrorefiddle    schedule 26.03.2019


Ответы (2)


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

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

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

| ?- {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','.','3','7','.','0',-,b,'0','1','\n']

yes
person Paulo Moura    schedule 26.03.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).
person Mandy    schedule 26.03.2019