我正在尝试导入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
答案 0 :(得分:0)
可以与GNU Prolog和其他Prolog系统一起使用的便携式替代方案是安装Logtalk(3.24.0版或更高版本)并使用其reader
库,它提供了与SWI-Prolog library(readutil)
类似的API。您可以通过以下网址查询reader
库API:
https://logtalk.org/library/reader_0.html
用法很简单。通过使用gplgt
或gplgt.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).