如何在Prolog中筛选错误数为0的schedule排列结果?
解决方法
要只返回错误数为0的排列,你只需要在现有谓词的基础上添加一个错误数等于0的约束即可,利用Prolog的合取逻辑(逗号表示同时满足所有条件)就能轻松实现。
方案1:定义新的专用谓词
直接创建一个专门筛选完美排列的谓词,逻辑直观易懂:先生成所有可能的排列,再检查它的错误数是否为0:
schedule_perfect(A,B,C) :- schedule(A,B,C), % 生成所有可能的A/B/C排列组合 schedule_errors(A,B,C,0). % 仅保留错误数为0的有效排列
之后你只需要查询这个新谓词:
?- schedule_perfect(A,B,C).
它会只回溯返回那些错误数为0的排列(如果存在的话)。
方案2:修改原有的schedule_all_errors谓词
如果你想沿用原来的谓词名称,也可以直接给参数E加上固定值约束:
schedule_all_errors(A,B,C,0) :- schedule(A,B,C), schedule_errors(A,B,C,0).
这样当你查询?- schedule_all_errors(A,B,C,E).时,只有E=0的结果会被返回;或者直接指定E=0查询:?- schedule_all_errors(A,B,C,0).,效果完全一致。
原理说明
Prolog的谓词是通过同时满足所有子目标来工作的,当你在schedule/3和schedule_errors/4的逻辑链里明确要求错误数为0时,就相当于告诉Prolog:"只保留那些既符合schedule生成规则,又满足错误数为0的结果",系统会自动过滤掉所有错误数不为0的排列。
内容的提问来源于stack exchange,提问作者Gluxable
相关产品推荐
相关产品推荐

