%%% Continued fractions
%%% Author: Roberto Virga

%% continued fractions representation
continued_fraction : rational -> list -> type.

cont0 : continued_fraction Q (Q , nil)
          <- floor Q Q.

cont1 : continued_fraction Q (A , L)
          <- floor Q A
          <- Q > A
          <- 1 == R * (Q - A)
          <- continued_fraction R L.

%% numerators and denominators of convergents
numerators   : list -> list -> type.
denominators : list -> list -> type.
num_den_iterator : list -> rational -> rational -> list -> type.

ndit0 : num_den_iterator nil I2 I1 nil.

ndit1 : num_den_iterator (A , L) I2 I1 (I3 , PL)
          <- I3 == A * I2 + I1
          <- num_den_iterator L I3 I2 PL.
          
num0 : numerators L PL
         <- num_den_iterator L 1 0 PL.

den0 : denominators L QL
         <- num_den_iterator L 0 1 QL.
