【发布时间】: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