Advertisement
Guest User

Untitled

a guest
Jul 8th, 2017
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 33.15 KB | None | 0 0
  1. class cl_e(object):
  2.   def __init__(self):
  3.     pass
  4.   def interpret(*args):
  5.     raise CEKError("class e does not implement a method")
  6.   def pprint(self, indent):
  7.     return ' ' * indent + '(e)'
  8. class cl_var(cl_e):
  9.   def __init__(self):
  10.     pass
  11.   def interpret(self, e, k):
  12.     try:
  13.       if isinstance(self, cl_var):
  14.         var = self
  15.         if isinstance(e, cl_env):
  16.           env_0 = e
  17.           if isinstance(k, cl_k):
  18.             k = k
  19.             w_tmp0_lookup0 = env_0
  20.             w_tmp0_lookup1 = var
  21.             w_tmp0 = lookup(w_tmp0_lookup0, w_tmp0_lookup1)
  22.             if isinstance(w_tmp0, cl_clo):
  23.               w_tmp0_v0 = w_tmp0.v0
  24.               w_tmp0_env1 = w_tmp0.env1
  25.               if isinstance(w_tmp0_v0, cl_v):
  26.                 v = w_tmp0_v0
  27.                 if isinstance(w_tmp0_env1, cl_env):
  28.                   env = w_tmp0_env1
  29.                   c_result = v
  30.                   e_result = env
  31.                   k_result = k
  32.                   return c_result, e_result, k_result
  33.                 else:
  34.                   raise CEKMatchFailure("Expected w_tmp0_env1 to be an env")
  35.               else:
  36.                 raise CEKMatchFailure("Expected w_tmp0_v0 to be an v")
  37.             else:
  38.               raise CEKMatchFailure("Expected w_tmp0 to be an clo")
  39.           else:
  40.             raise CEKMatchFailure("Expected k to be an k")
  41.         else:
  42.           raise CEKMatchFailure("Expected e to be an env")
  43.       else:
  44.         raise CEKMatchFailure("Expected self to be an var")
  45.     except CEKMatchFailure as matchf:
  46.       pass
  47.     raise CEKError("No cases matched for method in class var")
  48.   def pprint(self, indent):
  49.     return ' ' * indent + '(var)'
  50. class cl_v(cl_e):
  51.   def __init__(self):
  52.     pass
  53.   def interpret(self, e, k):
  54.     try:
  55.       if isinstance(self, cl_v):
  56.         v = self
  57.         if isinstance(e, cl_env):
  58.           env_0 = e
  59.           if isinstance(k, cl_k):
  60.             k = k
  61.             return k.interpret(self, e)
  62.           else:
  63.             raise CEKMatchFailure("Expected k to be an k")
  64.         else:
  65.           raise CEKMatchFailure("Expected e to be an env")
  66.       else:
  67.         raise CEKMatchFailure("Expected self to be an v")
  68.     except CEKMatchFailure as matchf:
  69.       pass
  70.     try:
  71.       if isinstance(self, cl_v):
  72.         v = self
  73.         if isinstance(e, cl_env):
  74.           env_0 = e
  75.           if isinstance(k, cl_k):
  76.             k = k
  77.             return k.interpret(self, e)
  78.           else:
  79.             raise CEKMatchFailure("Expected k to be an k")
  80.         else:
  81.           raise CEKMatchFailure("Expected e to be an env")
  82.       else:
  83.         raise CEKMatchFailure("Expected self to be an v")
  84.     except CEKMatchFailure as matchf:
  85.       pass
  86.     try:
  87.       if isinstance(self, cl_v):
  88.         v = self
  89.         if isinstance(e, cl_env):
  90.           env_0 = e
  91.           if isinstance(k, cl_k):
  92.             k = k
  93.             return k.interpret(self, e)
  94.           else:
  95.             raise CEKMatchFailure("Expected k to be an k")
  96.         else:
  97.           raise CEKMatchFailure("Expected e to be an env")
  98.       else:
  99.         raise CEKMatchFailure("Expected self to be an v")
  100.     except CEKMatchFailure as matchf:
  101.       pass
  102.     try:
  103.       if isinstance(self, cl_v):
  104.         v = self
  105.         if isinstance(e, cl_env):
  106.           env_0 = e
  107.           if isinstance(k, cl_k):
  108.             k = k
  109.             return k.interpret(v, env_0)
  110.           else:
  111.             raise CEKMatchFailure("Expected k to be an k")
  112.         else:
  113.           raise CEKMatchFailure("Expected e to be an env")
  114.       else:
  115.         raise CEKMatchFailure("Expected self to be an v")
  116.     except CEKMatchFailure as matchf:
  117.       pass
  118.     raise CEKError("No cases matched for method in class v")
  119.   def pprint(self, indent):
  120.     return ' ' * indent + '(v)'
  121. class cl_bool(cl_v):
  122.   def __init__(self):
  123.     pass
  124.   # method inherited from super class
  125.   def pprint(self, indent):
  126.     return ' ' * indent + '(bool)'
  127. class cl_int(cl_v):
  128.   def __init__(self):
  129.     pass
  130.   # method inherited from super class
  131.   def pprint(self, indent):
  132.     return ' ' * indent + '(int)'
  133. class cl_w(object):
  134.   def __init__(self):
  135.     pass
  136.   def interpret(*args):
  137.     raise CEKError("class w does not implement a method")
  138.   def pprint(self, indent):
  139.     return ' ' * indent + '(w)'
  140. class cl_env(object):
  141.   def __init__(self):
  142.     pass
  143.   def interpret(*args):
  144.     raise CEKError("class env does not implement a method")
  145.   def pprint(self, indent):
  146.     return ' ' * indent + '(env)'
  147. class cl_k(object):
  148.   def __init__(self):
  149.     pass
  150.   def interpret(*args):
  151.     raise CEKError("class k does not implement a method")
  152.   def pprint(self, indent):
  153.     return ' ' * indent + '(k)'
  154. class cl_variable(cl_var):
  155.   def __init__(self):
  156.     pass
  157.   # method inherited from super class
  158.   def pprint(self, indent):
  159.     return ' ' * indent + '(variable)'
  160. class cl_integer(cl_int):
  161.   def __init__(self):
  162.     pass
  163.   # method inherited from super class
  164.   def pprint(self, indent):
  165.     return ' ' * indent + '(integer)'
  166. class cl_if(cl_e):
  167.   def __init__(self, e0, e1, e2):
  168.     self.e0 = e0
  169.     self.e1 = e1
  170.     self.e2 = e2
  171.   def interpret(self, e, k):
  172.     try:
  173.       if isinstance(self, cl_if):
  174.         self_e0 = self.e0
  175.         self_e1 = self.e1
  176.         self_e2 = self.e2
  177.         if isinstance(self_e0, cl_e):
  178.           e_test = self_e0
  179.           if isinstance(self_e1, cl_e):
  180.             e_then = self_e1
  181.             if isinstance(self_e2, cl_e):
  182.               e_else = self_e2
  183.               if isinstance(e, cl_env):
  184.                 env = e
  185.                 if isinstance(k, cl_k):
  186.                   k = k
  187.                   c_result = e_test
  188.                   e_result = env
  189.                   k_result_e0 = e_then
  190.                   k_result_e1 = e_else
  191.                   k_result_env2 = env
  192.                   k_result_k3 = k
  193.                   k_result = cl_sel(k_result_e0, k_result_e1, k_result_env2, k_result_k3)
  194.                   return c_result, e_result, k_result
  195.                 else:
  196.                   raise CEKMatchFailure("Expected k to be an k")
  197.               else:
  198.                 raise CEKMatchFailure("Expected e to be an env")
  199.             else:
  200.               raise CEKMatchFailure("Expected self_e2 to be an e")
  201.           else:
  202.             raise CEKMatchFailure("Expected self_e1 to be an e")
  203.         else:
  204.           raise CEKMatchFailure("Expected self_e0 to be an e")
  205.       else:
  206.         raise CEKMatchFailure("Expected self to be an if")
  207.     except CEKMatchFailure as matchf:
  208.       pass
  209.     raise CEKError("No cases matched for method in class if")
  210.   def pprint(self, indent):
  211.     return ' ' * indent + '(if %s %s %s)' % (self.e0.pprint(0), self.e1.pprint(0), self.e2.pprint(0))
  212. class cl_sel(cl_k):
  213.   def __init__(self, e0, e1, env2, k3):
  214.     self.e0 = e0
  215.     self.e1 = e1
  216.     self.env2 = env2
  217.     self.k3 = k3
  218.   def interpret(self, c_arg, e_arg):
  219.     try:
  220.       if isinstance(self, cl_sel):
  221.         self_e0 = self.e0
  222.         self_e1 = self.e1
  223.         self_env2 = self.env2
  224.         self_k3 = self.k3
  225.         if isinstance(self_e0, cl_e):
  226.           e_then = self_e0
  227.           if isinstance(self_e1, cl_e):
  228.             e_else = self_e1
  229.             if isinstance(self_env2, cl_env):
  230.               env = self_env2
  231.               if isinstance(self_k3, cl_k):
  232.                 k = self_k3
  233.                 if isinstance(c_arg, cl_false):
  234.                   if isinstance(e_arg, cl_env):
  235.                     env_0 = e_arg
  236.                     c_result = e_else
  237.                     e_result = env
  238.                     k_result = k
  239.                     return c_result, e_result, k_result
  240.                   else:
  241.                     raise CEKMatchFailure("Expected e_arg to be an env")
  242.                 else:
  243.                   raise CEKMatchFailure("Expected c_arg to be an false")
  244.               else:
  245.                 raise CEKMatchFailure("Expected self_k3 to be an k")
  246.             else:
  247.               raise CEKMatchFailure("Expected self_env2 to be an env")
  248.           else:
  249.             raise CEKMatchFailure("Expected self_e1 to be an e")
  250.         else:
  251.           raise CEKMatchFailure("Expected self_e0 to be an e")
  252.       else:
  253.         raise CEKMatchFailure("Expected self to be an sel")
  254.     except CEKMatchFailure as matchf:
  255.       pass
  256.     try:
  257.       if isinstance(self, cl_sel):
  258.         self_e0 = self.e0
  259.         self_e1 = self.e1
  260.         self_env2 = self.env2
  261.         self_k3 = self.k3
  262.         if isinstance(self_e0, cl_e):
  263.           e_then = self_e0
  264.           if isinstance(self_e1, cl_e):
  265.             e_else = self_e1
  266.             if isinstance(self_env2, cl_env):
  267.               env = self_env2
  268.               if isinstance(self_k3, cl_k):
  269.                 k = self_k3
  270.                 if isinstance(c_arg, cl_v):
  271.                   v = c_arg
  272.                   if isinstance(e_arg, cl_env):
  273.                     env_0 = e_arg
  274.                     w_tmp0 = v
  275.                     try:
  276.                       if isinstance(w_tmp0, cl_false):
  277.                         raise CEKUnlessFailure()
  278.                       else:
  279.                         raise CEKMatchFailure("Expected w_tmp0 to be an false")
  280.                     except CEKMatchFailure as matchf:
  281.                       c_result = e_then
  282.                       e_result = env
  283.                       k_result = k
  284.                       return c_result, e_result, k_result
  285.                     except CEKUnlessFailure:
  286.                       pass
  287.                   else:
  288.                     raise CEKMatchFailure("Expected e_arg to be an env")
  289.                 else:
  290.                   raise CEKMatchFailure("Expected c_arg to be an v")
  291.               else:
  292.                 raise CEKMatchFailure("Expected self_k3 to be an k")
  293.             else:
  294.               raise CEKMatchFailure("Expected self_env2 to be an env")
  295.           else:
  296.             raise CEKMatchFailure("Expected self_e1 to be an e")
  297.         else:
  298.           raise CEKMatchFailure("Expected self_e0 to be an e")
  299.       else:
  300.         raise CEKMatchFailure("Expected self to be an sel")
  301.     except CEKMatchFailure as matchf:
  302.       pass
  303.     raise CEKError("No cases matched for method in class sel")
  304.   def pprint(self, indent):
  305.     return ' ' * indent + '(sel %s %s %s %s)' % (self.e0.pprint(0), self.e1.pprint(0), self.env2.pprint(0), self.k3.pprint(0))
  306. class cl_app(cl_e):
  307.   def __init__(self, e0, e1):
  308.     self.e0 = e0
  309.     self.e1 = e1
  310.   def interpret(self, e, k):
  311.     try:
  312.       if isinstance(self, cl_app):
  313.         self_e0 = self.e0
  314.         self_e1 = self.e1
  315.         if isinstance(self_e0, cl_e):
  316.           e_1 = self_e0
  317.           if isinstance(self_e1, cl_e):
  318.             e_2 = self_e1
  319.             if isinstance(e, cl_env):
  320.               env = e
  321.               if isinstance(k, cl_k):
  322.                 k = k
  323.                 c_result = e_1
  324.                 e_result = env
  325.                 k_result_e0 = e_2
  326.                 k_result_env1 = env
  327.                 k_result_k2 = k
  328.                 k_result = cl_arg(k_result_e0, k_result_env1, k_result_k2)
  329.                 return c_result, e_result, k_result
  330.               else:
  331.                 raise CEKMatchFailure("Expected k to be an k")
  332.             else:
  333.               raise CEKMatchFailure("Expected e to be an env")
  334.           else:
  335.             raise CEKMatchFailure("Expected self_e1 to be an e")
  336.         else:
  337.           raise CEKMatchFailure("Expected self_e0 to be an e")
  338.       else:
  339.         raise CEKMatchFailure("Expected self to be an app")
  340.     except CEKMatchFailure as matchf:
  341.       pass
  342.     raise CEKError("No cases matched for method in class app")
  343.   def pprint(self, indent):
  344.     return ' ' * indent + '(app %s %s)' % (self.e0.pprint(0), self.e1.pprint(0))
  345. class cl_clo(cl_w):
  346.   def __init__(self, v0, env1):
  347.     self.v0 = v0
  348.     self.env1 = env1
  349.   def interpret(*args):
  350.     raise CEKError("class clo does not implement a method")
  351.   def pprint(self, indent):
  352.     return ' ' * indent + '(clo %s %s)' % (self.v0.pprint(0), self.env1.pprint(0))
  353. class cl_fn(cl_k):
  354.   def __init__(self, v0, env1, k2):
  355.     self.v0 = v0
  356.     self.env1 = env1
  357.     self.k2 = k2
  358.   def interpret(self, c_arg, e_arg):
  359.     try:
  360.       if isinstance(self, cl_fn):
  361.         self_v0 = self.v0
  362.         self_env1 = self.env1
  363.         self_k2 = self.k2
  364.         if isinstance(self_v0, cl_lam):
  365.           self_v0_var0 = self_v0.var0
  366.           self_v0_e1 = self_v0.e1
  367.           if isinstance(self_v0_var0, cl_var):
  368.             var = self_v0_var0
  369.             if isinstance(self_v0_e1, cl_e):
  370.               e = self_v0_e1
  371.               if isinstance(self_env1, cl_env):
  372.                 env = self_env1
  373.                 if isinstance(self_k2, cl_k):
  374.                   k = self_k2
  375.                   if isinstance(c_arg, cl_v):
  376.                     v = c_arg
  377.                     if isinstance(e_arg, cl_env):
  378.                       env_0 = e_arg
  379.                       c_result = e
  380.                       e_result_extend0 = env
  381.                       e_result_extend1 = var
  382.                       e_result_extend2_v0 = v
  383.                       e_result_extend2_env1 = env_0
  384.                       e_result_extend2 = cl_clo(e_result_extend2_v0, e_result_extend2_env1)
  385.                       e_result = extend(e_result_extend0, e_result_extend1, e_result_extend2)
  386.                       k_result = k
  387.                       return c_result, e_result, k_result
  388.                     else:
  389.                       raise CEKMatchFailure("Expected e_arg to be an env")
  390.                   else:
  391.                     raise CEKMatchFailure("Expected c_arg to be an v")
  392.                 else:
  393.                   raise CEKMatchFailure("Expected self_k2 to be an k")
  394.               else:
  395.                 raise CEKMatchFailure("Expected self_env1 to be an env")
  396.             else:
  397.               raise CEKMatchFailure("Expected self_v0_e1 to be an e")
  398.           else:
  399.             raise CEKMatchFailure("Expected self_v0_var0 to be an var")
  400.         else:
  401.           raise CEKMatchFailure("Expected self_v0 to be an lam")
  402.       else:
  403.         raise CEKMatchFailure("Expected self to be an fn")
  404.     except CEKMatchFailure as matchf:
  405.       pass
  406.     raise CEKError("No cases matched for method in class fn")
  407.   def pprint(self, indent):
  408.     return ' ' * indent + '(fn %s %s %s)' % (self.v0.pprint(0), self.env1.pprint(0), self.k2.pprint(0))
  409. class cl_arg(cl_k):
  410.   def __init__(self, e0, env1, k2):
  411.     self.e0 = e0
  412.     self.env1 = env1
  413.     self.k2 = k2
  414.   def interpret(self, c_arg, e_arg):
  415.     try:
  416.       if isinstance(self, cl_arg):
  417.         self_e0 = self.e0
  418.         self_env1 = self.env1
  419.         self_k2 = self.k2
  420.         if isinstance(self_e0, cl_e):
  421.           e = self_e0
  422.           if isinstance(self_env1, cl_env):
  423.             env = self_env1
  424.             if isinstance(self_k2, cl_k):
  425.               k = self_k2
  426.               if isinstance(c_arg, cl_v):
  427.                 v = c_arg
  428.                 if isinstance(e_arg, cl_env):
  429.                   env_0 = e_arg
  430.                   c_result = e
  431.                   e_result = env
  432.                   k_result_v0 = v
  433.                   k_result_env1 = env_0
  434.                   k_result_k2 = k
  435.                   k_result = cl_fn(k_result_v0, k_result_env1, k_result_k2)
  436.                   return c_result, e_result, k_result
  437.                 else:
  438.                   raise CEKMatchFailure("Expected e_arg to be an env")
  439.               else:
  440.                 raise CEKMatchFailure("Expected c_arg to be an v")
  441.             else:
  442.               raise CEKMatchFailure("Expected self_k2 to be an k")
  443.           else:
  444.             raise CEKMatchFailure("Expected self_env1 to be an env")
  445.         else:
  446.           raise CEKMatchFailure("Expected self_e0 to be an e")
  447.       else:
  448.         raise CEKMatchFailure("Expected self to be an arg")
  449.     except CEKMatchFailure as matchf:
  450.       pass
  451.     raise CEKError("No cases matched for method in class arg")
  452.   def pprint(self, indent):
  453.     return ' ' * indent + '(arg %s %s %s)' % (self.e0.pprint(0), self.env1.pprint(0), self.k2.pprint(0))
  454. class cl_lam(cl_v):
  455.   def __init__(self, var0, e1):
  456.     self.var0 = var0
  457.     self.e1 = e1
  458.   # method inherited from super class
  459.   def pprint(self, indent):
  460.     return ' ' * indent + '(lam %s %s)' % (self.var0.pprint(0), self.e1.pprint(0))
  461. class cl_false(cl_bool):
  462.   def __init__(self):
  463.     self.literal = "false"
  464.   def interpret(self, e, k):
  465.     try:
  466.       if isinstance(self, cl_false):
  467.         if isinstance(e, cl_env):
  468.           env_0 = e
  469.           if isinstance(k, cl_k):
  470.             k = k
  471.             return k.interpret(self, e)
  472.           else:
  473.             raise CEKMatchFailure("Expected k to be an k")
  474.         else:
  475.           raise CEKMatchFailure("Expected e to be an env")
  476.       else:
  477.         raise CEKMatchFailure("Expected self to be an false")
  478.     except CEKMatchFailure as matchf:
  479.       pass
  480.     raise CEKError("No cases matched for method in class false")
  481.   def pprint(self, indent):
  482.     return ' ' * indent + 'false'
  483. class cl_true(cl_bool):
  484.   def __init__(self):
  485.     self.literal = "true"
  486.   # method inherited from super class
  487.   def pprint(self, indent):
  488.     return ' ' * indent + 'true'
  489. class cl_dummy(cl_env):
  490.   def __init__(self):
  491.     self.literal = "dummy"
  492.   def interpret(*args):
  493.     raise CEKError("class dummy does not implement a method")
  494.   def pprint(self, indent):
  495.     return ' ' * indent + 'dummy'
  496. class cl_mt(cl_k):
  497.   def __init__(self):
  498.     self.literal = "mt"
  499.   def interpret(self, c_arg, e_arg):
  500.     try:
  501.       if isinstance(self, cl_mt):
  502.         if isinstance(c_arg, cl_v):
  503.           v = c_arg
  504.           if isinstance(e_arg, cl_env):
  505.             env_0 = e_arg
  506.             result_pprint0 = v
  507.             result = pprint(result_pprint0)
  508.             dummy = ret(result)
  509.             raise CEKError("Failed to halt the program in a final state")
  510.           else:
  511.             raise CEKMatchFailure("Expected e_arg to be an env")
  512.         else:
  513.           raise CEKMatchFailure("Expected c_arg to be an v")
  514.       else:
  515.         raise CEKMatchFailure("Expected self to be an mt")
  516.     except CEKMatchFailure as matchf:
  517.       pass
  518.     raise CEKError("No cases matched for method in class mt")
  519.   def pprint(self, indent):
  520.     return ' ' * indent + 'mt'
  521. def init(p):
  522.   if isinstance(p, cl_e):
  523.     e = p
  524.     c_init_e0_e0_e0_e0_e0_e0_var0 = mkvariable("iszero")
  525.     c_init_e0_e0_e0_e0_e0_e0_e1_var0 = mkvariable("succ")
  526.     c_init_e0_e0_e0_e0_e0_e0_e1_e1_var0 = mkvariable("pred")
  527.     c_init_e0_e0_e0_e0_e0_e0_e1_e1_e1_var0 = mkvariable("+")
  528.     c_init_e0_e0_e0_e0_e0_e0_e1_e1_e1_e1_var0 = mkvariable("-")
  529.     c_init_e0_e0_e0_e0_e0_e0_e1_e1_e1_e1_e1_var0 = mkvariable("*")
  530.     c_init_e0_e0_e0_e0_e0_e0_e1_e1_e1_e1_e1_e1 = e
  531.     c_init_e0_e0_e0_e0_e0_e0_e1_e1_e1_e1_e1 = cl_lam(c_init_e0_e0_e0_e0_e0_e0_e1_e1_e1_e1_e1_var0, c_init_e0_e0_e0_e0_e0_e0_e1_e1_e1_e1_e1_e1)
  532.     c_init_e0_e0_e0_e0_e0_e0_e1_e1_e1_e1 = cl_lam(c_init_e0_e0_e0_e0_e0_e0_e1_e1_e1_e1_var0, c_init_e0_e0_e0_e0_e0_e0_e1_e1_e1_e1_e1)
  533.     c_init_e0_e0_e0_e0_e0_e0_e1_e1_e1 = cl_lam(c_init_e0_e0_e0_e0_e0_e0_e1_e1_e1_var0, c_init_e0_e0_e0_e0_e0_e0_e1_e1_e1_e1)
  534.     c_init_e0_e0_e0_e0_e0_e0_e1_e1 = cl_lam(c_init_e0_e0_e0_e0_e0_e0_e1_e1_var0, c_init_e0_e0_e0_e0_e0_e0_e1_e1_e1)
  535.     c_init_e0_e0_e0_e0_e0_e0_e1 = cl_lam(c_init_e0_e0_e0_e0_e0_e0_e1_var0, c_init_e0_e0_e0_e0_e0_e0_e1_e1)
  536.     c_init_e0_e0_e0_e0_e0_e0 = cl_lam(c_init_e0_e0_e0_e0_e0_e0_var0, c_init_e0_e0_e0_e0_e0_e0_e1)
  537.     c_init_e0_e0_e0_e0_e0_e1_var0 = mkvariable("n")
  538.     c_init_e0_e0_e0_e0_e0_e1_e1_zeropimpl0 = mkvariable("n")
  539.     c_init_e0_e0_e0_e0_e0_e1_e1 = zeropimpl(c_init_e0_e0_e0_e0_e0_e1_e1_zeropimpl0)
  540.     c_init_e0_e0_e0_e0_e0_e1 = cl_lam(c_init_e0_e0_e0_e0_e0_e1_var0, c_init_e0_e0_e0_e0_e0_e1_e1)
  541.     c_init_e0_e0_e0_e0_e0 = cl_app(c_init_e0_e0_e0_e0_e0_e0, c_init_e0_e0_e0_e0_e0_e1)
  542.     c_init_e0_e0_e0_e0_e1_var0 = mkvariable("n")
  543.     c_init_e0_e0_e0_e0_e1_e1_succimpl0 = mkvariable("n")
  544.     c_init_e0_e0_e0_e0_e1_e1 = succimpl(c_init_e0_e0_e0_e0_e1_e1_succimpl0)
  545.     c_init_e0_e0_e0_e0_e1 = cl_lam(c_init_e0_e0_e0_e0_e1_var0, c_init_e0_e0_e0_e0_e1_e1)
  546.     c_init_e0_e0_e0_e0 = cl_app(c_init_e0_e0_e0_e0_e0, c_init_e0_e0_e0_e0_e1)
  547.     c_init_e0_e0_e0_e1_var0 = mkvariable("n")
  548.     c_init_e0_e0_e0_e1_e1_predimpl0 = mkvariable("n")
  549.     c_init_e0_e0_e0_e1_e1 = predimpl(c_init_e0_e0_e0_e1_e1_predimpl0)
  550.     c_init_e0_e0_e0_e1 = cl_lam(c_init_e0_e0_e0_e1_var0, c_init_e0_e0_e0_e1_e1)
  551.     c_init_e0_e0_e0 = cl_app(c_init_e0_e0_e0_e0, c_init_e0_e0_e0_e1)
  552.     c_init_e0_e0_e1_var0 = mkvariable("m")
  553.     c_init_e0_e0_e1_e1_var0 = mkvariable("n")
  554.     c_init_e0_e0_e1_e1_e1_addimpl0 = mkvariable("m")
  555.     c_init_e0_e0_e1_e1_e1_addimpl1 = mkvariable("n")
  556.     c_init_e0_e0_e1_e1_e1 = addimpl(c_init_e0_e0_e1_e1_e1_addimpl0, c_init_e0_e0_e1_e1_e1_addimpl1)
  557.     c_init_e0_e0_e1_e1 = cl_lam(c_init_e0_e0_e1_e1_var0, c_init_e0_e0_e1_e1_e1)
  558.     c_init_e0_e0_e1 = cl_lam(c_init_e0_e0_e1_var0, c_init_e0_e0_e1_e1)
  559.     c_init_e0_e0 = cl_app(c_init_e0_e0_e0, c_init_e0_e0_e1)
  560.     c_init_e0_e1_var0 = mkvariable("m")
  561.     c_init_e0_e1_e1_var0 = mkvariable("n")
  562.     c_init_e0_e1_e1_e1_subimpl0 = mkvariable("m")
  563.     c_init_e0_e1_e1_e1_subimpl1 = mkvariable("n")
  564.     c_init_e0_e1_e1_e1 = subimpl(c_init_e0_e1_e1_e1_subimpl0, c_init_e0_e1_e1_e1_subimpl1)
  565.     c_init_e0_e1_e1 = cl_lam(c_init_e0_e1_e1_var0, c_init_e0_e1_e1_e1)
  566.     c_init_e0_e1 = cl_lam(c_init_e0_e1_var0, c_init_e0_e1_e1)
  567.     c_init_e0 = cl_app(c_init_e0_e0, c_init_e0_e1)
  568.     c_init_e1_var0 = mkvariable("m")
  569.     c_init_e1_e1_var0 = mkvariable("n")
  570.     c_init_e1_e1_e1_multimpl0 = mkvariable("m")
  571.     c_init_e1_e1_e1_multimpl1 = mkvariable("n")
  572.     c_init_e1_e1_e1 = multimpl(c_init_e1_e1_e1_multimpl0, c_init_e1_e1_e1_multimpl1)
  573.     c_init_e1_e1 = cl_lam(c_init_e1_e1_var0, c_init_e1_e1_e1)
  574.     c_init_e1 = cl_lam(c_init_e1_var0, c_init_e1_e1)
  575.     c_init = cl_app(c_init_e0, c_init_e1)
  576.     e_init = emptyenv()
  577.     k_init = cl_mt()
  578.     return c_init, e_init, k_init
  579.   else:
  580.     raise CEKMatchFailure("Expected p to be an e")
  581. class CEKError(Exception):
  582.   def __init__(self, message):
  583.     self.message = message
  584.   def __str__(self):
  585.     return self.message
  586. class CEKMatchFailure(CEKError):
  587.   pass
  588. class CEKUnlessFailure(CEKError):
  589.   def __init__(self):
  590.     pass
  591. class CEKDone(Exception):
  592.   def __init__(self, result):
  593.     self.result = result
  594.  
  595. def mkvariable(name):
  596.   return PrimVariable(name)
  597. class PrimVariable(cl_variable):
  598.   def __init__(self, name):
  599.     self.literal = name
  600.   def pprint(self, indent):
  601.     return self.literal
  602.  
  603. def mkint(n):
  604.   return Integer(n)
  605. class Integer(cl_integer):
  606.   def __init__(self, n):
  607.     self.value = n
  608.   def eq(self, other):
  609.     return isinstance(other, Integer) and self.value == other.value
  610.   def ne(self, other):
  611.     return not self.eq(other)
  612.   def pprint(self, indent):
  613.     return ' ' * indent + '%s' % self.value
  614.  
  615. class UnaryPrimK(cl_k):
  616.   def __init__(self, opname, op, ret):
  617.     self.opname = opname
  618.     self.op = op
  619.     self.ret = ret
  620.   def interpret(self, v, env):
  621.     return self.op(v), env, self.ret
  622.   def pprint(self, indent):
  623.     return ' ' * indent + '(%s %s)' % (self.opname, self.ret.pprint(0))
  624. class UnaryPrim(cl_e):
  625.   def __init__(self, arg, opname, op):
  626.     self.arg = arg
  627.     self.opname = opname
  628.     self.op = op
  629.   def interpret(self, env, k):
  630.     return self.arg, env, UnaryPrimK(self.opname, self.op, k)
  631.   def pprint(self, indent):
  632.     return ' ' * indent + '(%s %s)' % (self.opname, self.arg.pprint(0))
  633.  
  634. def zeropimpl(n):
  635.   return UnaryPrim(n, 'zerop', lambda n: cl_true() if n.value == 0 else cl_false())
  636. def succimpl(n):
  637.   return UnaryPrim(n, 'succ', lambda n: Integer(n.value + 1))
  638. def predimpl(n):
  639.   return UnaryPrim(n, 'pred', lambda n: Integer(n.value - 1))
  640.  
  641. class BinaryPrimK1(cl_k):
  642.   def __init__(self, arg2, env, k, opname, op):
  643.     self.arg2 = arg2
  644.     self.env = env
  645.     self.k = k
  646.     self.opname = opname
  647.     self.op = op
  648.   def interpret(self, v1, env):
  649.     return self.arg2, self.env, BinaryPrimK2(v1, env, self.k, self.opname, self.op)
  650.   def pprint(self, indent):
  651.     return ' ' * indent + '(%s1 %s %s %s)' % (self.opname, self.arg2.pprint(0), self.env.pprint(0), self.k.pprint(0))
  652. class BinaryPrimK2(cl_k):
  653.   def __init__(self, v1, env, k, opname, op):
  654.     self.v1 = v1
  655.     self.env = env
  656.     self.k = k
  657.     self.opname = opname
  658.     self.op = op
  659.   def interpret(self, v2, env):
  660.     return self.op(self.v1, v2), env, self.k
  661.   def pprint(self, indent):
  662.     return ' ' * indent + '(%s2 %s %s %s)' % (self.opname, self.v1.pprint(0), self.env.pprint(0), self.k.pprint(0))
  663. class BinaryPrim(cl_e):
  664.   def __init__(self, arg1, arg2, opname, op):
  665.     self.arg1 = arg1
  666.     self.arg2 = arg2
  667.     self.opname = opname
  668.     self.op = op
  669.   def interpret(self, env, k):
  670.     return self.arg1, env, BinaryPrimK1(self.arg2, env, k, self.opname, self.op)
  671. def addimpl(n1, n2):
  672.   return BinaryPrim(n1, n2, '+', lambda n1, n2: Integer(n1.value + n2.value))
  673. def subimpl(n1, n2):
  674.   return BinaryPrim(n1, n2, '-', lambda n1, n2: Integer(n1.value - n2.value))
  675. def multimpl(n1, n2):
  676.   return BinaryPrim(n1, n2, '*', lambda n1, n2: Integer(n1.value * n2.value))
  677.  
  678. class Env(cl_env):
  679.   def __init__(self):
  680.     pass
  681.   def lookup(self, x):
  682.     raise Exception("subclass responsibility")
  683. class EmptyEnv(Env):
  684.   def __init__(self):
  685.     pass
  686.   def lookup(self, y):
  687.     raise CEKError("Variable %s not found" % y)
  688. class ExtendedEnv(Env):
  689.   def __init__(self, x, v, e):
  690.     self.x = x
  691.     self.v = v
  692.     self.e = e
  693.   def lookup(self, y):
  694.     if self.x.literal == y.literal:
  695.       return self.v
  696.     else:
  697.       return self.e.lookup(y)
  698.  
  699. def emptyenv():
  700.   return EmptyEnv()
  701. def lookup(e, x):
  702.   return e.lookup(x)
  703. def extend(e, x, v):
  704.   return ExtendedEnv(x, v, e)
  705.  
  706. def pprint(v):
  707.   print v.pprint(0)
  708.   return v
  709.  
  710. def ret(v):
  711.   raise CEKDone(v)
  712.  
  713. from rpython.rlib import jit
  714. driver = jit.JitDriver(reds = ['e', 'k'],
  715.                        greens = ['c'],
  716.                        get_printable_location=lambda c: c.pprint(0))
  717. def run(p):
  718.   c, e, k = init(p)
  719.   while True:
  720.     driver.jit_merge_point(c = c, e = e, k = k)
  721.     # print "c: %s, e: %s, k: %s" % (c.pprint(0), e.pprint(0), k.pprint(0))
  722.     try:
  723.       c, e, k = c.interpret(e, k)
  724.       if isinstance(c, cl_app):
  725.         driver.can_enter_jit(c = c, e = e, k = k)
  726.     except CEKDone as d:
  727.       return d.result
  728.     except CEKError as err:
  729.       print err.__str__()
  730.       print c.pprint(0)
  731.       return c
  732. def main():
  733.   program_ast_e0_var0 = mkvariable("Z")
  734.   program_ast_e0_e1_e0_var0 = mkvariable("fib")
  735.   program_ast_e0_e1_e0_e1_e0_e0 = mkvariable("iszero")
  736.   program_ast_e0_e1_e0_e1_e0_e1_e0_e0 = mkvariable("-")
  737.   program_ast_e0_e1_e0_e1_e0_e1_e0_e1_e0 = mkvariable("fib")
  738.   program_ast_e0_e1_e0_e1_e0_e1_e0_e1_e1 = mkint(15)
  739.   program_ast_e0_e1_e0_e1_e0_e1_e0_e1 = cl_app(program_ast_e0_e1_e0_e1_e0_e1_e0_e1_e0, program_ast_e0_e1_e0_e1_e0_e1_e0_e1_e1)
  740.   program_ast_e0_e1_e0_e1_e0_e1_e0 = cl_app(program_ast_e0_e1_e0_e1_e0_e1_e0_e0, program_ast_e0_e1_e0_e1_e0_e1_e0_e1)
  741.   program_ast_e0_e1_e0_e1_e0_e1_e1 = mkint(610)
  742.   program_ast_e0_e1_e0_e1_e0_e1 = cl_app(program_ast_e0_e1_e0_e1_e0_e1_e0, program_ast_e0_e1_e0_e1_e0_e1_e1)
  743.   program_ast_e0_e1_e0_e1_e0 = cl_app(program_ast_e0_e1_e0_e1_e0_e0, program_ast_e0_e1_e0_e1_e0_e1)
  744.   program_ast_e0_e1_e0_e1_e1_var0 = mkvariable("success")
  745.   program_ast_e0_e1_e0_e1_e1_e1 = mkvariable("success")
  746.   program_ast_e0_e1_e0_e1_e1 = cl_lam(program_ast_e0_e1_e0_e1_e1_var0, program_ast_e0_e1_e0_e1_e1_e1)
  747.   program_ast_e0_e1_e0_e1_e2_var0 = mkvariable("failure")
  748.   program_ast_e0_e1_e0_e1_e2_e1 = mkvariable("failure")
  749.   program_ast_e0_e1_e0_e1_e2 = cl_lam(program_ast_e0_e1_e0_e1_e2_var0, program_ast_e0_e1_e0_e1_e2_e1)
  750.   program_ast_e0_e1_e0_e1 = cl_if(program_ast_e0_e1_e0_e1_e0, program_ast_e0_e1_e0_e1_e1, program_ast_e0_e1_e0_e1_e2)
  751.   program_ast_e0_e1_e0 = cl_lam(program_ast_e0_e1_e0_var0, program_ast_e0_e1_e0_e1)
  752.   program_ast_e0_e1_e1_e0 = mkvariable("Z")
  753.   program_ast_e0_e1_e1_e1_var0 = mkvariable("fib0")
  754.   program_ast_e0_e1_e1_e1_e1_var0 = mkvariable("n")
  755.   program_ast_e0_e1_e1_e1_e1_e1_e0_e0 = mkvariable("iszero")
  756.   program_ast_e0_e1_e1_e1_e1_e1_e0_e1 = mkvariable("n")
  757.   program_ast_e0_e1_e1_e1_e1_e1_e0 = cl_app(program_ast_e0_e1_e1_e1_e1_e1_e0_e0, program_ast_e0_e1_e1_e1_e1_e1_e0_e1)
  758.   program_ast_e0_e1_e1_e1_e1_e1_e1 = mkint(0)
  759.   program_ast_e0_e1_e1_e1_e1_e1_e2_e0_e0 = mkvariable("iszero")
  760.   program_ast_e0_e1_e1_e1_e1_e1_e2_e0_e1_e0_e0 = mkvariable("-")
  761.   program_ast_e0_e1_e1_e1_e1_e1_e2_e0_e1_e0_e1 = mkvariable("n")
  762.   program_ast_e0_e1_e1_e1_e1_e1_e2_e0_e1_e0 = cl_app(program_ast_e0_e1_e1_e1_e1_e1_e2_e0_e1_e0_e0, program_ast_e0_e1_e1_e1_e1_e1_e2_e0_e1_e0_e1)
  763.   program_ast_e0_e1_e1_e1_e1_e1_e2_e0_e1_e1 = mkint(1)
  764.   program_ast_e0_e1_e1_e1_e1_e1_e2_e0_e1 = cl_app(program_ast_e0_e1_e1_e1_e1_e1_e2_e0_e1_e0, program_ast_e0_e1_e1_e1_e1_e1_e2_e0_e1_e1)
  765.   program_ast_e0_e1_e1_e1_e1_e1_e2_e0 = cl_app(program_ast_e0_e1_e1_e1_e1_e1_e2_e0_e0, program_ast_e0_e1_e1_e1_e1_e1_e2_e0_e1)
  766.   program_ast_e0_e1_e1_e1_e1_e1_e2_e1 = mkint(1)
  767.   program_ast_e0_e1_e1_e1_e1_e1_e2_e2_e0_e0 = mkvariable("+")
  768.   program_ast_e0_e1_e1_e1_e1_e1_e2_e2_e0_e1_e0 = mkvariable("fib0")
  769.   program_ast_e0_e1_e1_e1_e1_e1_e2_e2_e0_e1_e1_e0_e0 = mkvariable("-")
  770.   program_ast_e0_e1_e1_e1_e1_e1_e2_e2_e0_e1_e1_e0_e1 = mkvariable("n")
  771.   program_ast_e0_e1_e1_e1_e1_e1_e2_e2_e0_e1_e1_e0 = cl_app(program_ast_e0_e1_e1_e1_e1_e1_e2_e2_e0_e1_e1_e0_e0, program_ast_e0_e1_e1_e1_e1_e1_e2_e2_e0_e1_e1_e0_e1)
  772.   program_ast_e0_e1_e1_e1_e1_e1_e2_e2_e0_e1_e1_e1 = mkint(1)
  773.   program_ast_e0_e1_e1_e1_e1_e1_e2_e2_e0_e1_e1 = cl_app(program_ast_e0_e1_e1_e1_e1_e1_e2_e2_e0_e1_e1_e0, program_ast_e0_e1_e1_e1_e1_e1_e2_e2_e0_e1_e1_e1)
  774.   program_ast_e0_e1_e1_e1_e1_e1_e2_e2_e0_e1 = cl_app(program_ast_e0_e1_e1_e1_e1_e1_e2_e2_e0_e1_e0, program_ast_e0_e1_e1_e1_e1_e1_e2_e2_e0_e1_e1)
  775.   program_ast_e0_e1_e1_e1_e1_e1_e2_e2_e0 = cl_app(program_ast_e0_e1_e1_e1_e1_e1_e2_e2_e0_e0, program_ast_e0_e1_e1_e1_e1_e1_e2_e2_e0_e1)
  776.   program_ast_e0_e1_e1_e1_e1_e1_e2_e2_e1_e0 = mkvariable("fib0")
  777.   program_ast_e0_e1_e1_e1_e1_e1_e2_e2_e1_e1_e0_e0 = mkvariable("-")
  778.   program_ast_e0_e1_e1_e1_e1_e1_e2_e2_e1_e1_e0_e1 = mkvariable("n")
  779.   program_ast_e0_e1_e1_e1_e1_e1_e2_e2_e1_e1_e0 = cl_app(program_ast_e0_e1_e1_e1_e1_e1_e2_e2_e1_e1_e0_e0, program_ast_e0_e1_e1_e1_e1_e1_e2_e2_e1_e1_e0_e1)
  780.   program_ast_e0_e1_e1_e1_e1_e1_e2_e2_e1_e1_e1 = mkint(2)
  781.   program_ast_e0_e1_e1_e1_e1_e1_e2_e2_e1_e1 = cl_app(program_ast_e0_e1_e1_e1_e1_e1_e2_e2_e1_e1_e0, program_ast_e0_e1_e1_e1_e1_e1_e2_e2_e1_e1_e1)
  782.   program_ast_e0_e1_e1_e1_e1_e1_e2_e2_e1 = cl_app(program_ast_e0_e1_e1_e1_e1_e1_e2_e2_e1_e0, program_ast_e0_e1_e1_e1_e1_e1_e2_e2_e1_e1)
  783.   program_ast_e0_e1_e1_e1_e1_e1_e2_e2 = cl_app(program_ast_e0_e1_e1_e1_e1_e1_e2_e2_e0, program_ast_e0_e1_e1_e1_e1_e1_e2_e2_e1)
  784.   program_ast_e0_e1_e1_e1_e1_e1_e2 = cl_if(program_ast_e0_e1_e1_e1_e1_e1_e2_e0, program_ast_e0_e1_e1_e1_e1_e1_e2_e1, program_ast_e0_e1_e1_e1_e1_e1_e2_e2)
  785.   program_ast_e0_e1_e1_e1_e1_e1 = cl_if(program_ast_e0_e1_e1_e1_e1_e1_e0, program_ast_e0_e1_e1_e1_e1_e1_e1, program_ast_e0_e1_e1_e1_e1_e1_e2)
  786.   program_ast_e0_e1_e1_e1_e1 = cl_lam(program_ast_e0_e1_e1_e1_e1_var0, program_ast_e0_e1_e1_e1_e1_e1)
  787.   program_ast_e0_e1_e1_e1 = cl_lam(program_ast_e0_e1_e1_e1_var0, program_ast_e0_e1_e1_e1_e1)
  788.   program_ast_e0_e1_e1 = cl_app(program_ast_e0_e1_e1_e0, program_ast_e0_e1_e1_e1)
  789.   program_ast_e0_e1 = cl_app(program_ast_e0_e1_e0, program_ast_e0_e1_e1)
  790.   program_ast_e0 = cl_lam(program_ast_e0_var0, program_ast_e0_e1)
  791.   program_ast_e1_var0 = mkvariable("f")
  792.   program_ast_e1_e1_e0_var0 = mkvariable("x")
  793.   program_ast_e1_e1_e0_e1_e0 = mkvariable("f")
  794.   program_ast_e1_e1_e0_e1_e1_var0 = mkvariable("v")
  795.   program_ast_e1_e1_e0_e1_e1_e1_e0_e0 = mkvariable("x")
  796.   program_ast_e1_e1_e0_e1_e1_e1_e0_e1 = mkvariable("x")
  797.   program_ast_e1_e1_e0_e1_e1_e1_e0 = cl_app(program_ast_e1_e1_e0_e1_e1_e1_e0_e0, program_ast_e1_e1_e0_e1_e1_e1_e0_e1)
  798.   program_ast_e1_e1_e0_e1_e1_e1_e1 = mkvariable("v")
  799.   program_ast_e1_e1_e0_e1_e1_e1 = cl_app(program_ast_e1_e1_e0_e1_e1_e1_e0, program_ast_e1_e1_e0_e1_e1_e1_e1)
  800.   program_ast_e1_e1_e0_e1_e1 = cl_lam(program_ast_e1_e1_e0_e1_e1_var0, program_ast_e1_e1_e0_e1_e1_e1)
  801.   program_ast_e1_e1_e0_e1 = cl_app(program_ast_e1_e1_e0_e1_e0, program_ast_e1_e1_e0_e1_e1)
  802.   program_ast_e1_e1_e0 = cl_lam(program_ast_e1_e1_e0_var0, program_ast_e1_e1_e0_e1)
  803.   program_ast_e1_e1_e1_var0 = mkvariable("x")
  804.   program_ast_e1_e1_e1_e1_e0 = mkvariable("f")
  805.   program_ast_e1_e1_e1_e1_e1_var0 = mkvariable("v")
  806.   program_ast_e1_e1_e1_e1_e1_e1_e0_e0 = mkvariable("x")
  807.   program_ast_e1_e1_e1_e1_e1_e1_e0_e1 = mkvariable("x")
  808.   program_ast_e1_e1_e1_e1_e1_e1_e0 = cl_app(program_ast_e1_e1_e1_e1_e1_e1_e0_e0, program_ast_e1_e1_e1_e1_e1_e1_e0_e1)
  809.   program_ast_e1_e1_e1_e1_e1_e1_e1 = mkvariable("v")
  810.   program_ast_e1_e1_e1_e1_e1_e1 = cl_app(program_ast_e1_e1_e1_e1_e1_e1_e0, program_ast_e1_e1_e1_e1_e1_e1_e1)
  811.   program_ast_e1_e1_e1_e1_e1 = cl_lam(program_ast_e1_e1_e1_e1_e1_var0, program_ast_e1_e1_e1_e1_e1_e1)
  812.   program_ast_e1_e1_e1_e1 = cl_app(program_ast_e1_e1_e1_e1_e0, program_ast_e1_e1_e1_e1_e1)
  813.   program_ast_e1_e1_e1 = cl_lam(program_ast_e1_e1_e1_var0, program_ast_e1_e1_e1_e1)
  814.   program_ast_e1_e1 = cl_app(program_ast_e1_e1_e0, program_ast_e1_e1_e1)
  815.   program_ast_e1 = cl_lam(program_ast_e1_var0, program_ast_e1_e1)
  816.   program_ast = cl_app(program_ast_e0, program_ast_e1)
  817.   result = run(program_ast)
  818.   return result
  819. if __name__ == "__main__":
  820.   main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement