in forward plannera node is state state consists of an assignmentwhich is variable:value dictionary in order to be able to do multiple-path pruningwe need to define hash functionand equality between states stripsforwardplanner py -forward planner with strips actions from searchproblem import arcsearch_problem from stripsproblem import stripsstrips_domain class state(object)def __init__(self,assignment)self assignment assignment self hash_value none def __hash__(self)if self hash_value is noneself hash_value hash(frozenset(self assignment items())return self hash_value def __eq__(self,st)return self assignment =st assignment def __str__(self)return str(self assignmentin order to define search problem (page )we need to define the goal conditionthe start nodesthe neighboursand (optionallya heuristic function here zero is the default heuristic function stripsforwardplanner py -(continued def zero(*args,**nargs)"""always returns ""return class forward_strips(search_problem)""" search problem from planning problem wherea node is state object the dynamics are specified by the strips representation of actions ""def __init__(selfplanning_problemheur=zero)"""creates forward search space from planning problem heur(state,goalis heuristic functionan underestimate of the cost from state to goalwhere both state and goals are feature:value dictionaries ""self prob_domain planning_problem prob_domain self initial_state state(planning_problem initial_stateself goal planning_problem goal self heur heur def is_goal(selfstate)"""is true if node is goal every goal feature has the same value in the state and the goal ""return all(state assignment[prop]==self goal[propversion june