您好我正在尝试了解其他人编写的代码部分。这是proc的定义:
proc defState {state_id attribute object_id value place args} {
global state_list state_objs state_attr_vals state_attr_id
# Build up record of defined states and perform error checking
if {[member $state_id $state_list]} {
put-error "ERROR: State $state_id is being defined twice"
#exit-steve
}
set state_list "$state_id $state_list"
if {![info exists state_attr_vals(${object_id},${attribute})]} {
set state_objs($object_id) $place
set state_attr_vals(${object_id},${attribute}) $value
} elseif {[member $value $state_attr_vals(${object_id},${attribute})]} {
put-error "WARNING: Multiple states with same object/attribute/value: $state_id"
} else {
set state_attr_vals(${object_id},${attribute}) \
"$value $state_attr_vals(${object_id},${attribute})"
}
set state_attr_id(${object_id},${attribute},${value}) $state_id
defSteveText $state_id goal "this should be generated by NL"
sp "top-ps*elaborate*state*add-to-current-state*$state_id
(state <s> ^problem-space.name top-ps
^current-state <cs>)
-->
(<cs> ^${state_id} <obj> + &, <n-obj> + &)
(<obj> ^id $state_id ^name $state_id
^type state
^polarity positive
^object-id $object_id
^attribute $attribute
^value $value
^negation <n-obj>)
(<n-obj> ^id $state_id ^name $state_id
^type state
^polarity negative
^object-id $object_id
^attribute $attribute
^value $value
^negation <obj>)"
;##### START TEMP GLUE #########
sp "top-ps*elaborate*state*test*goal*$state_id*positive
(state <s> ^problem-space.name top-ps
^current-state <cs>
^io.input-link.perception <p>
^mental-state <m>)
(<cs> ^${state_id} <pos>)
(<pos> ^polarity positive
^negation <neg>)
($place ^${object_id}_$attribute $value)
-->
(<neg> ^satisfied false + <)
(<pos> ^satisfied true + <)"
sp "top-ps*elaborate*state*test*goal*$state_id*negative
(state <s> ^problem-space.name top-ps
^current-state <cs>
^io.input-link.perception <p>
^mental-state <m>)
(<cs> ^${state_id} <neg>)
(<neg> ^polarity negative
^negation <pos>)
($place ^${object_id}_$attribute \{<val> <> $value <> *unknown* \})
-->
(<pos> ^satisfied false + <)
(<neg> ^satisfied true + <)"
sp "top-ps*elaborate*state*test*goal*$state_id*unknown
(state <s> ^problem-space.name top-ps
^current-state <cs>
^io.input-link.perception <p>
^mental-state <m>)
(<cs> ^${state_id} <neg>)
(<neg> ^polarity negative
^negation <pos>)
($place ^${object_id}_$attribute *unknown*)
-->
(<pos> ^satisfied unknown + <)
(<neg> ^satisfied unknown + <)"
global simulator_name
set sim_state ${object_id}_$attribute
if {[send $simulator_name "memberp ${sim_state} \$SceneAttributes"]} {
#echo "$state_sim already defined"
} else {
send $simulator_name "defSceneAttr $sim_state $sim_state symbol"
}
;##### END TEMP GLUE #########
proc的实现如下:
defState bird-safe health bird healthy <p> \
:concerns {{sgt 25.0}} \
:initialize *unknown* \
:probability 0.55 \
:sim-object *none*
所以我不明白的是,defState实现中的'health','bird'和'healthy'如何对应于proc定义中的变量。
那里的'p'是什么?
我理解这可能是一个令人困惑且可能含糊的问题。但是,如果有人能帮助我,那真的很棒!
感谢。
答案 0 :(得分:2)
好吧,如果那就是proc
的全部内容,那就没那么多了。
您正在将一些参数传递给proc
,它接受5个'标准'变量:
state_id
attribute
object_id
value
place
并且首先在5之上的任何变量将进入args
。
调用proc
时,您将这些字符串传递给上面的变量:
bird-safe
health
bird
healthy
<p>
:concerns {{sgt 25.0}} :initialize *unknown* :probability 0.55 :sim-object *none*
当然,由于$args
是一个列表,如果你枚举它们,你将获得这些元素:
:concerns
{sgt 25.0}
:initialize
*unknown*
:probability
0.55
:sim-object
*none*
因此,在proc
中,您将在前面列出的变量中包含上述字符串。如果您在puts
中使用proc
,则可以看到它们,结果如下:
puts $state_id ;# gives => bird-safe
puts $attribute ;# gives => health
puts $object_id ;# gives => bird
puts $value ;# gives => healthy
puts $place ;# gives => <p>
puts $args ;# gives => :concerns {{sgt 25.0}} :initialize *unknown* :probability 0.55 :sim-object *none*
默认情况下,变量由空格分隔(空格的数量无关紧要,所以我对bird-safe
和health
之间的空间太多有点困惑,并且应该很容易看出每个字符串如何进入哪个变量。
global
用于启用全局命名空间中存在的变量,或者使局部变量(在proc中创建的变量)可用于全局命名空间。在您的示例中,它针对四个变量执行此操作:state_list
,state_objs
,state_attr_vals
和state_attr_id
。
例如,如果变量state_list
存在于全局命名空间中,您将能够在proc中访问它。如果没有提及global state_list
,如果您尝试使用变量state_list
,则会收到错误消息。
至于什么是<p>
,嗯,它只是一个字符串,用于你的问题中描述的内容,对于有限的信息没有任何意义。
根据您问题的补充,您正在调用#TEMP GLUE#
部分中的其他功能。例如,您将首先替换变量,这意味着:
sp "top-ps*elaborate*state*test*goal*$state_id*positive
(state <s> ^problem-space.name top-ps
^current-state <cs>
^io.input-link.perception <p>
^mental-state <m>)
(<cs> ^${state_id} <pos>)
(<pos> ^polarity positive
^negation <neg>)
($place ^${object_id}_$attribute $value)
-->
(<neg> ^satisfied false + <)
(<pos> ^satisfied true + <)"
将成为这个(我添加了;# ^^^
来显示替换):
sp "top-ps*elaborate*state*test*goal*bird-safe*positive
;# ^^^^^^^^^
(state <s> ^problem-space.name top-ps
^current-state <cs>
^io.input-link.perception <p>
^mental-state <m>)
(<cs> ^bird-safe <pos>)
;# ^^^^^^^^^
(<pos> ^polarity positive
^negation <neg>)
($place ^bird_health healthy)
;# ^^^^ ^^^^^^ ^^^^^^^
-->
(<neg> ^satisfied false + <)
(<pos> ^satisfied true + <)"
您是否看到$state_id
成为bird-safe
,${object_id}_$attribute $value
成为bird_health healthy
的方式?这些变量的值都是在proc的开头定义的。
请注意,${abc}
与$abc
基本相同。使用${abc}
的优点是您可以指定确切的变量名称。
如果您的变量名为abc
且值为xyz
并使用$abc_d
输出xyz_d
,则tcl将查找变量abc_d
并说明变量abc_d
不存在。
通过使用大括号,您明确告诉Tcl变量名称是abc
而不是abc_d
。