このディレクトリの索引

単純移動平均(_データならび,_サンプル数,_単純移動平均) :-
        length(L1,_サンプル数),
        append(L0,L1,_データならび),
        avg(L1,_単純移動平均).


加重移動平均(_データならび,_サンプル数,_加重移動平均) :-
        reverse(_データならび,_反転したデータならび),
        length(L0,_サンプル数),
        append(L0,L1,_反転したデータならび),
        _分母 is _サンプル数 * (_サンプル数 + 1) / 2,
        加重移動平均分子の計算(_サンプル数,L0,_分子),
        _加重移動平均 is _分子 / _分母,!.

加重移動平均分子の計算(_,[],0) :- !.
加重移動平均分子の計算(N,[A|R],S) :-
        N1 is N - 1,
        V is A * N,
        加重移動平均分子の計算(N1,R,S1),
        S is S1 + V.


指数移動平均(_データならび,_サンプル数,_平滑化係数,_指数移動平均) :-
        reverse(_データならび,_反転したデータならび),
        length(L0,_サンプル数),
        append(L0,L1,_反転したデータならび),
        指数移動平均分子の計算(1,_平滑化係数,L0,_指数移動平均),!.

指数移動平均分子の計算(_,_,[],0) :- !.
指数移動平均分子の計算(U,_平滑係数,[A|R2],EMA) :-
        V is A * U,
        U2 is 1 - _平滑係数,
        指数移動平均分子の計算(U2,_平滑係数,R2,EMA1),
        EMA is EMA1 + V.

# http://hibari.2ch.net/test/read.cgi/tech/1289913298/622
#  [1] 授業単元:情報 
#  [2] 移動平均  ファイルにある数字のデータを読み込んで配列の移動平均を求めるプログラム。 
#          ファイル名は適当で。平均値を関数で求めて、その関数を使い、移動平均を求める関数を 
#          作る。 
#  

'ファイルにある数字のデータを読み込んで配列の移動平均を求めるプログラム。ファイル名は適当で。平均値を関数で求めて、その関数を使い、移動平均を求める関数を作る。'(_ファイル名,_サンプル数,_指数移動平均)  :-
        get_integers(_ファイル名,_データならび),
        指数移動平均(_データならび,_サンプル数,_指数移動平均).

指数移動平均(_データならび,_サンプル数,_指数移動平均) :-
        reverse(_データならび,_反転したデータならび),
        findavg(_サンプルの移動平均,(
                    length(L1,_サンプル数),
                    append(L0,L1,R,_反転したデータならび),
                    指数移動平均分子の計算(L1,_サンプルの移動平均)),
                _指数移動平均).

指数移動平均分子の計算(L,_サンプルの移動平均) :-
        findavg(V,(
                    append(L0,[U|_],L),
                    length(L0,N),
                    V is U * / (N + 1)),
                _サンプルの移動平均),!.


分数の計算と表示 :-
        分数を2項読み込む([一,分子,一,分母,二,分子,二,分母],[_分子_1,_分母_1,_分子_2,_分母_2]),
        _答え仮分数分子 is _分子_1 * _分母_2 + _分子_2 * _分母_1,
        _答え仮分数分母 is _分母_1 * _分母_2,
        最大公約数(_答え仮分数分子,_答え仮分数分母,_最大公約数),
        _答え仮分数分子_2 is _答え仮分数分子 // _最大公約数,
        _答え仮分数分母_2 is _答え仮分数分母 // _最大公約数,
        帯分数(_答え仮分数分子_2,_答え仮分数分母_2,_答え整数部分, _答え分子,_答え分母),
        分数計算表示(_分子_1,_分子_2,_答え分子,_答え整数部分,_分母_1,_分母_2,_答え分母).

分数を2項読み込む([],[]).
分数を2項読み込む([A,B|R1],[C|R2]) :-
        write_formatted('第%t項の%tを整数で入力してください : ',[A,B]),
        get_integer(C),
        分数を2項読み込む(R1,R2).

分数計算表示(_分子_1,_分子_2,_答え分子,_整数部分,_分母_1,_分母_2,_答え分母) :-
        _整数部分 >= 1,
        \+(_答えの分子=0),
        write(' %2d     %2d       %2d \n',[_分子_1,_分子_2,_答え分子]),
        write('---- + ---- =%2d---- \n',[_整数部分]),
        write(' %2d     %2d       %2d \n',[_分母_1,_分母_2,_答え分母]).
分数計算表示(_分子_1,_分子_2,_答え分子,_整数部分,_分母_1,_分母_2,_答え分母) :-
        _整数部分 >= 1,
        答えの分子=0,
        write(' %2d     %2d\n',[_分子_1,_分子_2]),
        write('---- + ---- =    %2d \n',[_整数部分]),
        write(' %2d     %2d\n',[_分母_1,_分母_2]).
分数計算表示(_分子_1,_分子_2,_答え分子,_整数部分,_分母_1,_分母_2,_答え分母) :-
        _整数部分 = 0,
        write(' %2d     %2d       %2d \n',[_分子_1,_分子_2,_答え分子]]),
        write('---- + ---- =  ---- \n'),
        write(' %2d     %2d       %2d \n',[_分母_1,_分母_2,_答え分子]]).

帯分数(_仮分数分子,_仮分数分母,_帯分数整数部分, _帯分数分子,_帯分数分母) :-
        _帯分数整数部分 is _仮分数分子 // _仮分数分母,
        _帯分数分子 is _仮分数分子 mod _仮分数分母.
        _帯分数分母 = _仮分数分母.



行列の掛算(L1,L2,X) :-
        転置(L2,L4),
        行列の掛算_1(L1,L4,X).

行列の掛算_1([],_,[]) :-!.
行列の掛算_1([A|R1],L,[S1|R3]) :-
        行列の掛算_2(A,L,S1),
        行列の掛算_1(R1,L,R3).


行列の掛算_2(_,[],[]) :-!.
行列の掛算_2(A,[B|R2],[C|R3]) :-
        行列の掛算_3(A,B,C),
        行列の掛算_2(A,R2,R3).

行列の掛算_3([],[],0) :-!.
行列の掛算_3([A|R1],[B|R2],S) :-
        分数を含む掛算(A,B,S1),
        行列の掛算_3(R1,R2,S2),
        分数を含む加算(S1,S2,S),!.

分数を含む加算(A1 / A2,B1 / B2,C) :-
        S1 is A1 * B2 + A2 * B1,
        S2 is A2 * B2,
        約分(S1 / S2,C),!.
分数を含む加算(A1 / A2,B,C) :-
        S1 is A1 + A2 * B,
        約分(S1 / A2,C),!.
分数を含む加算(A,B1 / B2,C) :-
        S1 is B1 + B2 * A,
        約分(S1 / B2,C),!.
分数を含む加算(A,B,C) :-
        C is A + B.

分数を含む掛算(A1 / A2,B1 / B2,C) :-
        S1 is A1 * B1,
        S2 is A2 * B2,
        約分(S1 / S2,C),!.
分数を含む掛算(A1 / A2,B,C) :-
        S1 is A1 * B,
        約分(S1 / A2,C),!.
分数を含む掛算(A,B1 / B2,C) :-
        S1 is B1 * A,
        約分(S1 / B2,C),!.
分数を含む掛算(A,B,C) :-
        C is A * B.

約分(B / A,X) :-
        最大公約数(B,A,C),
        _分子 is B // C,
        _分母 is A // C,
        約分の二(_分子,_分母,X),!.

約分の二(_分子,1,_分子) :- !.
約分の二(_分子,1.0,_分子) :- !.
約分の二(_分子,_分母,_分子 / _分母).

最大公約数(M,N,X) :-
        最大公約数をユークリッドの互除法で求める(M,N,X),!.

最大公約数をユークリッドの互除法で求める(M,N,N) :-
        0 is M mod N,!.
最大公約数をユークリッドの互除法で求める(M,N,X) :-
        Mod is M mod N,
        最大公約数をユークリッドの互除法で求める(N,Mod,X).

転置([],[],[]) :- !.
転置([[A|R1]|R2],[R1|R3],[A|R4]) :-
        転置(R2,R3,R4).

転置([[]|_],[]) :- !.
転置(L,[L1|R2]) :-
        転置(L,L2,L1),
        転置(L2,R2).


get_number(_数値) :-
        get_line(Line),
        get_number_診断(Line,_数値),!.
get_number(_数値) :-
        get_number(_数値).

get_number_診断(Line,_数値,_) :-
        atom_to_term(Line,_数値,_),
        数値か(_数値),!.
get_number_診断(Line,_数値,_) :-
        writef('入力された %t からは数値が得られません。再入力をお願いします。\n',[Line]),
        fail.

数値か(_分子/_分母) :-
        integer(_分子),
        integer(_分母),!.
数値か(_数値) :-
        number(_数値).


'1/3 + 3/5 + 7/9 + 9/11 + 11/13+..........+95/97 + 97/99 を合計する' :-
        分子ならび(_分子ならび),        
        分母ならび(_分母ならび),
        分子(_分子ならび,_分母ならび,_分子),        
        分母(_分母ならび,_分母),
        _合計 is _分子 / _分母,
        writef('合計は %t です\n',[_合計]).

分子([N],_分母ならび,_分子) :-
        '重複のないならびからNを取り除く'(N,_分母ならび,L),
        全てを掛ける([N|L],_分子),!.
分子([N|R1],_分母ならび,_分子) :-
        '重複のないならびからNを取り除く'(N,_分母ならび,L),
        全てを掛ける(L,_分子_1),
        分子式(R1,_分母ならび,_分子_2),
        _分子 is _分子_1 + _分子_2.

分子ならび(_分子ならび) :-
        findall(N,(
                    for(1,N,97),
                    1 is N mod 2),
                _分子ならび).

分母([X],X) :- !.
分母([A|R],_分母) :-
        分母(R,_分母_1)
        _分母 is  A * _分母_1.

分母ならび(_分母ならび) :-
        findall(N,(
                    for(3,N,99),
                    1 is N mod 2),
                _分母ならび).

'重複のないならびからNを取り除く'(N,L,R) :-
        append(L0,[N|R1],L),
        append(L0,R1,R),!.



分数の加算(_分子1/_分母1,_分子2/_分母2,_分子/_分母) :-
        A is _分母1 * _分母2,
        B is _分子1 * _分母2 + _分子2 * _分母1,
        約分(B/A,_分子/_分母).

約分(B/A,_分子/_分母) :-
        最大公約数(B,A,C),
        _分子 is B // C,
        _分母 is A // C.



加重移動平均(_データならび,_サンプル数,_加重移動平均) :-
        reverse(_データならび,_反転したデータならび),
        length(L0,_サンプル数),
        append(L0,L1,_反転したデータならび),
        _分母 is _サンプル数 * (_サンプル数 + 1) / 2,
        加重移動平均分子の計算(_サンプル数,L0,_分子),
        _加重移動平均 is _分子 / _分母,!.

加重移動平均分子の計算(_,[],0) :- !.
加重移動平均分子の計算(N,[A|R],S) :-
        N1 is N - 1,
        V is A * N,
        加重移動平均分子の計算(N1,R,S1),
        S is S1 + V.

% '2,3,4,5,6の数が書かれたカードが1枚ずつ、合計5枚ある。これらのカードを無作為に横一列に並べたとき、どのi=1,2,3,4,5に対しても左からi番目のカードに書かれた数がi以上となる確率を求める'(_確率) :-
        '左からi番目のカードに書かれた数がi以上の度数'(1,2,0,0,_分子,_分母),
        \+(_分母 = 0),
        _確率 is _分子 / _分母,!.

'左からi番目のカードに書かれた数がi以上の度数'(5,_カード,X,Y,X,Y) :-
        _カード > 6,!.
'左からi番目のカードに書かれた数がi以上の度数'(_i,_カード,_分子1,_分母1,_分子,_分母) :-
        _カード > 6,
        _i2 is _i + 1,
        '左からi番目のカードに書かれた数がi以上の度数'(_i2,2,_分子2,_分母2,_分子,_分母),!.
'左からi番目のカードに書かれた数がi以上の度数'(_i,_カード,_分子1,_分母1,_分子,_分母) :-
        _カード >= _i,
        _分子2 is _分子1 + 1,
        _分母2 is _分母1 + 1,
        '左からi番目のカードに書かれた数がi以上の度数'(_i,_カード,_分子2,_分母2,_分子,_分母),!.
'左からi番目のカードに書かれた数がi以上の度数'(_i,_カード,_分子1,_分母1,_分子,_分母) :-
        _カード >= _i,
        _分母2 is _分母1 + 1,
        '左からi番目のカードに書かれた数がi以上の度数'(_i,_カード,_分子1,_分母2,_分子,_分母),!.


'2,3,4,5,6の数が書かれたカードが1枚ずつ、合計5枚ある。これらのカードを無作為に横一列に並べたとき、どのi=1,2,3,4,5に対しても左からi番目のカードに書かれた数がi以上となる確率を求める'(_確率) :-
        '左からi番目のカードに書かれた数がi以上の度数'(1,2,0,0,_分子,_分母),
        \+(_分母 = 0),
        _確率 is _分子 / _分母,!.

'左からi番目のカードに書かれた数がi以上の度数'(5,_カード,X,Y,X,Y) :-
        _カード > 6,!.
'左からi番目のカードに書かれた数がi以上の度数'(_i,_カード,_分子1,_分母1,_分子,_分母) :-
        _カード > 6,
        _i2 is _i + 1,
        '左からi番目のカードに書かれた数がi以上の度数'(_i2,2,_分子2,_分母2,_分子,_分母),!.
'左からi番目のカードに書かれた数がi以上の度数'(_i,_カード,_分子1,_分母1,_分子,_分母) :-
        _カード >= _i,
        _分子2 is _分子1 + 1,
        _分母2 is _分母1 + 1,
        '左からi番目のカードに書かれた数がi以上の度数'(_i,_カード,_分子2,_分母2,_分子,_分母),!.
'左からi番目のカードに書かれた数がi以上の度数'(_i,_カード,_分子1,_分母1,_分子,_分母) :-
        _カード >= _i,
        _分母2 is _分母1 + 1,
        '左からi番目のカードに書かれた数がi以上の度数'(_i,_カード,_分子1,_分母2,_分子,_分母),!.