let compile_transition (preds,targs) state_name env = 
  let name = concat [state_name;"_transition_";string_of_int (make_id())] in
  let predvars = List.map varify preds in
  let target_result, target_env, target_ids = compile_transition_targets targs name env in
    [ 
     (** declare transition *)

      SynVarDeclare
        (SynVarDeclareNoInit
           (SynEnumOrStructType ("fsmTransition",ref []),
            name));
      
      (** assign predicate list *)

      SynVarAssign
        (SynVarAssignment
           (SynStructOrEnumValue
              (SynVarName name,
               "predicates",
               ref VIdUnspecified),
            (SynListValueProducer
               (SynListList predvars))))]
      
      (** compile target list *)

    @ target_result
      
      (** add to transition list *)

    @ [ SynVarAssign
          (SynVarModify
             (SynStructOrEnumValue
                (SynVarName state_name,
                 "transitionList",
                 ref VIdUnspecified),
              SynBinopCons,
              (SynVarIdentifier
                 (SynVarName name)))) ], target_env, target_ids