我有以下代码:
configuration(s) := makelist(i, i, 0, length(s) - 1)$
active_agents(s) := s . configuration(s)$
prob_exp[k](l, s) := 1 - exp(- l[k] * active_agents(s))$
当我尝试使用prob_exp
的具体值来调用s
时,例如:
prob_exp[k](l, [0.25, 0.25, 0.25, 0.25]);
我收到以下错误消息:
length: argument cannot be a symbol; found s
#0: configuration(s=s)
#1: active_agents(s=s)
#2: lambda([k],lambda([l,s],1-exp((-l[k])*active_agents(s))))(k=k)
-- an error. To debug this try: debugmode(true);
有没有办法强制将s
作为值传递?
答案 0 :(得分:1)
以下是您观察到的内容的解释:Maxima首先评估prob_exp [k],它产生一个带有两个参数的lambda表达式,然后将其应用于[l,[0.25,0.25,0.25,0.25]]。评估prob_exp [k]会导致错误,因为s未绑定到实际列表。
要解决此问题,您需要使用prob_exp [k]来评估可以将s作为符号的内容。这是一种方法。我将active_agents定义为一个简化函数(即通过简化规则评估的函数)。
configuration(s) := makelist(i, i, 0, length(s) - 1);
matchdeclare (aa, listp);
tellsimp (active_agents (aa), aa . configuration (aa));
prob_exp[k](l, s) := 1 - exp(- l[k] * active_agents(s));
然后我得到:
prob_exp[k];
=> lambda([l,s],1-%e^-(l[k]*active_agents(s)))
prob_exp[k](l, [0.25, 0.25, 0.25, 0.25]);
=> 1-%e^-(1.5*l[k])
请注意,Maxima更喜欢精确分数到浮点数;我建议使用[1 / 4,1 / 4,1 / 4,1 / 4]代替[0.25,0.25,0.25,0.25]。
答案 1 :(得分:0)
更简单的是写:
prob_exp(k, l, s) := 1 - exp(- l[k] * active_agents(s))$
问题是函数配置在你调用p [k]时被评估(我不知道为什么)。举一个更简单的例子:
show(x):=block(disp('run),x);
q[k](x,y):=x+k*show(y);
q[k];
的产率:
run
lambda([x,y],k*y+x)
也就是说,q [k]是一个lambda但是它的内容在这个过程中得到了评估,并打印出“run”。但它不会引发错误。为什么? 简单地说,你不能用符号边界来评估makelist,而length(s)是象征性的,因为在这个阶段s还没有价值。
当你定义prob_exp(k,l,s)而不是prob_exp [k](l,s)时,整个表达式是一个lambda,并且当所有变量都有一个值时将被计算。
同样,这不会评估 show :
lambda([x,y],y+k*show(x));
另外,请注意前面 q 的定义,当多次调用q [k]时, run 将只打印一次,因为q是一个散列数组。因此,Maxima在第一次调用时准备函数(并以某种方式评估正文),然后存储它。
答案 2 :(得分:0)
也许推迟评估可以帮忙吗?我不是100%肯定为什么这样做并且例如ev(..., nouns)
进入prob_exp
没有,但我认为这至少与您的需求相近。
kill(all);
configuration(s) := 'makelist(i, i, 0, 'length(s) - 1)$
active_agents(s) := s . configuration(s)$
prob_exp[k](l, s) := 1 - exp(- l[k] * active_agents(s))$
prob_exp[k](l, [0.25, 0.25, 0.25, 0.25]);
ev(%, nouns);