implementminConj(gr, emap): GREXP = let macdef d2g(gr) = let val rgr = case+ ,(gr) of | GRgenes(gs) => GRgenes(gs) | GRconj(gs) => GRgenes(gs) | GRdisj(gs) => let val dsz = int_of_size(genes_size(gs)) val rgr1 = if 1 = dsz then GRgenes(gs) else ($raise InvalidCase; GRdisj(gs)) in rgr1 end | X => X in rgr end in (case+ gr of | ~GRconj(ex1,ex2) => let val (ex1,ex2) = (d2g(ex1),d2g(ex2)) in (case+ (ex1,ex2) of | (~GRgenes(s1), ~GRgenes(s2)) => minConj(GRconj (s1+s2),emap) | (~GRconj(ex11, ex12), ex2) => minConj(GRconj(minConj(GRconj(ex11, ex12),emap),ex2),emap) | (ex1, ~GRconj(ex21, ex22)) => minConj(GRconj(ex1, minConj(GRconj(ex21, ex22),emap)),emap) | (LL,RR) => GRconj(LL,RR) ):GREXP end | ~GRconj(gs) => let val glist = genes_listize(gs) val mingene = list_min(glist, emap) val _ = genes_free(gs) in GRconj(genes_make_sing(mingene)) end | X => X ): GREXP end // end of [minConj]
externfun print_pretty_grexp (grexp: !GREXP): void
implementminConj(gr, emap): GREXP = let
fun d2g(gr:GREXP): GREXP = let val rgr = (case+ gr of | ~GRgenes(gs) => GRgenes(gs) | ~GRconj(gs) => GRgenes(gs) | ~GRdisj(gs) => let val dsz = int_of_size(genes_size(gs)) val rgr1 = (if 1 = dsz then GRgenes(gs) else (print_pretty_grexp(GRdisj(gs)); $raise InvalidCase; GRdisj(gs))): GREXP in rgr1 end | X => X): GREXP in rgr end
| ~GRdisj(gs) => let val dsz = int_of_size(genes_size(gs)) val rgr1 = (if 1 = dsz then GRgenes(gs)
else let val gr = GRdisj(gs) in (print_pretty_grexp(gr); $raise InvalidCase; gr) end): GREXP