Prolog含回车元素的列表writeln打印异常问题求助
解决Prolog中writeln打印含回车元素列表的问题
我来帮你拆解这个问题的原因,然后给出具体的修复方案:
问题根源
你遇到的现象本质上是不同操作系统换行符差异导致的终端输出覆盖:
- Unix/Linux/macOS(现代)的换行符是
\n(ASCII码10),原代码已经处理了这个字符; - Windows的换行符是
\r\n(ASCII码13+10),原代码完全没处理\r(回车符)。
当你的输入文本包含\r时,它会被原代码当作普通字符读入到某个单词的编码列表中。当用writeln打印时,\r会触发终端的「光标回到行首」动作,后续输出的内容会直接覆盖掉前面的列表内容,所以你看到的,DEMAND,200,100,300]其实是后面的内容覆盖了前面部分后的结果——列表本身其实是完整的,只是终端输出被干扰了。
修复方案
只需要在checkCharAndReadRest谓词中添加对\r(ASCII 13)的处理,把它和空格、制表符、换行符一样当作空白分隔符即可。修改后的完整代码如下:
%% Read text file into list of strings and numbers readAll(InStream, []) :- at_end_of_stream(InStream), !. readAll(InStream, [W|List]) :- readWordNumber(InStream, W), !, readAll(InStream, List). %% read a white-space separated text or number readWordNumber(InStream, W) :- get_code(InStream, Char), checkCharAndReadRest(Char, Chars, InStream), codes2NumOrWord(W, Chars). %% Convert list of codes into a number if possible to string otherwise codes2NumOrWord(N, Chars) :- atom_codes(W, Chars), atom_number(W, N), !. codes2NumOrWord(W, Chars) :- atom_codes(W, Chars). %% Source: Learn Prolog Now! - 添加了对ASCII 13(\r)的处理 checkCharAndReadRest(10, [], _) :- !. % 处理\n checkCharAndReadRest(13, [], _) :- !. % 新增:处理\r checkCharAndReadRest(32, [], _) :- !. % 处理空格 checkCharAndReadRest(9, [], _) :- !. % 处理制表符\t checkCharAndReadRest(-1, [], _) :- !. % 处理流结束 checkCharAndReadRest(Char, [Char|Chars], InStream) :- get_code(InStream, NextChar), checkCharAndReadRest(NextChar, Chars, InStream).
验证方法
修改后重新读取你的测试输入Source3 4 5 12 275 DEMAND 200 100 300(即使包含Windows风格的\r\n换行),再执行writeln(List),就能看到完整的列表输出,不会再出现内容被覆盖的情况。
内容的提问来源于stack exchange,提问作者Hanif Bin Ariffin
相关产品推荐
相关产品推荐

