このディレクトリの索引
#  出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1390525149/300
#  お題:次のような規則の配列でインデックス番号iの配列の値を求める。 
#  ・インデックス番号1の配列の値A(1)は1である。 
#  ・配列の値は昇順である。 
#  ・インデックス番号iの配列の値A(i)は配列内のiの個数である。 
#  例 
#  A(10) -> 4
#  A(100) -> 14
#  A(1000) -> 45
# 

:- dynamic(a/2).

a(1,1).


'次のような規則の配列でインデックス番号iの配列の値を求める。
・インデックス番号1の配列の値A(1)は1である。
・配列の値は昇順である。
・インデックス番号iの配列の値A(i)は配列内のiの個数である。'(_i,X) :-
        '次のような規則の配列でインデックス番号iの配列の値を求める。
・インデックス番号1の配列の値A(1)は1である。
・配列の値は昇順である。
・インデックス番号iの配列の値A(i)は配列内のiの個数である。'(2,_i,2),
        a(_i,X).


'次のような規則の配列でインデックス番号iの配列の値を求める。
・インデックス番号1の配列の値A(1)は1である。
・配列の値は昇順である。
・インデックス番号iの配列の値A(i)は配列内のiの個数である。'(_インデッスク,_i,_繰り返し数_1) :-
        _インデックス > _i,!.
'次のような規則の配列でインデックス番号iの配列の値を求める。
・インデックス番号1の配列の値A(1)は1である。
・配列の値は昇順である。
・インデックス番号iの配列の値A(i)は配列内のiの個数である。'(_インデッスク,_i,_繰り返し数_1) :-
        繰り返し数_1から繰り返し個数を求めてインデックス列を登録する(_インデックス,_繰り返し数_1,_次のインデックス,_繰り返し数_2),

        '次のような規則の配列でインデックス番号iの配列の値を求める。
・インデックス番号1の配列の値A(1)は1である。
・配列の値は昇順である。
・インデックス番号iの配列の値A(i)は配列内のiの個数である。'(_次のインデックス,_i,_繰り返し数_2).

繰り返し数_1から繰り返し数を求めてインデックス列を登録する(_インデックス,_繰り返し数_1,_次のインデックス,_繰り返し数_2) :-
        繰り返し個数を得る(_繰り返し数_1,_繰り返し数),
        _次のインデックス is _インデックス + _繰り返し数,
        インデッスク列の生成(_インデックス,_繰り返し数),
        _繰り返し数_2 is _繰り返し数_1 + 1.


繰り返し数を得る(N,M) :-
        a(N,M),!.
繰り返し数を得る(N,N).

インデッスク列の生成(_インデックス,_繰り返し数) :-
        _インデックス_2 is _インデックス + _繰り返し数 - 1,
        forall(between(_インデックス,_インデックス_2,N),assertz(a(N,_繰り返し数))).