Okay. I went through the code and realized that the ```free_symbols``` over ```atoms(Symbol)``` conversion will not create any discrepancies **unless** the expression we are testing is not of ```Integral``` or ```Sum``` forms. 

On the other hand, unit test cases like ```construct_domain([Integral(x*y/2, (x, 0, 2)),Integral(x*y/2, (y, 0, 3))],composite=None)``` gives wrong answer which is ```(EX, [EX(Integral(x*y/2, (x, 0, 2))), EX(Integral(x*y/2, (y, 0, 3)))])```. This is because the expressions of form ```Integrals``` are not simplified at the beginning. For an example, ```construct_domain([Integral(x/2, (x, 0, 2))],composite=None)``` gives ```(EX, [EX(Integral(x/2, (x, 0, 2)))])``` where as actual answer should be ```(ℤ, [1])```. If simplification is implemented at the beginning then the variables other than ```free_symbols``` will not be taken in to account later.