here is representation of the -queens problemwhere the variables are the columns and the values are the rows in which the queen is placed the original queens problem on standard ( chess board is n_queens( cspexamples py -(continued def queens(ri,rj)"""ri and rj are different rowsreturn the condition that the queens cannot take each other""def no_take(ci,cj)"""is true if queen at (ri,cicannot take queen at (rj,cj)""return ci !cj and abs(ri-ci!abs(rj-cjreturn no_take def n_queens( )"""returns csp for -queens""columns list(range( )variables [variable( " { }",columnsfor in range( )return csp(" -queens"variables[constraint([variables[ ]variables[ ]]queens( , )for in range(nfor in range(nif ! ] try the csp n_queens( in one of the solvers what is the smallest for which there is solutionexercise how many constraints does this representation of the -queens problem producecan it be done with fewer constraintseither explain why it can' be done with fewer constraintsor give solution using fewer constraints unit tests the following defines unit test for csp solversby default using example csp cspexamples py -(continued def test_csp(csp_solvercsp=csp solutions=[{ }{ }])"""csp_solver is solver that takes csp and returns solution csp is constraint satisfaction problem solutions is the list of all solutions to csp this tests whether the solution returned by csp_solver is solution ""print("testing csp with",csp_solver __doc__sol csp_solver(cspprint("solution found:",sol assert sol in solutions"solution not correct for "+str(cspprint("passed unit test"exercise modify test so that instead of taking in list of solutionsit checks whether the returned solution actually is solution version june