示例#1
0
    def step(self):
        while self.intentions and not self.intentions[0]:
            self.intentions.popleft()

        for intention_stack in self.intentions:
            intention = intention_stack[-1]

            # Suspended / waiting.
            if intention.waiter is not None:
                if intention.waiter.poll(self.env):
                    intention.waiter = None
                else:
                    continue

            break
        else:
            return False

        instr = intention.instr
        #fahid

        if not instr:
            intention_stack.pop()
            if not intention_stack:
                self.intentions.remove(intention_stack)
            elif intention.calling_term:
                frozen = intention.head_term.freeze(intention.scope, {})
                calling_intention = intention_stack[-1]
                if not agentspeak.unify(intention.calling_term, frozen,
                                        calling_intention.scope,
                                        calling_intention.stack):
                    raise RuntimeError("back unification failed")
            return True

        try:
            if instr.f(self, intention):
                #fahid.... note....
                intention.instr = instr.success
            else:
                intention.instr = instr.failure
                if not intention.instr:
                    raise AslError("plan failure")
        except AslError as err:
            log = agentspeak.Log(LOGGER)
            raise log.error("%s",
                            err,
                            loc=instr.loc,
                            extra_locs=instr.extra_locs)
        except Exception as err:
            log = agentspeak.Log(LOGGER)
            raise log.exception("agent %r raised python exception: %r",
                                self.name,
                                err,
                                loc=instr.loc,
                                extra_locs=instr.extra_locs)

        return True
示例#2
0
def repl(hook):
    lineno = 0
    tokens = []

    while True:
        try:
            log = agentspeak.Log(agentspeak.get_logger(__name__), 3)

            if not tokens:
                line = agentspeak.util.prompt("agentspeak.parser >>> ")
            else:
                line = agentspeak.util.prompt("agentspeak.parser ... ")

            lineno += 1

            tokens.extend(agentspeak.lexer.tokenize(agentspeak.StringSource("<stdin>", line), log, lineno))

            while tokens:
                token_stream = iter(tokens)
                try:
                    agent = parse_agent("<stdin>", token_stream, log, frozenset())
                except StopIteration:
                    log.throw()
                    break
                else:
                    log.throw()
                    hook(agent)
                    tokens = list(token_stream)
        except agentspeak.AggregatedError as error:
            print(str(error), file=sys.stderr)
            tokens = []
        except KeyboardInterrupt:
            print()
            sys.exit(0)
示例#3
0
    def test_unexpected_eof(self):
        src = agentspeak.StringSource("<test>", "a")
        log = agentspeak.Log(agentspeak.get_logger(__name__), 3)
        tokens = agentspeak.lexer.TokenStream(src, log)

        with self.assertRaises(agentspeak.AggregatedError):
            agentspeak.parser.parse("<test>", tokens, log, frozenset())
示例#4
0
def main(source, lineno=1):
    log = agentspeak.Log(agentspeak.get_logger(__name__), 3)

    for tok in tokenize(source, log, lineno):
        log.info("%s", tok.lexeme, loc=tok.loc)

    log.throw()
示例#5
0
    def test_unify_return_value(self):
        src = agentspeak.StringSource("<test>", "+!p <- (X = 2) + 1 > 0.")
        log = agentspeak.Log(agentspeak.get_logger(__name__), 3)
        tokens = agentspeak.lexer.TokenStream(src, log)

        with self.assertRaises(agentspeak.AggregatedError):
            agentspeak.parser.parse("<test>", tokens, log, frozenset())
            log.throw()
示例#6
0
    def test_rule_head_not_unifiable(self):
        src = agentspeak.StringSource("<test>", "rule(X + 1) :- true.")
        log = agentspeak.Log(agentspeak.get_logger(__name__), 3)
        tokens = agentspeak.lexer.TokenStream(src, log)
        agentspeak.parser.parse("<test>", tokens, log, frozenset())

        with self.assertRaises(agentspeak.AggregatedError):
            log.throw()
示例#7
0
    def test_formula_type(self):
        src = agentspeak.StringSource("<test>", "+!plan <- ?true.")
        log = agentspeak.Log(agentspeak.get_logger(__name__), 3)
        tokens = agentspeak.lexer.TokenStream(src, log)
        agentspeak.parser.parse("<test>", tokens, log, frozenset())

        with self.assertRaises(agentspeak.AggregatedError):
            log.throw()
示例#8
0
def main(source, hook):
    log = agentspeak.Log(agentspeak.get_logger(__name__), 3)

    tokens = agentspeak.lexer.TokenStream(source, log, 1)
    agent = parse(source.name, tokens, log)

    log.throw()

    hook(agent)
示例#9
0
    def _build_agent(self, source, actions, agent_cls=Agent, name=None):
        # Parse source.
        log = agentspeak.Log(LOGGER, 3)
        tokens = agentspeak.lexer.TokenStream(source, log)
        ast_agent = agentspeak.parser.parse(source.name, tokens, log)
        log.throw()

        return self.build_agent_from_ast(source, ast_agent, actions, agent_cls,
                                         name)
示例#10
0
def repl(agent, env, actions):
    lineno = 0
    tokens = []

    env = Environment()
    variables = {}
    intention = Intention()

    while True:
        try:
            log = agentspeak.Log(LOGGER, 3)

            try:
                if not tokens:
                    line = agentspeak.util.prompt("%s >>> " % agent.name)
                else:
                    line = agentspeak.util.prompt("%s ... " % agent.name)
            except KeyboardInterrupt:
                print()
                sys.exit(0)

            lineno += 1

            tokens.extend(
                agentspeak.lexer.tokenize(
                    agentspeak.StringSource("<stdin>", line), log, lineno))

            while tokens:
                token_stream = iter(tokens)
                try:
                    tok = next(token_stream)
                    tok, body = agentspeak.parser.parse_plan_body(
                        tok, token_stream, log)
                except StopIteration:
                    log.throw()
                    break
                else:
                    log.throw()
                    tokens = list(token_stream)

                    intention.instr = Instruction(noop)
                    body.accept(
                        BuildInstructionsVisitor(variables, actions,
                                                 intention.instr, log))
                    log.throw()
                    agent.intentions.append(collections.deque([intention]))
                    env.run_agent(agent)
                    dump_variables(variables, intention.scope)
        except agentspeak.AggregatedError as error:
            print(str(error), file=sys.stderr)
            tokens = []
        except agentspeak.AslError as error:
            LOGGER.error("%s", error)
            tokens = []
示例#11
0
def _wait(agent, term, intention):
    # Handle optional arguments.
    args = [agentspeak.grounded(arg, intention.scope) for arg in term.args]
    if len(args) == 2:
        event, millis = args
    else:
        if agentspeak.is_number(args[0]):
            millis = args[0]
            event = None
        else:
            millis = None
            event = args[0]

    # Type checks.
    if not (millis is None or agentspeak.is_number(millis)):
        raise agentspeak.AslError("expected timeout for .wait to be numeric")
    if not (event is None or agentspeak.is_string(event)):
        raise agentspeak.AslError("expected event for .wait to be a string")

    # Event.
    if event is not None:
        # Parse event.
        if not event.endswith("."):
            event += "."
        log = agentspeak.Log(LOGGER, 1)
        tokens = agentspeak.lexer.TokenStream(
            agentspeak.StringSource("<.wait>", event), log)
        tok, ast_event = agentspeak.parser.parse_event(tokens.next(), tokens,
                                                       log)
        if tok.lexeme != ".":
            raise log.error(
                "expected no further tokens after event for .wait, got: '%s'",
                tok.lexeme,
                loc=tok.loc)

        # Build term.
        event = ast_event.accept(agentspeak.runtime.BuildEventVisitor(log))

    # Timeout.
    if millis is None:
        until = None
    else:
        until = agent.env.time() + millis / 1000

    # Create waiter.
    intention.waiter = agentspeak.runtime.Waiter(event=event, until=until)
    yield
示例#12
0
    def build_agent_from_ast(self,
                             source,
                             ast_agent,
                             actions,
                             agent_cls=Agent,
                             name=None):
        # This function is also called by the optimizer.

        log = agentspeak.Log(LOGGER, 3)
        agent = agent_cls(self, self._make_name(name or source.name))

        # Add rules to agent prototype.
        for ast_rule in ast_agent.rules:
            variables = {}
            head = ast_rule.head.accept(BuildTermVisitor(variables))
            consequence = ast_rule.consequence.accept(
                BuildQueryVisitor(variables, actions, log))
            agent.add_rule(Rule(head, consequence))

        # Add plans to agent prototype.
        for ast_plan in ast_agent.plans:
            variables = {}

            head = ast_plan.event.head.accept(BuildTermVisitor(variables))

            if ast_plan.context:
                context = ast_plan.context.accept(
                    BuildQueryVisitor(variables, actions, log))
            else:
                context = TrueQuery()

            body = Instruction(noop)
            body.f = noop
            if ast_plan.body:
                ast_plan.body.accept(
                    BuildInstructionsVisitor(variables, actions, body, log))

            plan = Plan(ast_plan.event.trigger, ast_plan.event.goal_type, head,
                        context, body)
            agent.add_plan(plan)

        # Add beliefs to agent prototype.
        for ast_belief in ast_agent.beliefs:
            belief = ast_belief.accept(BuildTermVisitor({}))
            agent.call(agentspeak.Trigger.addition,
                       agentspeak.GoalType.belief,
                       belief,
                       Intention(),
                       delayed=True)

        # Call initial goals on agent prototype.
        for ast_goal in ast_agent.goals:
            term = ast_goal.atom.accept(BuildTermVisitor({}))
            agent.call(agentspeak.Trigger.addition,
                       agentspeak.GoalType.achievement,
                       term,
                       Intention(),
                       delayed=True)

        # Report errors.
        log.throw()

        self.agents[agent.name] = agent
        return ast_agent, agent