Sum Inh 20

Center
imports
{
import System.Environment( getArgs )
import System.CPUTime
}


DATA Root
   | Root  tree: Tree

DATA Tree
   | Node  left:  Tree   right: Tree
   | Leaf  value: Int

ATTR Tree Root [ | | sval : Int ]
ATTR Tree  [ ival1, ival2, ival3, ival4, ival5, ival6, ival7, ival8, ival9, ival10, 
             ival11, ival12, ival13, ival14, ival15, ival16, ival17, ival18, 
             ival19, ival20  : Int | | ]


SEM Root
  | Root  lhs.sval  =  @tree.sval

SEM Tree
  | Leaf  lhs.sval   = @lhs.ival1  + @lhs.ival2  + @lhs.ival3  + @lhs.ival4  + @lhs.ival5 +
                       @lhs.ival6  + @lhs.ival7  + @lhs.ival8  + @lhs.ival9  + @lhs.ival10 +
                       @lhs.ival11 + @lhs.ival12 + @lhs.ival13 + @lhs.ival14 + @lhs.ival15 +
                       @lhs.ival16 + @lhs.ival17 + @lhs.ival18 + @lhs.ival19 + @lhs.ival20 
  | Node  lhs.sval   = @left.sval + @right.sval

SEM Root
  | Root  tree.ival1  =  1
  | Root  tree.ival2  =  0
  | Root  tree.ival3  =  0
  | Root  tree.ival4  =  0
  | Root  tree.ival5  =  0
  | Root  tree.ival6  =  0
  | Root  tree.ival7  =  0
  | Root  tree.ival8  =  0
  | Root  tree.ival9  =  0
  | Root  tree.ival10  =  0
  | Root  tree.ival11  =  0
  | Root  tree.ival12  =  0
  | Root  tree.ival13  =  0
  | Root  tree.ival14  =  0
  | Root  tree.ival15  =  0
  | Root  tree.ival16  =  0
  | Root  tree.ival17  =  0
  | Root  tree.ival18  =  0
  | Root  tree.ival19  =  0
  | Root  tree.ival20  =  0

{

genTree 0 = sem_Tree_Leaf $ 2
genTree n = sem_Tree_Node (genTree $ n-1) (genTree $ n-1)

                 
main = do
        (cant:_) <- getArgs
        let p = cpuTimePrecision
        t1 <- getCPUTime
        print  $ (sem_Root_Root (genTree (read cant))) 
        t2 <- getCPUTime
        print $ (t2 - t1) `div` p

}