code: def fibonacci_program():
      ab = dsl.ProgramBuilder()
  
      def fib_type(arg_types):
          return arg_types[0]
  
      with ab.function(
          "fibonacci", type_inference=fib_type
      ) as fibonacci:
          ab.param("n")
          ab.var.cond = ab.primop(lambda n: n > 1)
          with ab.if_(ab.var.cond, then_name="recur"):
              ab.var.nm1 = ab.primop(lambda n: n - 1)
              ab.var.fibm1 = ab.call(fibonacci, [ab.var.nm1])
              ab.var.nm2 = ab.primop(lambda n: n - 2)
              ab.var.fibm2 = ab.call(fibonacci, [ab.var.nm2])
              ab.var.ans = ab.primop(lambda fibm1, fibm2: fibm1 + fibm2)
          with ab.else_(else_name="base-case", continue_name="finish"):
              ab.var.ans = ab.const(1)
          ab.return_(ab.var.ans)
  
      prog = ab.program(main=fibonacci)
      return prog
  
imports: import numpy
  import tensorflow.compat.v2
  from tensorflow_probability.python.experimental.auto_batching import allocation_strategy
  from tensorflow_probability.python.experimental.auto_batching import dsl
  from tensorflow_probability.python.experimental.auto_batching import instructions
  from tensorflow_probability.python.experimental.auto_batching import lowering
  from tensorflow_probability.python.experimental.auto_batching import numpy_backend
  from tensorflow_probability.python.experimental.auto_batching import tf_backend
  from tensorflow_probability.python.experimental.auto_batching import type_inference
  from tensorflow_probability.python.experimental.auto_batching import virtual_machine
  from tensorflow_probability.python.internal import test_util
label_desc: Use image node_id 2 for calling a global function with example usage: fibonacci_program() and returns: prog, arg_types