Prolog判断两列表交集为空返回True功能的报错排查
问题原因
- 谓词名称不匹配:你定义的谓词名为
success_fn,但查询时使用的是success,Prolog找不到对应谓词定义,直接返回false。 - 参数模式定义错误:
success_fn([X], [Y])的参数定义要求传入的两个参数都必须是仅包含1个元素的列表,但你查询时传入的是多元素列表,参数匹配直接失败。 - 逻辑实现冗余:不需要额外计算列表长度,直接判断交集结果是否为空列表即可,当前的或逻辑(
;)没有加cut,会导致不必要的回溯,也可能引发逻辑异常。
修复方案
如果只需要谓词返回对应布尔结果,不需要打印内容,用以下最简定义即可:
% 交集为空时返回true success(L1, L2) :- list_intersect(L1, L2, []). % 交集非空时返回false success(L1, L2) :- list_intersect(L1, L2, Z), Z \= [], false.
如果需要同时打印结果,使用以下版本:
success(L1, L2) :- list_intersect(L1, L2, Z), (Z = [] -> write('True'), ! ; write('False'), !, false).
修改后直接用原查询语句即可得到正确结果:success([1,2,3,4,5,6], [1, 2, 3]).
运行后会打印False并返回false,查询success([1,2], [3,4])会打印True并返回true。
内容的提问来源于stack exchange,提问作者Coolboy
相关产品推荐
相关产品推荐

