*$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;
}
*