SWI-Prolog中listing命令返回异常及报错问题咨询
listing指令异常报错问题 先给你几个实用的排查方向,一步步来定位问题:
排除初始化文件的干扰
SWI-Prolog启动时会自动加载用户目录下的~/.plrc或当前目录的init.pl这类初始化文件,里面的代码可能意外修改了系统谓词或者引入了冲突。你可以试试用swipl -q(安静模式)启动Prolog,此时不会加载任何初始化脚本,再输入listing.看看是否正常。如果恢复正常,就去检查初始化文件里的代码,看看是不是定义了和listing同名的谓词,或者加载了有问题的库。检查谓词是否被覆盖
有时候自定义知识库会不小心覆盖系统自带的listing谓词。先在未加载知识库时输入current_predicate(listing/0).和current_predicate(listing/1).,看看返回的是不是系统默认的定义。然后加载知识库后再执行这两个命令,对比结果——如果加载后listing的定义变了,那就是知识库中的代码覆盖了它,找到对应的谓词修改或删除即可。深挖异常信息里的线索
虽然你说返回的异常内容很长,但里面肯定藏着关键信息:比如ERROR:开头的错误提示、调用栈的顶部(哪一行代码触发的错误)。把这些核心部分拎出来,比如如果是某个自定义谓词在被listing遍历的时候抛出了语法错误或者循环引用错误,就能直接定位到问题谓词。重置环境测试
可以输入abolish(all).(注意这个会清除所有自定义谓词,谨慎使用),之后再执行listing.,如果恢复正常,那说明问题出在之前加载的自定义谓词上。或者用cleanup.命令清理临时资源后再测试。检查版本兼容性
某些旧版SWI-Prolog可能存在listing相关的已知bug,你可以尝试更新到最新稳定版,看看问题是否消失。新版本通常会修复这类系统谓词的异常问题。
内容的提问来源于stack exchange,提问作者GpGio

