このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1364009659/125
#  
#  質問、 
#  ave関数でなぜかIntが返されます。[1.0, 2.0, 3.0]ならばsumはで、lengthは3なので戻りは1.0のはずなのですが。 
#  
#  value :: [Float] -> [Float] 
#  value [] = [] 
#  value (x:xs) = case (ave (x:xs) /= 0) of 
#  True -> (x/ave (x:xs)) : value xs 
#  False -> [] 
#  
#  ave :: [Float] -> Float 
#  ave (x:xs) = (sum (x:xs)) / (fromIntegral (length (x:xs))) 
#  ave [] = 0 
#  

value([_x|_xs],[_y|_ys]) :-
        ave([_x|_xs],_ave),
        \+(_ave = 0.0),
        value(_xs,_ys),
        _y is _x / _ave,!.
value(_,[]).

ave([_x|_xs],_ave) :-
        sum([_x|_xs],_sum),
        length([_x|_xs],_length),
        _ave is _sum / _length.

sum([],0).
sum([M|R],S) :-
        sum(R,S_1),
        S is M + S_1.