def ground(self, rule, functor=None, arguments=None): """Generate ground program for the given rule. :param rule: rule to evaluate :type rule: Rule :param functor: override rule functor :type functor: str :param arguments: query arguments (None if non-ground) :type arguments: list[tuple[Term]] | None :return: ground program :rtype: LogicFormula """ if rule is None: db = self._database target = Term(functor) else: db = self._database.extend() target = None for clause in rule.to_clauses(functor): target = clause.head db += clause if arguments is not None: queries = [target.with_args(*args) for args in arguments] else: queries = [target] with Timer("Grounding", logger="probfoil"): return self._database.engine.ground_all(db, queries=queries)
def test_state_space(self): running = Term('running') fluents = [ running.with_args(Constant('c%d' % i), Constant(0)) for i in range(1, 4) ] states = StateSpace(fluents) for i, state in enumerate(states): self.assertEqual(len(state), 3) n = 0 for j, (fluent, value) in enumerate(state.items()): self.assertEqual(fluent.functor, 'running') self.assertEqual(fluent.args[0], 'c%d' % (j + 1)) self.assertEqual(fluent.args[-1], 0) n += value * (2**j) self.assertEqual(n, i)
def ground(self, rule, functor=None, arguments=None): if rule is None: db = self._database target = Term(functor) else: db = self._database.extend() target = None for clause in rule.to_clauses(functor): target = clause.head db += clause if arguments is not None: # pdb.set_trace() queries = [target.with_args(*args) for args in arguments] else: queries = [target] return self._database.engine.ground_all(db, queries=queries)