void create_hard_mixed_operators( Operator *o, int curr_var ) { int t, i, m; WffNode *tmp1, *w, *ww; MixedOperator *tmp2; if ( curr_var < o->num_vars ) { if ( o->removed[curr_var] ) { /* param doesn't matter -- select any appropriate type constant * at least one there; otherwise, op would not have been translated. */ linst_table[curr_var] = gtype_consts[o->var_types[curr_var]][0]; create_hard_mixed_operators( o, curr_var + 1 ); linst_table[curr_var] = -1; return; } t = o->var_types[curr_var]; for ( i = 0; i < gtype_size[t]; i++ ) { linst_table[curr_var] = gtype_consts[t][i]; create_hard_mixed_operators( o, curr_var + 1 ); linst_table[curr_var] = -1; } return; } tmp1 = instantiate_wff( o->preconds ); if ( tmp1->connective == FAL ) { free_WffNode( tmp1 ); return; } dnf( &tmp1 ); cleanup_wff( &tmp1 ); if ( tmp1->connective == FAL ) { free_WffNode( tmp1 ); return; } /* only debugging, REMOVE LATER */ if ( is_dnf( tmp1 ) == -1 ) { printf("\n\nILLEGAL DNF %s AFTER INSTANTIATION\n\n", o->name); print_Wff( tmp1, 0 ); exit( 1 ); } switch ( tmp1->connective ) { case OR: for ( w = tmp1->sons; w; w = w->next ) { tmp2 = new_MixedOperator( o ); for ( i = 0; i < o->num_vars; i++ ) { tmp2->inst_table[i] = linst_table[i]; } if ( w->connective == AND ) { m = 0; for ( ww = w->sons; ww; ww = ww->next ) m++; tmp2->preconds = ( Fact * ) calloc( m, sizeof( Fact ) ); tmp2->num_preconds = m; m = 0; for ( ww = w->sons; ww; ww = ww->next ) { tmp2->preconds[m].predicate = ww->fact->predicate; for ( i = 0; i < garity[ww->fact->predicate]; i++ ) { tmp2->preconds[m].args[i] = ww->fact->args[i]; } m++; } } else { tmp2->preconds = ( Fact * ) calloc( 1, sizeof( Fact ) ); tmp2->num_preconds = 1; tmp2->preconds[0].predicate = w->fact->predicate; for ( i = 0; i < garity[w->fact->predicate]; i++ ) { tmp2->preconds[0].args[i] = w->fact->args[i]; } } tmp2->effects = instantiate_Effect( o->effects ); tmp2->next = ghard_mixed_operators; ghard_mixed_operators = tmp2; gnum_hard_mixed_operators++; } break; case AND: tmp2 = new_MixedOperator( o ); for ( i = 0; i < o->num_vars; i++ ) { tmp2->inst_table[i] = linst_table[i]; } m = 0; for ( w = tmp1->sons; w; w = w->next ) m++; tmp2->preconds = ( Fact * ) calloc( m, sizeof( Fact ) ); tmp2->num_preconds = m; m = 0; for ( w = tmp1->sons; w; w = w->next ) { tmp2->preconds[m].predicate = w->fact->predicate; for ( i = 0; i < garity[w->fact->predicate]; i++ ) { tmp2->preconds[m].args[i] = w->fact->args[i]; } m++; } tmp2->effects = instantiate_Effect( o->effects ); tmp2->next = ghard_mixed_operators; ghard_mixed_operators = tmp2; gnum_hard_mixed_operators++; break; case ATOM: tmp2 = new_MixedOperator( o ); for ( i = 0; i < o->num_vars; i++ ) { tmp2->inst_table[i] = linst_table[i]; } tmp2->preconds = ( Fact * ) calloc( 1, sizeof( Fact ) ); tmp2->num_preconds = 1; tmp2->preconds[0].predicate = tmp1->fact->predicate; for ( i = 0; i < garity[tmp1->fact->predicate]; i++ ) { tmp2->preconds[0].args[i] = tmp1->fact->args[i]; } tmp2->effects = instantiate_Effect( o->effects ); tmp2->next = ghard_mixed_operators; ghard_mixed_operators = tmp2; gnum_hard_mixed_operators++; break; case TRU: tmp2 = new_MixedOperator( o ); for ( i = 0; i < o->num_vars; i++ ) { tmp2->inst_table[i] = linst_table[i]; } tmp2->effects = instantiate_Effect( o->effects ); tmp2->next = ghard_mixed_operators; ghard_mixed_operators = tmp2; gnum_hard_mixed_operators++; break; default: printf("\n\nillegal connective %d in parsing DNF precond.\n\n", tmp1->connective); exit( 1 ); } free_WffNode( tmp1 ); }
void create_hard_pseudo_effects( PseudoAction *a, Effect *e, int curr_var ) { int par, t, i, m; WffNode *tmp1, *w, *ww; PseudoActionEffect *tmp2; if ( curr_var < e->num_vars ) { par = a->operator->num_vars + curr_var; t = e->var_types[curr_var]; for ( i = 0; i < gtype_size[t]; i++ ) { linst_table[par] = gtype_consts[t][i]; create_hard_pseudo_effects( a, e, curr_var + 1 ); linst_table[par] = -1; } return; } tmp1 = instantiate_wff( e->conditions ); if ( tmp1->connective == FAL ) { free_WffNode( tmp1 ); return; } dnf( &tmp1 ); cleanup_wff( &tmp1 ); /* only debugging, REMOVE LATER */ if ( is_dnf( tmp1 ) == -1 ) { printf("\n\nILLEGAL DNF %s AFTER INSTANTIATION\n\n", a->operator->name); print_Wff( tmp1, 0 ); exit( 1 ); } switch ( tmp1->connective ) { case OR: for ( w = tmp1->sons; w; w = w->next ) { tmp2 = new_PseudoActionEffect(); if ( w->connective == AND ) { m = 0; for ( ww = w->sons; ww; ww = ww->next ) m++; tmp2->conditions = ( Fact * ) calloc( m, sizeof( Fact ) ); tmp2->num_conditions = m; m = 0; for ( ww = w->sons; ww; ww = ww->next ) { tmp2->conditions[m].predicate = ww->fact->predicate; for ( i = 0; i < garity[ww->fact->predicate]; i++ ) { tmp2->conditions[m].args[i] = ww->fact->args[i]; } m++; } } else { tmp2->conditions = ( Fact * ) calloc( 1, sizeof( Fact ) ); tmp2->num_conditions = 1; tmp2->conditions[0].predicate = w->fact->predicate; for ( i = 0; i < garity[w->fact->predicate]; i++ ) { tmp2->conditions[0].args[i] = w->fact->args[i]; } } make_instantiate_literals( tmp2, e->effects ); tmp2->next = a->effects; a->effects = tmp2; a->num_effects++; } break; case AND: tmp2 = new_PseudoActionEffect(); m = 0; for ( w = tmp1->sons; w; w = w->next ) m++; tmp2->conditions = ( Fact * ) calloc( m, sizeof( Fact ) ); tmp2->num_conditions = m; m = 0; for ( w = tmp1->sons; w; w = w->next ) { tmp2->conditions[m].predicate = w->fact->predicate; for ( i = 0; i < garity[w->fact->predicate]; i++ ) { tmp2->conditions[m].args[i] = w->fact->args[i]; } m++; } make_instantiate_literals( tmp2, e->effects ); tmp2->next = a->effects; a->effects = tmp2; a->num_effects++; break; case ATOM: tmp2 = new_PseudoActionEffect(); tmp2->conditions = ( Fact * ) calloc( 1, sizeof( Fact ) ); tmp2->num_conditions = 1; tmp2->conditions[0].predicate = tmp1->fact->predicate; for ( i = 0; i < garity[tmp1->fact->predicate]; i++ ) { tmp2->conditions[0].args[i] = tmp1->fact->args[i]; } make_instantiate_literals( tmp2, e->effects ); tmp2->next = a->effects; a->effects = tmp2; a->num_effects++; break; case TRU: tmp2 = new_PseudoActionEffect(); make_instantiate_literals( tmp2, e->effects ); tmp2->next = a->effects; a->effects = tmp2; a->num_effects++; break; default: printf("\n\nillegal connective %d in parsing DNF precond.\n\n", tmp1->connective); exit( 1 ); } free_WffNode( tmp1 ); }
void create_final_goal_state( void ) { WffNode *w, *ww; int m, i, adr; Action *tmp; /* * DEA - University of Brescia */ // set_relevants_in_wff( &ggoal ); if (set_relevants_in_wff (&ggoal)) return; /* * End of DEA */ cleanup_wff( &ggoal ); if ( ggoal->connective == TRU ) { /* * DEA - University of Brescia */ // printf("\nff: goal can be simplified to TRUE. The empty plan solves it\n\n"); printf ("\n%s: goal can be simplified to TRUE. The empty plan solves it\n\n", NAMEPRG); /* * End of DEA */ exit( 1 ); } if ( ggoal->connective == FAL ) { /* * DEA - University of Brescia */ if (GpG.inst_duplicate_param == FALSE) printf("\n%s: create_final_goal_state(): goal can be simplified to FALSE. \n Please run %s with option '-same_objects' \n\n", NAMEPRG, NAMEPRG); else printf("\n%s: create_final_goal_state(): goal can be simplified to FALSE.\n No plan will solve it\n\n", NAMEPRG); // printf("\nff: goal can be simplified to FALSE. No plan will solve it\n\n"); /* * End of DEA */ exit( 1 ); } switch ( ggoal->connective ) { case OR: if ( gnum_relevant_facts == MAX_RELEVANT_FACTS ) { printf("\nincrease MAX_RELEVANT_FACTS! (current value: %d)\n\n", MAX_RELEVANT_FACTS); exit( 1 ); } grelevant_facts[gnum_relevant_facts].predicate = -3; gnum_relevant_facts++; for ( w = ggoal->sons; w; w = w->next ) { tmp = new_Action(); if ( w->connective == AND ) { m = 0; for ( ww = w->sons; ww; ww = ww->next ) m++; tmp->preconds = ( int * ) calloc( m, sizeof( int ) ); tmp->num_preconds = 0; for ( ww = w->sons; ww; ww = ww->next ) { lp = ww->fact->predicate; for ( i = 0; i < garity[lp]; i++ ) { largs[i] = ww->fact->args[i]; } adr = fact_adress(); tmp->preconds[tmp->num_preconds++] = lindex[lp][adr]; } } else { tmp->preconds = ( int * ) calloc( 1, sizeof( int ) ); tmp->num_preconds = 1; lp = w->fact->predicate; for ( i = 0; i < garity[lp]; i++ ) { largs[i] = w->fact->args[i]; } adr = fact_adress(); tmp->preconds[0] = lindex[lp][adr]; } tmp->effects = ( ActionEffect * ) calloc( 1, sizeof( ActionEffect ) ); tmp->num_effects = 1; tmp->effects[0].conditions = NULL; tmp->effects[0].num_conditions = 0; tmp->effects[0].dels = NULL; tmp->effects[0].num_dels = 0; tmp->effects[0].adds = ( int * ) calloc( 1, sizeof( int ) ); tmp->effects[0].adds[0] = gnum_relevant_facts - 1; tmp->effects[0].num_adds = 1; tmp->next = gactions; gactions = tmp; gnum_actions++; lnum_effects++; } ggoal_state.F[0] = gnum_relevant_facts - 1; ggoal_state.num_F = 1; break; case AND: for ( w = ggoal->sons; w; w = w->next ) { lp = w->fact->predicate; for ( i = 0; i < garity[lp]; i++ ) { largs[i] = w->fact->args[i]; } adr = fact_adress(); ggoal_state.F[ggoal_state.num_F++] = lindex[lp][adr]; } break; case ATOM: ggoal_state.num_F = 1; lp = ggoal->fact->predicate; for ( i = 0; i < garity[lp]; i++ ) { largs[i] = ggoal->fact->args[i]; } adr = fact_adress(); ggoal_state.F[0] = lindex[lp][adr]; break; default: printf("\n\nwon't get here: non ATOM,AND,OR in fully simplified goal\n\n"); exit( 1 ); } }