首页 > 解决方案 > Prolog将n写为连续数字的总和

问题描述

我正在研究序言,我想确定所有 n 的分解(n 给定,正数),作为连续自然数的总和,但我不知道如何解决这个问题。

有任何想法吗 ?

标签: prolog

解决方案


这里的关键是between/3,它涉及数字和范围。Prolog 不会凭空想出数字,你必须给它一些线索。在这种情况下,您可以假设一个介于 1 和 n 之间的数字范围:

decomp2(N, X, Y) :-
    between(1, N, X),
    between(1, N, Y),
    N =:= X + Y.

这将为您提供产生 N 的两个数字的总和:

?- decomp2(5, X, Y).
X = 1,
Y = 4 ;

X = 2,
Y = 3 ;

X = 3,
Y = 2 ;

X = 4,
Y = 1 ;

一旦你可以得到两个,你可以通过删除一个值decomp2/2并通过归纳得到其余的值来得到一个更长的列表。您只需要提出一个基本案例,例如 N 的单例列表:

decomp(N, [N]).
decomp(N, [X|L]) :- decomp2(N, X, Y), decomp(Y, L).

请注意,这将产生大量重复!

?- decomp(5, L).
L = [5] ;
L = [1, 4] ;
L = [1, 1, 3] ;
L = [1, 1, 1, 2] ;
L = [1, 1, 1, 1, 1] ;
L = [1, 1, 2, 1] ;
L = [1, 2, 2] ;
L = [1, 2, 1, 1] ;
L = [1, 3, 1] ;
L = [2, 3] ;
L = [2, 1, 2] ;
L = [2, 1, 1, 1] ;
L = [2, 2, 1] ;
L = [3, 2] ;
L = [3, 1, 1] ;
L = [4, 1] ;

您可能可以通过引入排序要求来限制重复,例如 X 大于 Y。


推荐阅读