このディレクトリの索引

'1+3+5=9=3*3はA1+A2+A3=B=n*nになりますよね。
Bの平方根がnであるとき、ある整数BからAnをすべて求める方法を教えてください。
ただしA1..Anは全て奇数の一意数であり昇順に並んでいます'(B,_A1__An) :-
        'Bの平方根はnである'(B,_n),
        '反転した1から始まる公差2の等差数列を求める'(_n,_反転した1から始まる公差2のn要素の等差数列),
        reverse(_反転した1から始まる公差2のn要素の等差数列,_A1__An).

'Bの平方根はnである'(B,_n) :-
        _n is sqrt(B),
        integer(_n).

'反転した1から始まる公差2のn要素の等差数列を求める'(1,[1]) :- !.
'反転した1から始まる公差2のn要素の等差数列を求める'(2,[3,1]) :- !.
'反転した1から始まる公差2のn要素の等差数列を求める'(3,[5,3,1]) :- !.
'反転した1から始まる公差2のn要素の等差数列を求める'(_n,[_m_2|[_m|R]]) :-
        '1を引く'(_n,_n_1),
        '反転した1から始まる公差2のn要素の等差数列を求める'(_n_1,[_m|R]),
        '2を足す'(_m,_m_2).

'1を引く'(_n,_n_1) :-
        succ(_n_1,_n).

'2を足す'(_m,_m_2) :-
        succ(_m,_m_1),
        succ(_m_1,_m_2).