// returns true if a template is valid bool rl_valid_template( production *prod ) { bool numeric_pref = false; bool var_pref = false; int num_actions = 0; for ( action *a = prod->action_list; a; a = a->next ) { num_actions++; if ( a->type == MAKE_ACTION ) { if ( a->preference_type == NUMERIC_INDIFFERENT_PREFERENCE_TYPE ) { numeric_pref = true; } else if ( a->preference_type == BINARY_INDIFFERENT_PREFERENCE_TYPE ) { if ( rhs_value_is_symbol( a->referent ) && ( rhs_value_to_symbol( a->referent )->id.common_symbol_info.symbol_type == VARIABLE_SYMBOL_TYPE ) ) var_pref = true; } } } return ( ( num_actions == 1 ) && ( numeric_pref || var_pref ) ); }
void add_bound_variables_in_rhs_value(agent* thisAgent, rhs_value rv, tc_number tc, cons** var_list) { cons* fl; cons* c; Symbol* sym; if (rhs_value_is_symbol(rv)) { /*- ordinary values (i.e., symbols) -*/ sym = rhs_value_to_symbol(rv); if (sym->symbol_type == VARIABLE_SYMBOL_TYPE) { sym->mark_if_unmarked(thisAgent, tc, var_list); } } else { /*- function calls -*/ fl = rhs_value_to_funcall_list(rv); for (c = fl->rest; c != NIL; c = c->rest) { add_bound_variables_in_rhs_value(thisAgent, static_cast<char*>(c->first), tc, var_list); } } }
char first_letter_from_rhs_value(rhs_value rv) { if (rhs_value_is_symbol(rv)) { return first_letter_from_symbol(rhs_value_to_symbol(rv)); } return '*'; /* function calls, reteloc's, unbound variables */ }
Symbol *instantiate_rhs_value (rhs_value rv, goal_stack_level new_id_level, char new_id_letter, struct token_struct *tok, wme *w) { list *fl; list *arglist; cons *c, *prev_c, *arg_cons; rhs_function *rf; Symbol *result; bool nil_arg_found; if (rhs_value_is_symbol(rv)) { result = rhs_value_to_symbol(rv); symbol_add_ref (result); return result; } if (rhs_value_is_unboundvar(rv)) { long index; Symbol *sym; index = rhs_value_to_unboundvar(rv); if (firer_highest_rhs_unboundvar_index < index) firer_highest_rhs_unboundvar_index = index; sym = *(current_agent(rhs_variable_bindings)+index); if (!sym) { sym = make_new_identifier (new_id_letter, new_id_level); *(current_agent(rhs_variable_bindings)+index) = sym; return sym; } else if (sym->common.symbol_type==VARIABLE_SYMBOL_TYPE) { new_id_letter = *(sym->var.name + 1); sym = make_new_identifier (new_id_letter, new_id_level); *(current_agent(rhs_variable_bindings)+index) = sym; return sym; } else { symbol_add_ref (sym); return sym; } } if (rhs_value_is_reteloc(rv)) { result = get_symbol_from_rete_loc ((unsigned short) rhs_value_to_reteloc_levels_up(rv), (byte)rhs_value_to_reteloc_field_num(rv), tok, w); symbol_add_ref (result); return result; } fl = rhs_value_to_funcall_list(rv); rf = fl->first; /* --- build up a list of the argument values --- */ prev_c = NIL; nil_arg_found = FALSE; arglist = NIL; /* unnecessary, but gcc -Wall warns without it */ for (arg_cons=fl->rest; arg_cons!=NIL; arg_cons=arg_cons->rest) { allocate_cons (&c); c->first = instantiate_rhs_value (arg_cons->first, new_id_level, new_id_letter, tok, w); if (! c->first) nil_arg_found = TRUE; if (prev_c) prev_c->rest = c; else arglist = c; prev_c = c; } if (prev_c) prev_c->rest = NIL; else arglist = NIL; /* --- if all args were ok, call the function --- */ if (!nil_arg_found) result = (*(rf->f))(arglist); else result = NIL; /* --- scan through arglist, dereference symbols and deallocate conses --- */ for (c=arglist; c!=NIL; c=c->rest) if (c->first) symbol_remove_ref ((Symbol *)(c->first)); free_list (arglist); return result; }