431 type 'a fold_tuple_funcs = |
431 type 'a fold_tuple_funcs = |
432 {tuple_func: tuple -> 'a -> 'a, |
432 {tuple_func: tuple -> 'a -> 'a, |
433 tuple_set_func: tuple_set -> 'a -> 'a} |
433 tuple_set_func: tuple_set -> 'a -> 'a} |
434 |
434 |
435 fun fold_tuple (F : 'a fold_tuple_funcs) = #tuple_func F |
435 fun fold_tuple (F : 'a fold_tuple_funcs) = #tuple_func F |
|
436 |
436 fun fold_tuple_set F tuple_set = |
437 fun fold_tuple_set F tuple_set = |
437 case tuple_set of |
438 case tuple_set of |
438 TupleUnion (ts1, ts2) => fold_tuple_set F ts1 #> fold_tuple_set F ts2 |
439 TupleUnion (ts1, ts2) => fold_tuple_set F ts1 #> fold_tuple_set F ts2 |
439 | TupleDifference (ts1, ts2) => fold_tuple_set F ts1 #> fold_tuple_set F ts2 |
440 | TupleDifference (ts1, ts2) => fold_tuple_set F ts1 #> fold_tuple_set F ts2 |
440 | TupleIntersect (ts1, ts2) => fold_tuple_set F ts1 #> fold_tuple_set F ts2 |
441 | TupleIntersect (ts1, ts2) => fold_tuple_set F ts1 #> fold_tuple_set F ts2 |
443 | TupleSet ts => fold (fold_tuple F) ts |
444 | TupleSet ts => fold (fold_tuple F) ts |
444 | TupleRange (t1, t2) => fold_tuple F t1 #> fold_tuple F t2 |
445 | TupleRange (t1, t2) => fold_tuple F t1 #> fold_tuple F t2 |
445 | TupleArea (t1, t2) => fold_tuple F t1 #> fold_tuple F t2 |
446 | TupleArea (t1, t2) => fold_tuple F t1 #> fold_tuple F t2 |
446 | TupleAtomSeq _ => #tuple_set_func F tuple_set |
447 | TupleAtomSeq _ => #tuple_set_func F tuple_set |
447 | TupleSetReg _ => #tuple_set_func F tuple_set |
448 | TupleSetReg _ => #tuple_set_func F tuple_set |
|
449 |
448 fun fold_tuple_assign F assign = |
450 fun fold_tuple_assign F assign = |
449 case assign of |
451 case assign of |
450 AssignTuple (x, t) => fold_tuple F (TupleReg x) #> fold_tuple F t |
452 AssignTuple (x, t) => fold_tuple F (TupleReg x) #> fold_tuple F t |
451 | AssignTupleSet (x, ts) => |
453 | AssignTupleSet (x, ts) => |
452 fold_tuple_set F (TupleSetReg x) #> fold_tuple_set F ts |
454 fold_tuple_set F (TupleSetReg x) #> fold_tuple_set F ts |
|
455 |
453 fun fold_bound expr_F tuple_F (zs, tss) = |
456 fun fold_bound expr_F tuple_F (zs, tss) = |
454 fold (fold_rel_expr expr_F) (map (Rel o fst) zs) |
457 fold (fold_rel_expr expr_F) (map (Rel o fst) zs) |
455 #> fold (fold_tuple_set tuple_F) tss |
458 #> fold (fold_tuple_set tuple_F) tss |
|
459 |
456 fun fold_int_bound F (_, tss) = fold (fold_tuple_set F) tss |
460 fun fold_int_bound F (_, tss) = fold (fold_tuple_set F) tss |
457 |
461 |
458 fun max_arity univ_card = floor (Math.ln 2147483647.0 |
462 fun max_arity univ_card = floor (Math.ln 2147483647.0 |
459 / Math.ln (Real.fromInt univ_card)) |
463 / Math.ln (Real.fromInt univ_card)) |
|
464 |
460 fun arity_of_rel_expr (RelLet (_, r)) = arity_of_rel_expr r |
465 fun arity_of_rel_expr (RelLet (_, r)) = arity_of_rel_expr r |
461 | arity_of_rel_expr (RelIf (_, r1, _)) = arity_of_rel_expr r1 |
466 | arity_of_rel_expr (RelIf (_, r1, _)) = arity_of_rel_expr r1 |
462 | arity_of_rel_expr (Union (r1, _)) = arity_of_rel_expr r1 |
467 | arity_of_rel_expr (Union (r1, _)) = arity_of_rel_expr r1 |
463 | arity_of_rel_expr (Difference (r1, _)) = arity_of_rel_expr r1 |
468 | arity_of_rel_expr (Difference (r1, _)) = arity_of_rel_expr r1 |
464 | arity_of_rel_expr (Override (r1, _)) = arity_of_rel_expr r1 |
469 | arity_of_rel_expr (Override (r1, _)) = arity_of_rel_expr r1 |
537 |
542 |
538 fun inline_comment "" = "" |
543 fun inline_comment "" = "" |
539 | inline_comment comment = |
544 | inline_comment comment = |
540 " /* " ^ translate_string (fn "\n" => " " | "*" => "* " | s => s) comment ^ |
545 " /* " ^ translate_string (fn "\n" => " " | "*" => "* " | s => s) comment ^ |
541 " */" |
546 " */" |
|
547 |
542 fun block_comment "" = "" |
548 fun block_comment "" = "" |
543 | block_comment comment = prefix_lines "// " comment ^ "\n" |
549 | block_comment comment = prefix_lines "// " comment ^ "\n" |
544 |
550 |
545 fun commented_rel_name (x, s) = rel_name x ^ inline_comment s |
551 fun commented_rel_name (x, s) = rel_name x ^ inline_comment s |
546 |
552 |