to handle parameterized actions (which depend on the blocks involved)the actions and the features are all stringscreated for the all combinations of the blocks note that we treat moving to block separately from moving to the tablebecause the blocks needs to be clearbut the table always has room for another block stripsproblem py -(continued ##blocks world def move( , , )"""string for the 'moveaction""return 'move_'+ +'_from_'+ +'_to_'+ def on( )"""string for the 'onfeature""return +'_is_ondef clear( )"""string for the 'clearfeature""return 'clear_'+ def create_blocks_world(blocks {' ',' ',' ',' '})blocks_and_table blocks {'table'stmap {strips(move( , , ),{on( ):yclear( ):trueclear( ):true}{on( ):zclear( ):trueclear( ):false}for in blocks for in blocks_and_table for in blocks if != and != and !=xstmap update({strips(move( , ,'table'){on( ):yclear( ):true}{on( ):'table'clear( ):true}for in blocks for in blocks if != }feature_domain_dict {on( ):blocks_and_table-{xfor in blocksfeature_domain_dict update({clear( ):boolean for in blocks_and_table}return strips_domain(feature_domain_dictstmapthe problem blocks is classic examplewith blocksand the goal consists of two conditions see figure note that this example is challenging because we can' achieve one of the goals and then the otherwhichever one we achieve first has to be undone to achieve the second stripsproblem py -(continued blocks dom create_blocks_world({' ',' ',' '}blocks planning_problem(blocks dom{on(' '):'table'clear(' '):trueon(' '):' 'clear(' '):trueon(' '):'table'clear(' '):false}initial state {on(' '):' 'on(' '):' '}#goal the problem blocks is one to invert tower of size stripsproblem py -(continued blocks dom create_blocks_world({' ',' ',' ',' '}version june