无法在 GNU prolog 中加载库(readutil) 模块?



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

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

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

用法很简单。使用 GNU Prolog 作为后端编译器启动 Logtalk,方法是使用 gplgtgplgt.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

我找到了我自己的问题的答案,它需要将这个特定谓词的 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).

相关内容

  • 没有找到相关文章

最新更新