Prolog文件存在性检查遇报错,求返回布尔值的可行谓词
解决Prolog文件存在检查的返回值问题
嘿,我来帮你搞定这个头疼的问题!你遇到的核心问题其实和Prolog的谓词行为、不同实现的差异,以及错误处理逻辑有关,咱们一步步拆解:
1. 不同Prolog实现的谓词差异
Prolog并没有完全统一的“文件存在检查”标准谓词,不同编译器(比如SWI-Prolog、GNU Prolog、SICStus Prolog)的支持情况不一样:
exists_file/1:在SWI-Prolog和GNU Prolog里是有效的,但有些老版本或小众实现可能不支持exists/1:这不是标准谓词,大部分主流Prolog里都没有这个谓词,所以调用肯定报错access_file/2:这个是ISO标准谓词,但它的行为是文件不存在时抛出异常,而不是返回false,这就是你看到“existence error”的原因——它不会默默返回false,而是直接报错中断程序
2. 容易忽略的路径问题
你有没有确认过testfile.pl确实在当前工作目录里?可以先在Prolog终端里执行pwd.(注意末尾的点)查看当前工作路径,或者直接用绝对路径测试,比如exists_file('/home/you/testfile.pl').,排除路径不对的情况。
3. 实现一个返回True/False的安全检查谓词
既然access_file/2会抛异常,我们可以用catch/3谓词把异常捕获,转换成我们想要的true/false结果。以SWI-Prolog为例,写一个通用的检查谓词:
file_exists(File) :- % 尝试检查文件是否存在,成功则返回true access_file(File, exists), !. file_exists(_File) :- % 捕获异常或者检查失败时返回false true.
或者更简洁的写法,直接用catch:
file_exists(File) :- catch(access_file(File, exists), _, fail).
这样调用file_exists('testfile.pl').时,文件存在就返回true,不存在就返回false,不会再抛出异常啦。
最后提醒
记得先确认你用的Prolog版本,查一下对应版本的文档(比如SWI-Prolog的文件操作章节),不同实现的细节可能有差异,但用catch包装异常的思路是通用的。
内容的提问来源于stack exchange,提问作者SandraS
相关产品推荐
相关产品推荐

