예제 #1
0
def manage_sb_compilation(phi, psi, m_atom, a, E):
    if OPTIMIZED:
        monitoring_atom = ds.Literal(m_atom, False)
        added_precond = (None, False)
        if can_make_true(a, phi):
            R_phi = regression_aux(phi, a)
            rho = ds.Or([R_phi.negate(), monitoring_atom]).simplified()
            added_precond = (rho, True)
        if can_make_true(a, psi):
            R_psi = regression_aux(psi, a)
            if R_psi != psi:
                add_cond_eff(E, create_cond_eff(R_psi, monitoring_atom))
        return added_precond
    else:
        monitoring_atom = ds.Literal(m_atom, False)
        R_phi = regression_aux(phi, a)
        if R_phi == phi:
            added_precond = (None, False)
        else:
            rho = ds.Or([R_phi.negate(), monitoring_atom]).simplified()
            added_precond = (rho, True)
        R_psi = regression_aux(psi, a)
        if R_psi != psi:
            add_cond_eff(E, create_cond_eff(R_psi, monitoring_atom))
        return added_precond
예제 #2
0
def simple_substitution(set, phi):
    if phi == ds.TRUE():
        return ds.TRUE()
    if phi == ds.FALSE():
        return ds.FALSE()
    if isinstance(phi, ds.Literal):
        if phi in set:
            return ds.TRUE()
        phi_neg = phi.negate()
        if phi_neg in set:
            return ds.FALSE()
        else:
            # phi is not in the initial state
            if phi.negated:
                return ds.TRUE()
            else:
                return ds.FALSE()
    elif isinstance(phi, ds.Or):
        return ds.Or([
            simple_substitution(set, component) for component in phi.components
        ])
    else:
        # Conjunction
        return ds.And([
            simple_substitution(set, component) for component in phi.components
        ])
예제 #3
0
def gamma(literal, action):
    disjunction = []
    for cond, eff in get_effects(action):
        if literal == eff:
            if cond == ds.TRUE():
                # in this case cond == TRUE(), so it is a simple effect
                return ds.TRUE()
            # cond is a list of literals
            disjunction.append(cond)
    if not disjunction:
        return ds.FALSE()
    return ds.Or(disjunction)
예제 #4
0
def convert_formula(formula):
    if isinstance(formula, pddl.Atom):
        return ds.Literal(atom_str(formula), False)
    elif isinstance(formula, pddl.NegatedAtom):
        return ds.Literal(atom_str(formula), True)
    elif isinstance(formula, pddl.Disjunction):
        return ds.Or([convert_formula(part) for part in formula.parts])
    elif isinstance(formula, pddl.Conjunction):
        return ds.And([convert_formula(part) for part in formula.parts])
    elif isinstance(formula, pddl.Truth):
        return ds.TRUE()
    elif isinstance(formula, pddl.Falsity):
        return ds.FALSE()
예제 #5
0
def regression(phi, action):
    if isinstance(phi, ds.TRUE):
        return phi
    elif isinstance(phi, ds.FALSE):
        return phi
    elif isinstance(phi, ds.Literal):
        return gamma_substitution(phi, action)
    elif isinstance(phi, ds.Or):
        return ds.Or(
            [regression(component, action) for component in phi.components])
    else:
        # And
        return ds.And(
            [regression(component, action) for component in phi.components])
예제 #6
0
def manage_amo_compilation(phi, m_atom, a, E):
    if OPTIMIZED:
        if not can_make_true(a, phi):
            return None, False
        monitoring_atom = ds.Literal(m_atom, False)
        R = regression_aux(phi, a)
        if R == phi:
            return None, False
        else:
            rho = ds.Or([R.negate(), monitoring_atom.negate(),
                         phi]).simplified()
            add_cond_eff(E, create_cond_eff(R, monitoring_atom))
            return rho, True
    else:
        monitoring_atom = ds.Literal(m_atom, False)
        R = regression_aux(phi, a)
        if R == phi:
            return None, False
        else:
            rho = ds.Or([R.negate(), monitoring_atom.negate(),
                         phi]).simplified()
            add_cond_eff(E, create_cond_eff(R, monitoring_atom))
            return rho, True
예제 #7
0
def gamma_substitution(literal, action):
    negated_literal = literal.negate()
    gamma1 = gamma(literal, action)
    gamma2 = gamma(negated_literal, action).negate()
    conjunction = ds.And([literal, gamma2])
    return ds.Or([gamma1, conjunction])