Prolog中统计列表内解的数量:如何计算8皇后问题的总解数
8皇后解数查询方法
前置准备:补全缺失内容
- 你当前给出的代码缺少
noattack/2谓词定义,这是判断皇后互不攻击的核心逻辑,先在原有代码后追加如下代码:
noattack(_, []). noattack(X/Y, [X1/Y1|Rest]) :- % 不同列 Y =\= Y1, % 不同对角线 abs(X - X1) =\= abs(Y - Y1), noattack(X/Y, Rest).
- 原代码中递归基准子句
sol([8]).仅适配8皇后场景,若运行时无返回结果,可根据你的结构定义调整为sol([]).适配通用递归逻辑。
操作步骤
- 第一步:初始化8皇后的运行上下文,执行如下查询初始化参数:
ksol(8, _). - 第二步:统计所有解的总数量,执行如下任意一条查询即可:
- 方法1:获取所有解的同时统计数量(会保留所有解到列表中)
findall(L, solution(L), AllSolutions), length(AllSolutions, TotalCount). - 方法2:仅统计数量,内存占用更低(推荐,SWI-Prolog等支持aggregate的实现可用)
aggregate_all(count, solution(_), TotalCount).
- 方法1:获取所有解的同时统计数量(会保留所有解到列表中)
预期结果
查询返回的TotalCount值为92,和8皇后问题的标准解数一致。
内容的提问来源于stack exchange,提问作者niconico
相关产品推荐
相关产品推荐

