Guy*_*der 6 prolog swi-prolog prolog-toplevel
简单的例子:
?- between(1,10,X).
X = 1 ;
X = 2 ;
X = 3 ;
X = 4 ;
X = 5 ;
X = 6 ;
X = 7 ;
X = 8 ;
X = 9 ;
X = 10.
Run Code Online (Sandbox Code Playgroud)
当使用SWL-Prolog使用REPL查看下一个答案时,必须按下空格键.
如何在不按空格键的情况下将所有结果列在屏幕上?
如果这是一个重复的问题,请告诉我,我找不到一个.
细节
我知道第一个想法很多就是使用bagof/3,但实际目标是使用DCG 解析这个3 GB的文件(Uniprot - uniprot_sprot.dat.gz)(文件格式).现在我只想查看tokenizer/lexer是否可以在不停止的情况下完成整个文件.由于数据是一个平面文件数据库(面向行),每行可以独立处理,因此代码首先使用phrase_from_file/2拉出一行,然后根据短语/ 2将其传递给一个标记器,例如,对于一个简单的例子,请参阅Mat的回答如何将文件中的数据读入Prolog,有关更精确的解决方案,请参阅GitHub mzapotoczny/prolog-interpreter.后者将进行解析,然后使用该阶段的输出来加载Neo4j数据库.
处理大文件的注意事项:
最初文件的处理方式与此答案类似,并使用了phrase_from_file/2.这导致整个文件在传递到下一个语句之前被加载到堆栈中,并且每次中止时都需要增加堆栈大小; 在8千兆字节的堆栈中它仍然中止,这种方法被放弃了.
切换到每个行的递归处理,如此答案,但仍然使用短语/ 2作为标记器允许在读取下一行之前读取,标记化并写入到屏幕,因此不需要增加堆栈大小.这种情况一夜之间成功运行了几个小时,但我中止了它,因为我需要我的处理器.
请参阅相关问题,了解源代码的早期工作版本.
关于类似问题的说明.
如果你通过搜索得出这个问题,你的真正问题是
我正在使用SWI-Prolog并且我正在尝试打印列表,但如果列表中有超过9个项目 - 它看起来像那样 -
Run Code Online (Sandbox Code Playgroud)[1, 15, 8, 22, 5, 19, 12, 25, 3|...]
有没有办法显示整个列表?
然后看这些问答:
“ hackish ”解决方案是添加print(X), nl, fail
到调用中。这里print(X)
当然可以打印任何相关信息。例如between(1,10,X), print(X), nl, fail
。
这是有效的,因为print/1
[swi-doc]只是打印传递给它的术语的另一个谓词。nl/0
[swi-doc]将打印一个换行符,而fail/0
[swi-doc]总是失败。
因此,我们让 Prolog 提出解决方案,打印这些解决方案,打印一个新行,并且fail
将“激活”回溯机制,旨在寻找再次打印并失败的另一个解决方案。
最终所有的解决方案都被打印出来,因此调用失败。这因此产生:
?- between(1,10,X), print(X), nl, fail.
1
2
3
4
5
6
7
8
9
10
false.
Run Code Online (Sandbox Code Playgroud)