JASON(AgentSpeak)如何使用带变量的外部动作

时间:2018-01-19 05:25:53

标签: artificial-intelligence multi-agent

我知道如何定义一个原子(必须参数)的外部动作,例如" sitDown"然后在执行操作方法中的Environment Java文件中手动编写它。

但是,如果我定义一个外部动作,它是否有办法接受参数? 让我们说我想定义一个可以用代理代码调用的动作:

破坏(4,7);

在我的环境类中,如何在执行操作方法中检索这些值?

2 个答案:

答案 0 :(得分:3)

如果不使用Cartago环境,而是使用Jason Environment,则可以使用Structure类API获取参数的值。例如:

class ... extends Environment {
   ...
   public boolean executeAction(String ag, Structure action) {
      NumberTerm arg0 = (NumberTerm)action.getTerm(0);
      int vl = (int)arg0.solve();
   }
   ...

Jason API可用here

答案 1 :(得分:2)

是的,您可以向环境发送参数并获取反馈。

例如,在应用程序中,更改机器人LED的方法可能是这样的(这属于扩展工件的类 - CArtAgO):

@OPERATION 
void changeLedPin(String newState) throws Exception {
     try {
        /** put gpio HIGH */
        if (newState.equals("high")) {
            logger.info("Changing pin to HIGH!");
            ledPin.high();
        }

        /** put gpio LOW */
        if (newState.equals("low")) {
            logger.info("Changing pin to LOW!");
            ledPin.low();
        }
     } catch (Exception e) {
        e.printStackTrace();
   }
}

Jason用于调用此外部操作的代理程序代码可能如下所示:

!start.

+!start <- 
    changeLedPin(low).

对于反馈,您可以使用OpFeedbackParam在Jason代码中发送变量进行统一。工件方法是这样的:

@OPERATION 
void inc(OpFeedbackParam<String> value) {
    /* some code */
}

来源:https://github.com/cleberjamaral/goldminers/blob/master/src/env/mining/Raspi.java https://github.com/cleberjamaral/camel-artifact/blob/master/camelJaCaMoRobot/src/env/artifacts/Counter.java