无法理解TCL proc输入

时间:2014-03-11 17:35:38

标签: tcl

您好我正在尝试了解其他人编写的代码部分。这是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'是什么?

我理解这可能是一个令人困惑且可能含糊的问题。但是,如果有人能帮助我,那真的很棒!

感谢。

1 个答案:

答案 0 :(得分:2)

好吧,如果那就是proc的全部内容,那就没那么多了。

您正在将一些参数传递给proc,它接受​​5个'标准'变量:

  1. state_id

  2. attribute

  3. object_id

  4. value

  5. place

  6. 并且首先在5之上的任何变量将进入args

    调用proc时,您将这些字符串传递给上面的变量:

    1. bird-safe

    2. health

    3. bird

    4. healthy

    5. <p>

    6. :concerns {{sgt 25.0}} :initialize *unknown* :probability 0.55 :sim-object *none*

    7. 当然,由于$args是一个列表,如果你枚举它们,你将获得这些元素:

      1. :concerns

      2. {sgt 25.0}

      3. :initialize

      4. *unknown*

      5. :probability

      6. 0.55

      7. :sim-object

      8. *none*

      9. 因此,在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-safehealth之间的空间太多有点困惑,并且应该很容易看出每个字符串如何进入哪个变量。

        global用于启用全局命名空间中存在的变量,或者使局部变量(在proc中创建的变量)可用于全局命名空间。在您的示例中,它针对四个变量执行此操作:state_liststate_objsstate_attr_valsstate_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