【问题标题】:Number decomposition in PrologProlog中的数字分解
【发布时间】:2015-11-25 21:41:23
【问题描述】:

我是 Prolog 的新手,我有以下问题:如何将自然数 N 分解为一个列表,其中包含总和等于 N 的连续自然数?

例如:

N=10, R=[1,2,3,4];

N=80, R=[14, 15, 16, 17, 18];

N=99, R=[4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]

      R=[7, 8, 9, 10, 11, 12, 13, 14, 15]

      R=[14, 15, 16, 17, 18, 19]

      R=[32, 33, 34]

      R=[49, 50]

编辑: 我尝试在不使用默认方法的情况下构建列表,到目前为止我设法写了这篇文章:

cand([H|_],H).
cand([_|T],E):-
    cand(T,E).

suma([],0).
suma([H|T],S):-
    suma(T,Temp),
    S is Temp+H.

list(0,[]).
list(N,[Nr|R]):-
    Nr is N-1,
    list(Nr,R).

generate(_,_,A,_,A).
generate(N,L,[H|T],S,R):-
    S<N,
    cand(L,E),
    not(cand([H|T],E)),
    E=:=H-1,
    suma([H|T],S),
    generate(N,L,[E,H|T],S,R).
start(N,Rez):-
    list(N,L),
    cand(L,E1),
    cand(L,E2),
    E2=:=E1-1,
    generate(N,L,[E2,E1],0,Rez).

但由于某种原因,无论我输入多少数字,结果总是空列表。

【问题讨论】:

  • 不要指望 SO 成员做你的功课......我们只是来帮助 做这件事。所以,请告诉我们你尝试了什么。
  • 您需要展示您的尝试,以便我们为您提供帮助。
  • 对 CLPFD 库做一些研究。这是解决此类问题的最干净的方法。谷歌它并阅读。尝试一些事情,如果遇到困难,再提出具体问题。
  • 使用@mat 的解决方案怎么样?

标签: prolog decomposition


【解决方案1】:

使用 constraints 看看有比你展示的更多的解决方案:

:- use_module(library(clpfd)).

n_list(N, Ls) :-
    L #=< N,
    L #> 0,
    indomain(L),
    length(Ls, L),
    Ls ins 0..N,
    foldl(consecutive, Ls, _, _),
    sum(Ls, #=, N),
    label(Ls).

consecutive(A, Prev, A) :- A #= Prev + 1.

例子:

?- n_list(10, Ls)。 Ls = [10] ; Ls = [1, 2, 3, 4] ; Ls = [0, 1, 2, 3, 4] ; 错误的。

另一个例子:

?- n_list(80, Ls)。 Ls = [80] ; Ls = [14, 15, 16, 17, 18] ; 错误的。

我把加快速度作为练习留给你。

【讨论】:

    【解决方案2】:

    这将跟进@mat's previous answer。 想要速度吗?使用这样的冗余约束!

    n_list(N, Ls) :- L #=0, L0 #= L-1, N0 #= (L0*L0+L0)//2, N #= N0+K*L, K #>= 0, 域内(L), 长度(Ls,L), Ls ins 0..N, foldl(连续,Ls,_,_), 总和(Ls,#=,N), 标签(Ls)。

    无冗余约束的运行时:

    ?-时间((N in 1..100,indomain(N),n_list(N,_),false))。 % 1,048,270,907 次推理,85.594 CPU 在 85.552 秒内(100% CPU,12247032 唇) 错误的。

    具有冗余约束的运行时:

    ?-时间((N in 1..100,indomain(N),n_list(N,_),false))。 % 10,312,514 次推理,0.834 CPU 在 0.833 秒内(100% CPU,12369051 唇) 错误的。

    【讨论】:

      猜你喜欢
      • 2014-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-29
      • 1970-01-01
      相关资源
      最近更新 更多