フィボナッチ数などで保存計算をした場合の初期化方法。定番の方法はありませんか?
以下のサンプルコードでは、
大きな数のフィボナッチ数計算を、途中の計算結果を保存することで可能にしています。
ところが二度三度と繰り返すと、重複して計算結果が溜まってしまいます。
そこで
abolish したいのですが、これを実行すると元の定義も消えてしまいます。
こういう場合の定番となっている処理方法はありますか?
:- dynamic('_n番目のフィボナッチ数は_n-1番目のフィボナッチ数と_n-2番目のフィボナッチ数を加算したものになる'/2).
フィボナッチ数(_n番目,_フィボナッチ数) :-
'_n番目のフィボナッチ数は_n-1番目のフィボナッチ数と_n-2番目のフィボナッチ数を加算したものになる'(_n番目,_フィボナッチ数).
'_n番目のフィボナッチ数は_n-1番目のフィボナッチ数と_n-2番目のフィボナッチ数を加算したものになる'(0, 0) :- !.
'_n番目のフィボナッチ数は_n-1番目のフィボナッチ数と_n-2番目のフィボナッチ数を加算したものになる'(1, 1) :- !.
'_n番目のフィボナッチ数は_n-1番目のフィボナッチ数と_n-2番目のフィボナッチ数を加算したものになる'(_n番目,_フィボナッチ数) :-
'_n-1番目のフィボナッチ数と_n-2番目のフィボナッチ数を加算したものになる'(_n番目,_フィボナッチ数).
'_n-1番目のフィボナッチ数と_n-2番目のフィボナッチ数を加算したものになる'(_n番目,_フィボナッチ数) :-
'_n-1番目のフィボナッチ数と'(_n番目,_フィボナッチ数_1),
'_n-2番目のフィボナッチ数を'(_n番目,_フィボナッチ数_2),
加算したものになる(_フィボナッチ数_1,_フィボナッチ数_2,_フィボナッチ数),
'_n番目のフィボナッチ数の計算結果を保存する'(_n番目,_フィボナッチ数).
'_n-1番目のフィボナッチ数と'(_n番目,_フィボナッチ数_1) :-
_n_1番目 is _n番目 - 1,
'_n番目のフィボナッチ数は_n-1番目のフィボナッチ数と_n-2番目のフィボナッチ数を加算したものになる'(_n_1番目,_フィボナッチ数_1).
'_n-2番目のフィボナッチ数を'(_n番目,_フィボナッチ数_2) :-
_n_2番目 is _n番目 - 2,
'_n番目のフィボナッチ数は_n-1番目のフィボナッチ数と_n-2番目のフィボナッチ数を加算したものになる'(_n_2番目,_フィボナッチ数_2).
加算したものになる(_フィボナッチ数_1,_フィボナッチ数_2,_フィボナッチ数) :-
_フィボナッチ数 is _フィボナッチ数_1 + _フィボナッチ数_2.
'_n番目のフィボナッチ数の計算結果を保存する'(_n番目,_フィボナッチ数) :-
asserta(('_n番目のフィボナッチ数は_n-1番目のフィボナッチ数と_n-2番目のフィボナッチ数を加算したものになる'(_n番目,_フィボナッチ数) :- ! )).