Как отправить правило для другого агента в Джейсоне?

Джейсон поставляется с демонстрацией, в которой для отправки правил используется перформативный «tellRule», но в моих тестах это не работает. Я попытался отправить самостоятельному агенту следующее:

.send(self,tellRule, [{a :- b & c}])

В результате:

Command .send(self,tellRule, [{a :- b & c}]): included for execution
Communication error -- no_applicable: Found a goal for which there is no applicable plan:+!kqml_received(self,tellRule,[{ a :- (b & c)}],mid511)

person Jorge    schedule 07.04.2019    source источник


Ответы (1)


На самом деле, Джейсон не имеет перформатива «tellRule», определенного по умолчанию. Фактически, упомянутая демонстрация учит, как добавить перформатив KQML. Итак, чтобы ваш код работал, вы должны сначала создать «tellRule», выполнив следующие действия:

.send(self, tellHow, {+!kqml_received(A,tellRule,Rules,_) <- 
    .print("Received rule(s) ",Rules, " from ",A); 
    for ( .member(R, Rules) ) 
    {+R[source(A)];}  
    .relevant_rules(_,LR);       
    .print("Rules: ",LR)}).

После этого вы можете запустить команду:

.send(self,tellRule, [{a :- b & c}]).

Кстати, ту же идею можно использовать для создания чего-то вроде «untellRule»:

.send(self, tellHow, {+!kqml_received(A,untellRule,Rules,_) <-      
    .print("Removing rule(s) ",Rules, " from ",A);      
    for ( .member(R, Rules) )      
    {-R}}).
.send(self,untellRule,[{a :- b & c}]).
person Cleber Jorge Amaral    schedule 07.04.2019
comment
В случае демо в файле Receiver.asl уже есть план обработки TellRules на стороне получателя. TellHow, предложенный Клебером, необходим, когда у получателя нет надлежащего плана для TellRule. - person Jomi Hubner; 08.04.2019