reasoning with constraints kwargs is the keyword arguments for displayable superclass ""self csp csp super(__init__(**kwargsor displayable __init__(self,**kwargsthe following implementation of arc consistency maintains the set to do of (variableconstraintpairs that are to be checked it takes in domain dictionary and returns new domain dictionary it needs to be careful to avoid side effects (by copying the domains dictionary and the to do setcspconsistency py -(continued def make_arc_consistent(selforig_domains=noneto_do=none)"""makes this csp arc-consistent using generalized arc consistency orig_domains is the original domains to_do is set of (variable,constraintpairs returns the reduced domains (an arc-consistent variable:domain dictionary""if orig_domains is noneorig_domains {var:var domain for var in self csp variablesif to_do is noneto_do {(varconstfor const in self csp constraints for var in const scopeelseto_do to_do copy(use copy of to_do domains orig_domains copy(self display( ,"performing ac with domains"domainswhile to_dovarconst self select_arc(to_doself display( "processing arc ("var","const")"other_vars [ov for ov in const scope if ov !varnew_domain {val for val in domains[varif self any_holds(domainsconst{varval}other_vars)if new_domain !domains[var]self display( "arc("var","const"is inconsistent"self display( "domain pruned""dom("var"="new_domaindue to "constdomains[varnew_domain add_to_do self new_to_do(varconstto_do to_do |add_to_do set union self display( adding"add_to_do if add_to_do else "nothing""to to_do "self display( "arc("var","const"now consistent"self display( "ac done reduced domains"domainsreturn domains def new_to_do(selfvarconst)"""returns new elements to be added to to_do after assigning version june