Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Prolog-检查流的结尾是否为';行不通_Prolog_Swi Prolog_Iso Prolog - Fatal编程技术网

Prolog-检查流的结尾是否为';行不通

Prolog-检查流的结尾是否为';行不通,prolog,swi-prolog,iso-prolog,Prolog,Swi Prolog,Iso Prolog,我有一个文件memo.dat,其中包含以下术语: memo(verdi,11). memo(rossi,7). memo(bianchi,9). memo(blu,7). memo(neri,11). memo(carli,11). memo(rapini,8). 为了从这个文件中获得一组元组,我编写了一个prolog程序: memo_to_list(MemoList):- open('/home/ale/Downloads/Prolog_exercises/memo.dat',rea

我有一个文件
memo.dat
,其中包含以下术语:

memo(verdi,11).
memo(rossi,7).
memo(bianchi,9).
memo(blu,7).
memo(neri,11).
memo(carli,11).
memo(rapini,8).
为了从这个文件中获得一组元组,我编写了一个prolog程序:

memo_to_list(MemoList):-
    open('/home/ale/Downloads/Prolog_exercises/memo.dat',read,Stream),
    read_list_from_stream(Stream,MemoList),
    close(Stream).

read_list_from_stream(Stream,[]):-
    at_end_of_stream(Stream),!.

read_list_from_stream(Stream,[(Cognome,Ora)|RestoAppuntamenti]):-
    read(Stream,memo(Cognome,Ora)),
    read_list_from_stream(Stream,RestoAppuntamenti).

但是,流的\u end\u处的谓词
无法检查流何时到达其末端。有什么问题吗?(我使用ubuntu的默认文本编辑器创建了文件
memo.dat

只有在您实际到达时才检测到流的结尾。当您读取最后一个事实时,尚未读取文件结尾标记。尝试以下方法:

memo_to_list(MemoList):-
    open('/home/ale/Downloads/Prolog_exercises/memo.dat',read,Stream),
    read(Stream,Term),
    read_list_from_stream(Term,Stream,MemoList),
    close(Stream).

read_list_from_stream(end_of_file,_,[]) :-
    !.

read_list_from_stream(memo(Cognome,Ora),Stream,[(Cognome,Ora)|RestoAppuntamenti]):-
    read(Stream,Term),
    read_list_from_stream(Term,Stream,RestoAppuntamenti).
如果您的数据文件出现问题,您还可以使用
setup\u call\u cleanup/3
内置谓词避免泄漏流句柄和未关闭的流:

memo_to_list(MemoList) :-
    setup_call_cleanup(
        open('/Users/pmoura/Desktop/memo.dat',read,Stream),
        (   read(Stream,Term),
            read_list_from_stream(Term,Stream,MemoList)
        ),
        close(Stream)
    ).
更新


Prolog标准要求在结束术语的
后面跟一个布局字符。只有在最后一个术语的最后一个点后没有任何字符(文件结尾除外)时,代码才起作用,这使得Prolog文本不一致,但根据Prolog系统的不同,可能允许在读取最后一个术语后通过调用
at_end_of_stream/1
谓词来检测流的结尾。另请注意,如果保存时没有文本,文本编辑器通常会在最后一行文本后添加新行。该新行是Prolog标准要求的布局字符。因此,对于一个兼容的、可靠的、可移植的解决方案,请确保在数据文件的末尾有一行新行,并在回答此问题时使用解决方案。

非常感谢。无论如何,我的代码也应该可以工作。也许这是文本编辑器中的一个问题。我写的程序是标准的,所以应该可以运行…更新了我的答案,并做了进一步的解释。谢谢我更换了编辑器(Notepadqq),现在它可以运行了:)你认为steam/1
末尾的
行为符合要求吗?它不是应该检查一下是否还有更多的内容要读吗?前段时间,SWI做了这件事。