*$ENTRY Go { * = <A ( 1 '/' 3 ) '-' 1 '/' 7 >; * } *A { * (e1) e2 = <Prout <Q_add (e1) e2 >> * <Prout <Q_sub (e1) e2 >> * <Prout <Q_mul (e1) e2 >> * <Prout <Q_div (e1) e2 >> *} * Сложение $ENTRY Q_add { (0) 0 = ; (e1) 0 = e1; (0) e2 = e2; (e1) = e1; () e2 = e2; (e1 '/' e2) e3 '/' e4 = <Q_st <Add (<Mul (e1) e4>) <Mul (e2) e3> > '/' <Mul (e2) e4> >; (e1 '/' e2) e3 = <Q_add (e1 '/' e2) e3 '/' 1 >; (e1) e3 '/' e4 = <Q_add (e1 '/' 1 ) e3 '/' e4 >; (e1) e2 = <Q_st <Add (e1) e2>>; } * Вычитание $ENTRY Q_Sub { (e1) = e1; (e1) 0 = e1; (e1) '-' e2 = <Q_add (e1) e2>; (e1) e2 = <Q_add (e1) '-' e2 >; } * Умножение $ENTRY Q_mul { (e1) 0 = 0; (0) e2 = 0; (e1) = 0; () e2 = 0; (e1 '/' e2) e3 '/' e4 = <Q_st <Mul (e1) e3> '/' <Mul (e2) e4>>; (e1 '/' e2) e3 = <Q_mul (e1 '/' e2) e3 '/' 1 >; (e1) e3 '/' e4 = <Q_mul (e1 '/' 1 ) e3 '/' e4>; (e1) e2 = <Q_st <Mul (e1) e2> >; } * Деление $ENTRY Q_div { (0) e2 = ; () e2 = ; (e1) e2 = <Q_mul (e1) <Q_div1 e2>>; } Q_div1 { '-'e1 = '-' <Q_div1 e1>; e1 '/' e2 = e2 '/' e1; e1 = 1 '/' e1; } * Приведение рационального числа к стандартной форме Q_st { = ; 0 = ; '-' 0 = ; 0 '/' e2 = ; '-' 0 '/' e2 = ; '-'e1 = '-' <Q_st e1>; e1 '/' e2 , <Nod (e1) (e2)>: e3 = <Q_st1 (<Div (e1) e3>) <Div (e2) e3> > ; e1 = e1; } Nod { (e1) (0 0) = e1 ; (e1) (0 ) = e1 ; (e1) (e2) = <Nod (e2) (<Mod (e1) e2>) >; } Q_st1 { (e1) 1 = e1; (e1) e2 = e1 '/' e2; } *