module Repmin where data Root = Top Tree data Tree = Bin Tree Tree | Leaf Int sem_Tree (Leaf val) = sem_Leaf val sem_Tree (Bin left right) = sem_Bin (sem_Tree left) (sem_Tree right) sem_Root (Top top) = sem_Top (sem_Tree top) sem_Leaf val = \lhs_gmin -> let lhs_lmin = val lhs_repl = Leaf lhs_gmin in (lhs_lmin, lhs_repl) sem_Bin left right = \lhs_gmin -> let (left_lmin, left_repl) = left lhs_gmin (right_lmin, right_repl) = right lhs_gmin lhs_lmin = left_lmin `min` right_lmin lhs_repl = Bin left_repl right_repl in (lhs_lmin, lhs_repl) sem_Top top = lhs_repl where (top_lmin, top_repl) = top top_gmin top_gmin = top_lmin lhs_repl = top_repl