3

我正在尝试导入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

4

2 回答 2

2

可以与 GNU Prolog 和十几个 Prolog 系统一起使用的可移植替代方法是安装 Logtalk(版本 3.36.0 或更高版本)并使用其库reader该库提供与 SWI-Prolog 类似的 API library(readutil)。您可以reader在以下位置查阅库 API:

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

用法很简单。gplgt通过使用orgplgt.sh脚本(如果在 POSIX 系统上)或开始菜单快捷方式(如果在 Windows 上),以 GNU Prolog 作为后端编译器启动 Logtalk 。使用查询加载库:

| ?- {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
于 2019-03-26T15:28:21.563 回答
1

我找到了我自己的问题的答案,该问题需要将这个特定谓词的 SWI prolog 源代码复制到您自己的代码中:

/*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).
于 2019-03-26T15:47:08.483 回答