当第一个查询失败时,如何在 JASON AgentSpeak 中执行第二个计划

How to execute a second plan, when the first fail in qwery, in JASON AgnetSpeak

我的程序有点问题,在一个部分中,一个代理 X 向代理 Y 发送了一个 tell,这个代理检查他的信念基础以验证事实,问题是当计划失败,他尝试添加一个 -plan 但它没有用,我感谢任何帮助,我已经更改了问题的上下文以便更好地理解,但主要思想是相同的

/* Initial beliefs and rules */

wedding_guests(约翰)。 wedding_guests(安娜)。 wedding_guests(鲍勃)。 wedding_guests(ed).

/*初始目标*/

/* 计划 */

+I_can_enter(R)[来源(Ag)] <- ?wedding_guests(R) .print(R,"你在客人名单上") 里斯戈2.

-I_can_enter(R) <- .print("你不能通过").

失败计划只能用于目标,在您的情况下,计划 +i_can_enter... 对新信念而非新目标做出反应。计划 -i_can_enter.... 对删除这种信念做出反应。 (注意i_can_enter中要小写,否则就是变量。)

有很多方法可以解决您的问题:

  1. 使用施行语achieve代替tell,这样接收者就会有一个新的目标而不是新的信念。然后计划可能是 +!i_can_enter(R) ...,计划失败是 -!i_can_enter(R) ...

  2. 将测试置于计划的上下文中:

+i_can_enter(R)[source(Ag)] : wedding_guests(R) <- .print(R,"You are on the guest list").

+i_can_enter(R) <- .print("You can not pass").
  1. 使用askOne 表演。在接收器中:
+?can_enter(R,ok) : wedding_guests(R). // R can enter if it is a wedding guest
+?can_enter(R,nok).                    // R cannot otherwise

在发件人中:

.send(receiver_name, askOne, can_enter(john,_), can_enter(_,ok)); // only continue if answer is "ok"

.send(receiver_name, askOne, can_enter(john,_), can_enter(_,A));
.print("it is ",A," for john to enter");

.send 中的第四项与答案统一。