Невозможно отправить действие другому агенту Джейсона

Я использую язык Джейсона для общения между двумя агентами. Но я не могу использовать действие отправки, оно выдает ошибку.

Это мои два агента,

Агент1: -

// Agent Agent1 in project factorial3.mas2j

/* Initial goals */
!start.

/* Plans */

+!start : true
<- .print("starting..");
    !query_factorial(2).

+!query_factorial(X) : true <-
.send(agent2,tell,giveme(X)).

/*+fact(X,Y) : true <-
.print("factorial ", X, " is ", Y, " thank you expert").*/

Agent2: -

// Agent agent2 in project IdEx.mas2j

/* Initial beliefs and rules */

/* Initial goals */

!begin.

/* Plans */

+!begin : true
    <- .print("expert starting.......");
        !giveme(X).

+!giveme(X):true
    <- !fact(X,Y);
    .print("Factorial of ", X, " is ", Y).
    //.send(agent1,achive,fact(X,Y)).

+!fact(X,1) : X == 0.

+!fact(X,Y) : X > 0
<- !fact(X-1,Y1);
    Y = Y1 * X.

Итак, я получаю сообщение об ошибке при попытке вызвать действие send в agent1, а agent2 выдает ошибку получения.

ОБНОВЛЕНО

Я получаю эту ошибку,

[agent2] *** Error adding var into renamed vars. var=X, value=(_229-1).
java.lang.ClassCastException: jason.asSyntax.ArithExpr cannot be cast to jason.asSyntax.VarTerm
    at jason.asSemantics.TransitionSystem.prepareBodyForEvent(TransitionSystem.java:877)
    at jason.asSemantics.TransitionSystem.applyExecInt(TransitionSystem.java:728)
    at jason.asSemantics.TransitionSystem.applySemanticRule(TransitionSystem.java:222)
    at jason.asSemantics.TransitionSystem.reasoningCycle(TransitionSystem.java:1429)
    at jason.infra.centralised.CentralisedAgArch.run(CentralisedAgArch.java:205)
    at java.lang.Thread.run(Thread.java:745)

1 ответ

Если вы хотите попросить агента выполнить план (в случае с агентом 1, когда вы говорите "+! Query_factorial(X)..."), это должно быть сообщение о достижении. Раскомментируя "план" "+ факт (X,Y): true <-.print (" факториал ", X," есть ", Y," спасибо эксперт ")." Вы должны использовать оператор "!" в начале, чтобы составить план. Итак, если я понял общую идею вашего тестового проекта, его можно переписать следующим образом:

Код Агента1:

!start.

+!start : true
<- .print("starting..");
    !query_factorial(2).

+!query_factorial(X) : true <-
    .send(agent2,achieve,giveme(X)).

Код агента 2:

+!giveme(X):true
    <- !fact(X,Y);
    .print("Factorial of ", X, " is ", Y).

+!fact(X,1) : X == 0.

+!fact(X,Y) : X > 0
    <- !fact(X-1,Y1);
    Y = Y1 * X.

Как видите, я не использую "план начала" вашего исходного кода, поскольку Agent1 выполняет эту работу, заставляя Agent2 работать по запросу.

Другие вопросы по тегам