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

时间:2019-03-26 14:55:40

标签: module prolog

我正在尝试导入library(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 :(得分:0)

可以与GNU Prolog和其他Prolog系统一起使用的便携式替代方案是安装Logtalk(3.24.0版或更高版本)并使用其reader库,它提供了与SWI-Prolog library(readutil)类似的API。您可以通过以下网址查询reader库API:

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

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

| ?- {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

答案 1 :(得分:0)

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