def get_equality_map(constraints, var_map):
    equality_map = {}
    for component in get_components(constraints):
        constants = filter(is_constant, component)
        parameters = filter(is_parameter, component)

        if constants:
            assignment = constants[0]
            if any(val != assignment for val in constants):
                print 'Warning! Infeasible transition'
                return None
        else:
            assignment = component[0]
            dtypes = []
            for param in parameters:
                if isinstance(param, FreeParameter):
                    dtypes.append(param.type)
                if isinstance(param, VarMember):
                    dtypes.append(var_map[var_name(param.var)].dtype)
            if dtypes:
                dtype = dtypes[0]
                assert all(t == dtype for t in dtypes)

        for param in parameters:
            equality_map[param] = assignment
    return equality_map
def get_fluent_preconditions(var_map, effect_vars, eq_map, assign_map):
    fluent_preconditions = []
    for var in effect_vars:
        name, args = var_name(var), make_var_constants(var, var_map)
        pre_args = [assign_map.get(p, p) for p in args + [X[var]]]
        predicate = var_map[name].predicate
        fluent_preconditions.append(predicate(*pre_args))
    for item in eq_map:
        if isinstance(
                item,
                VarMember) and item.temp == X and item.var not in effect_vars:
            name, args = var_name(item.var), make_var_constants(
                item.var, var_map)
            pre_args = [assign_map.get(p, p) for p in args + [X[item.var]]]
            fluent_preconditions.append(var_map[name].predicate(*pre_args))
    return fluent_preconditions
def get_effects(var_map, effect_vars, assign_map):
    effects = []
    for var in effect_vars:
        name, args = var_name(var), make_var_constants(var, var_map)
        pre_args = [assign_map.get(p, p) for p in args + [X[var]]]
        eff_args = [assign_map.get(p, p) for p in args + [nX[var]]]
        predicate = var_map[name].predicate
        effects += [predicate(*eff_args), Not(predicate(*pre_args))]
    return effects
def get_assignments(internal_params, var_map, eq_map):
    assign_map = {}
    for param in internal_params:
        if isinstance(param, FreeParameter):
            dtype = param.type
        elif isinstance(param, VarMember):
            dtype = var_map[var_name(param.var)].dtype
        else:
            raise ValueError(param)
        eq_param = eq_map.get(param, param)
        if not is_constant(eq_param):
            if eq_param not in assign_map:
                assign_map[eq_param] = Par('%s' % len(assign_map), dtype)
            assign_map[param] = assign_map[eq_param]
        else:
            assign_map[param] = dtype(eq_param)
    return assign_map