code: def test_lets():
      shape = (5, 5)
  
      def func1():
          sb = relay.ScopeBuilder()
          p0 = relay.var("p0", shape=shape)
          p1 = relay.var("p1", shape=shape)
          a0 = sb.let("a0", relay.add(p0, relay.const(1)))
          a1 = sb.let("a1", relay.add(p1, relay.const(1)))
          a2 = sb.let("a2", relay.add(a0, a1))
          sb.ret(a2)
          return relay.Function([p0, p1], sb.get())
  
      def func2():
          # Alpha conversion is structurally equal
          sb = relay.ScopeBuilder()
          p0 = relay.var("p0", shape=shape)
          p1 = relay.var("p1", shape=shape)
          a1 = sb.let("a1", relay.add(p0, relay.const(1)))
          a0 = sb.let("a0", relay.add(p1, relay.const(1)))
          a2 = sb.let("a2", relay.add(a1, a0))
          sb.ret(a2)
          return relay.Function([p0, p1], sb.get())
  
      def func3():
          # But changing the order of bindings is not structurally equal
          # (even though algebraically equal)
          sb = relay.ScopeBuilder()
          p0 = relay.var("p0", shape=shape)
          p1 = relay.var("p1", shape=shape)
          a1 = sb.let("a1", relay.add(p1, relay.const(1)))
          a0 = sb.let("a0", relay.add(p0, relay.const(1)))
          a2 = sb.let("a2", relay.add(a1, a0))
          sb.ret(a2)
          return relay.Function([p0, p1], sb.get())
  
      assert tvm.ir.structural_equal(func1(), func2())
      assert not tvm.ir.structural_equal(func1(), func3())
  
imports: import numpy
  import tvm
  import tvm.testing
  from tvm import relay
  from tvm.relay.testing import run_opt_pass
label_desc: Use image node_id 30 for calling a global function with example usage: test_lets() and returns: relay, relay, relay