コード例 #1
0
def parse_goal_state(pddl_domain_name, pddl_file_name):

    t = parsePDDL(task_filename=pddl_file_name, domain_filename=pddl_domain_name)

    # Only lift the goal if it is a conjunction of atoms
    if Conjunction != t.goal.__class__:
        print ("Error: Goal condition must be a conjunction of atoms -- " + str(t.goal.__class__))
        return set([])

    # Lift the goal state
    goals = set([])
    for g in t.goal.parts:
        if Atom != g.__class__:
            print ("Error: Goal condition not an Atom -- " + str(init.__class__))
            return set([])

        fluent = str(g.predicate)

        for arg in g.args:
            fluent += ' ' + str(arg)

        # We don't want to keep around the trivial equality constraints
        if fluent[0] != '=':
            goals.add(Fluent(fluent))

    return goals
コード例 #2
0
def parse_problem(pddl_domain_name, pddl_file_name):

    # Get the init and goal conditions
    I = parse_init_state(pddl_domain_name, pddl_file_name)
    G = parse_goal_state(pddl_domain_name, pddl_file_name)

    # Parse our task
    t = parsePDDL(task_filename=pddl_file_name,
                  domain_filename=pddl_domain_name)
    _, atoms, actions, _, _ = explore(t)

    F = set([])
    FMAP = {}
    for atom in atoms:
        fname = ' '.join([atom.predicate] + list(atom.args))
        f = Fluent(fname)
        F.add(f)
        FMAP[fname] = f

    A = {}
    for a in actions:
        PRE = set([])
        ADD = set([])
        DEL = set([])

        for p in a.precondition:
            assert not p.negated, "Error: Cannot handle negative preconditions"
            PRE.add(FMAP[' '.join([p.predicate] + list(p.args))])

        for cond, fact in a.add_effects:
            ADD.add(FMAP[' '.join([fact.predicate] + list(fact.args))])

        for cond, fact in a.del_effects:
            DEL.add(FMAP[' '.join([fact.predicate] + list(fact.args))])

        A[a.name[1:-1].lower().strip()] = Action(PRE, ADD, DEL,
                                                 a.name[1:-1].lower().strip())

    return (F, A, I, G)
コード例 #3
0
def parse_init_state(pddl_domain_name, pddl_file_name):

    t = parsePDDL(task_filename=pddl_file_name, domain_filename=pddl_domain_name)

    # Lift the initial state
    inits = set([])
    for init in t.init:
        # We don't want to keep around the trivial equality constraints
        if Assign == init.__class__:
            continue

        if Atom != init.__class__:
            print ("Error: Init condition not an Atom -- " + str(init.__class__))
            return set([])

        fluent = str(init.predicate)

        for arg in init.args:
            fluent += ' ' + str(arg)

        inits.add(Fluent(fluent))

    return inits