actions is set of action instances constraints set of ( , pairsrepresenting < closed under transitivity agenda list of (subgoal,actionpairs to be achievedwhere subgoal is (variable,valuepair causal_links is set of ( , , tripleswhere ai are action instancesand is (variable,valuepair ""self actions actions set of action instances self constraints constraints set of ( , pairs self agenda agenda list of (subgoal,actionpairs to be achieved self causal_links causal_links set of ( , , triples def __str__(self)return ("actions"+str({str(afor in self actions})"\nconstraints"str({(str( ),str( )for ( , in self constraints})"\nagenda"str([(str( ),str( )for ( ,ain self agenda])"\ncausal_links:"str({(str( ),str( ),str( )for ( , , in self causal_links}extract plan constructs total order of action instances that is consistent with the partial order stripspop py -(continued def extract_plan(self)"""returns total ordering of the action instances consistent with the constraints raises indexerror if there is no choice ""sorted_acts [other_acts set(self actionswhile other_actsa random choice([ for in other_acts if all((( ,anot in self constraintsfor in other_acts)]sorted_acts append(aother_acts remove(areturn sorted_acts pop search from strips is an instance of search problem as suchwe need to define the start nodesthe goaland the neighbors of node stripspop py -(continued from display import displayable class pop_search_from_strips(search_problemdisplayable)def __init__(self,planning_problem)version june