【问题标题】:finding the number of solutions in a list on prolog在序言列表中查找解决方案的数量
【发布时间】:2021-11-02 02:57:06
【问题描述】:

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

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 个皇后生成了多少解决方案。 有人可以帮我解决这个问题吗?

【问题讨论】:

    标签: list prolog prolog-findall


    【解决方案1】:

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

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

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

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

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

    ?- findall(t,solution(_),L),length(L,N).
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-26
      • 1970-01-01
      • 2014-08-15
      • 1970-01-01
      • 1970-01-01
      • 2020-08-29
      • 2019-02-05
      • 1970-01-01
      相关资源
      最近更新 更多