class rational
{
    public int n, d;   //numerator and denominator

    public rational(int a, int b) {n=a; d=b;}  // constructor
    
    public boolean equals(rational B) // compare B with this rational
    { return n*B.d == d*B.n; }

    public rational mult(rational B)
    { return new rational(n*B.n, d*B.d); }

    public rational add(rational B)  // add B to this rational
    {
	int a = n*B.d + d*B.n;
	int b = d*B.d;
	return new rational(a,b);
    }

    public String toString() { return n+"/"+d; }  // output

    public static void main(String[] args)
    {
	rational A = new rational(1,2);
	rational B = new rational(2,3);
	System.out.println(A.mult(B));
	System.out.println(A.equals(new rational(2,4)));
	rational C = new rational(1,0);
    }

} // class rational


aspect AAA
{
   public static int rational.gcd(int a, int b)
   { if (a==0) return b; else return gcd(b%a,a); }

   after(rational R): execution(rational.new(int,int)) && target(R)
       {
	   int g = rational.gcd(R.n,R.d);
	   R.n = R.n/g;  R.d = R.d/g;
       }
  
}
