def __init__(self, dom_string):
     if dom_string is not None:
         super().__init__(dom_string)
         self.prelude = ""
         self.actions = []
         for child in self.children:
             tokens = re.split(r'\s', child)
             identifier = tokens[0]
             if identifier == 'domain':
                 self.name = tokens[1]
             elif identifier == ':requirements':
                 self.requirements = Utils.get_colon_sections(child)[1:]
             elif identifier == ':types':
                 self.type_string = child.replace(":types", "")
             elif identifier == ':predicates':
                 # self.predicates = PDDLPart.PDDLPart(child).children  # TODO: Map these to their own objects eventually?
                 self.predicates = [
                     fluenttree.AbstractPredicate(ch)
                     for ch in PDDLPart.PDDLPart(child).children
                 ]
             elif identifier == ':action':
                 self.actions.append(Operator.Operator(child))
         self.summary = self.name + "\nPredicates: " + str(
             len(self.predicates)) + "\nActions: " + str(len(self.actions))
     else:  # Blank domain for writing into
         super().__init__("")
         self.actions = []
         self.name = "EMPTY-DOMAIN"
         self.requirements = []
         self.type_string = ""
         self.predicates = []
         self.summary = self.name + "\nPredicates: " + str(
             len(self.predicates)) + "\nActions: " + str(len(self.actions))
         self.prelude = ""
예제 #2
0
 def find_predicates(self):
     base_preds = self.base_domain.predicates
     bredicates = []
     for pred in base_preds:
         bredicates.append(
             fluenttree.AbstractPredicate(
                 f"believes_not_{pred.identifier} ?who - character " +
                 ' '.join([
                     p + ' - ' + t
                     for p, t in zip(pred.parameters, pred.types)
                 ])))
         bredicates.append(
             fluenttree.AbstractPredicate(
                 f"believes_{pred.identifier} ?who - character " +
                 ' '.join([
                     p + ' - ' + t
                     for p, t in zip(pred.parameters, pred.types)
                 ])))
     return base_preds + bredicates
예제 #3
0
    def __init__(self, to_parse):
        if to_parse is not None:

            super().__init__(to_parse)
            self.base_string = to_parse
            self.name = re.split(r'\s', self.base_string)[1]
            tokens = Utils.get_colon_sections(self.base_string)
            self.agents = []
            self.parameters = []
            self.precondition = None
            self.effect = None
            self.fail = None
            for token in tokens:
                title = token.split()[0]
                if title == ":action":
                    self.name = token.split()[1]
                    # self.name = fluenttree.first_word(token)
                elif title == ":parameters":
                    # self.parameters = Parameter.parameter_list(Utils.find_child(token)[0])
                    self.parameters = fluenttree.AbstractPredicate(
                        "X " + Utils.find_child(token)[0])
                    self.parameters.identifier = ""
                elif title == ":precondition":
                    self.precondition = fluenttree.FluentTree(
                        Utils.find_child(token)[0])
                elif title == ":effect":
                    self.effect = fluenttree.FluentTree(
                        Utils.find_child(token)[0])
                elif title == ":fail":
                    self.fail = fluenttree.FluentTree(
                        Utils.find_child(token)[0])
                elif title == ":agents":
                    self.agents = Utils.get_question_mark_sections(
                        Utils.find_child(token)[0])
        else:
            super().__init__("")
            self.base_string = "blank"
            self.name = "blank"
            self.agents = []
            self.parameters = fluenttree.AbstractPredicate("")
            self.precondition = None
            self.effect = None
            self.fail = None
예제 #4
0
    def find_init_state(self):
        state = []
        for pred in self.base_problem.init_state:  #[fluenttree.AbstractPredicate(c) for c in self.base_problem.init_state]:
            # if pred.is_belief and not pred.is_not:
            #     pred = fluenttree.AbstractPredicate(f"believes_{pred.identifier} {' '.join(pred.parameters)}")
            # elif pred.is_belief and pred.is_not:
            #     pred = fluenttree.AbstractPredicate(f"believes_not{pred.identifier} {' '.join(pred.parameters)}")
            flatten_beliefs_with_not(pred)
            state.append(fluenttree.AbstractPredicate(pred))

        return state
예제 #5
0
def flatten_beliefs(ft):
    if ft.is_leaf:
        return
    else:
        new_children = []
        for c in ft.child_trees:
            if not c.is_belief:
                new_children.append(c)
            else:
                c_predicate_form = fluenttree.AbstractPredicate(c)
                new_child = fluenttree.FluentTree(
                    "believes_" + c_predicate_form.identifier + ' ' +
                    ' '.join(c_predicate_form.parameters))
                new_children.append(new_child)
        ft.child_trees = new_children
        for c in ft.child_trees:
            flatten_beliefs(c)
예제 #6
0
def make_beleaves(
        ft, agent):  # TODO: Make special cases for "for all" and "when" trees
    if ft.is_leaf:
        ft.identifier = "believes_" + ft.identifier
        ft.words.insert(1, agent)
    elif ft.identifier == "not" and len(
            ft.child_trees) == 1 and ft.child_trees[0].is_leaf:
        leaf_pred = fluenttree.AbstractPredicate(ft.child_trees[0])
        ft.identifier = "believes_not_" + leaf_pred.identifier
        ft.words = [ft.identifier, agent] + leaf_pred.parameters
        ft.child_trees = []
        ft.is_leaf = True
    else:
        # non_belief_children = [c for c in ft.child_trees if not c.is_belief]
        for child in ft.child_trees:
            if child.is_belief:
                flatten_beliefs_with_not(child)
            else:
                make_beleaves(child, agent)
예제 #7
0
def flatten_beliefs_with_not(ft):
    if ft.is_belief:
        if len(ft.child_trees) > 0 and ft.child_trees[0].identifier == "not":
            leaf = fluenttree.AbstractPredicate(
                ft.child_trees[0].child_trees[0])
            upper = fluenttree.AbstractPredicate(ft)
            ft.identifier = 'believes_not_' + leaf.identifier
            ft.words = [ft.identifier] + [upper.parameters[0]
                                          ] + leaf.parameters
        else:
            ft_pred = fluenttree.AbstractPredicate(ft)
            ft.identifier = "believes_" + ft_pred.identifier
            ft.words = [ft.identifier] + ft_pred.parameters
        ft.is_belief = False
        ft.child_trees = []
    elif ft.is_leaf:
        return
    else:
        new_children = []
        for c in ft.child_trees:
            if not c.is_belief:
                new_children.append(c)
            else:
                if len(c.child_trees
                       ) > 0 and c.child_trees[0].identifier == "not":
                    leaf = fluenttree.AbstractPredicate(
                        c.child_trees[0].child_trees[0])
                    upper = fluenttree.AbstractPredicate(c)
                    new_child = fluenttree.FluentTree(
                        "believes_not_" + leaf.identifier + ' ' +
                        ' '.join([upper.parameters[0]] + leaf.parameters),
                        depth=c.depth)
                else:
                    c_predicate_form = fluenttree.AbstractPredicate(c)
                    new_child = fluenttree.FluentTree(
                        "believes_" + c_predicate_form.identifier + ' ' +
                        ' '.join(c_predicate_form.parameters),
                        depth=c.depth)
                new_children.append(new_child)
        ft.child_trees = new_children
        for c in ft.child_trees:
            flatten_beliefs_with_not(c)