Prolog遍历事实库仅输出首条f_p匹配项,如何输出全部对应规则?
问题原因
你当前的代码只输出第一条匹配结果有两个核心原因:
- 规则末尾的
!是Prolog的截断符,匹配到第一个符合条件的f_p事实后会直接终止回溯,不再查找其他匹配项 - 你没有使用遍历逻辑,Prolog默认的合取查询只要找到第一个解就会停止执行,不会自动遍历所有符合条件的事实
- 额外的
invar(Invar,_,_,_,_)查询如果不需要关联invar和f_p的第二个参数,属于多余逻辑,还会产生额外的回溯分支
修复方案
方法1:使用forall遍历(推荐,可读性更高)
首先定义允许匹配的f_p第一个参数值,再通过forall谓词遍历所有符合条件的事实输出:
% 定义需要提取的f_p第一个参数值 allowed_f(le). allowed_f(lc). allowed_f(ru). allowed_f(rv). impresionPruebaGeneral(FD):- writeln(FD,'pruebaGeneral(X):-'), % 遍历所有符合要求的f_p事实,逐个输出对应规则行 forall( (allowed_f(F), f_p(F, _, _)), (write(FD,'prueba'), write(FD,F), writeln(FD,'(X),')) ).
如果需要关联f_p的第二个参数和invar的第一个参数,可以把条件修改为:
forall( (allowed_f(F), invar(Invar,_,_,_,_), f_p(F, Invar, _)), 输出逻辑 )
方法2:使用失败驱动循环(兼容所有Prolog版本)
如果你的运行环境不支持forall,也可以用传统的失败驱动循环实现遍历:
allowed_f(le). allowed_f(lc). allowed_f(ru). allowed_f(rv). impresionPruebaGeneral(FD):- writeln(FD,'pruebaGeneral(X):-'), ( allowed_f(F), f_p(F, _, _), write(FD,'prueba'), write(FD,F), writeln(FD,'(X),'), fail % 强制回溯,匹配下一个f_p事实 ; true % 所有匹配项处理完成后结束 ).
两种方案执行后都可以得到你期望的输出结果,末尾不会带句号,可直接对接后续其他谓词的处理逻辑。
内容的提问来源于stack exchange,提问作者Fenrrir
相关产品推荐
相关产品推荐

