0

我试图找到如何在脚本中找到解决方案的数量。我当前的脚本是:

ksol(K,ST) :- length(L1,K), maketemplate(L1,ST,K), kset(Kset,K),
    asserta( (qn(K))),asserta( (st(ST))), asserta( (kset(Kset)) ).
                    % number of queens, solution template
maketemplate([],[],_K).
maketemplate([X|Rest],[N1/X|RT],K) :-  maketemplate(Rest,RT,K),
                                length([X|Rest],N),N1 is K-N+1,!.
kset([],0).
kset([N|Rest],N) :-N1 is N-1, kset(Rest,N1),!.

solution(L) :- st(L), sol(L).
sol([8]).   
sol([Q|Queens]) :- sol(Queens),      
         Q=_X/Y, kset(Kset),member(Y,Kset),
                  noattack(Q,Queens). 

更具体地说,在这个脚本中,我试图查看 prolog 为 8 个皇后生成了多少解决方案。有人能帮我解决这个问题吗?

4

1 回答 1

1

使用 assert/retract 来计算成功的目标调用次数是相当低效且容易出错的。

在 SWI-Prolog 中,更简单的解决方案是aggregate_all /3,可从预加载的库(聚合)中获得。

我不确定您要计算哪个目标,假设它是解决方案/1,您应该使用

?- aggregate_all(count,solution(_),N).

在库(聚合)不可用的 Prolog 方言中,更简单的方法应该是

?- findall(t,solution(_),L),length(L,N).
于 2021-11-02T06:52:19.097 回答