src/HOL/Tools/Nitpick/kodkod.ML
changeset 55889 6bfbec3dff62
parent 55888 cac1add157e8
child 62549 9498623b27f0
equal deleted inserted replaced
55888:cac1add157e8 55889:6bfbec3dff62
   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