我正在尝试导入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,方法是使用 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
我找到了我自己的问题的答案,它需要将这个特定谓词的 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).