src/Tools/Metis/metis.ML
changeset 24315 09b35593d091
parent 24138 bd3fc8ff6bc9
child 24324 9625e5bfa456
equal deleted inserted replaced
24314:665b3ab2dabe 24315:09b35593d091
    34 (* ------------------------------------------------------------------------- *)
    34 (* ------------------------------------------------------------------------- *)
    35 (* Timing function applications                                              *)
    35 (* Timing function applications                                              *)
    36 (* ------------------------------------------------------------------------- *)
    36 (* ------------------------------------------------------------------------- *)
    37 
    37 
    38 val time : ('a -> 'b) -> 'a -> 'b
    38 val time : ('a -> 'b) -> 'a -> 'b
       
    39 
       
    40 (* ------------------------------------------------------------------------- *)
       
    41 (* Critical section markup (multiprocessing)                                 *)
       
    42 (* ------------------------------------------------------------------------- *)
       
    43 
       
    44 val CRITICAL: (unit -> 'a) -> 'a
    39 
    45 
    40 end
    46 end
    41 
    47 
    42 (**** Original file: PortableIsabelle.sml ****)
    48 (**** Original file: PortableIsabelle.sml ****)
    43 
    49 
    69 (* ------------------------------------------------------------------------- *)
    75 (* ------------------------------------------------------------------------- *)
    70 (* Timing function applications a la Mosml.time.                             *)
    76 (* Timing function applications a la Mosml.time.                             *)
    71 (* ------------------------------------------------------------------------- *)
    77 (* ------------------------------------------------------------------------- *)
    72 
    78 
    73 val time = timeap;
    79 val time = timeap;
       
    80 
       
    81 (* ------------------------------------------------------------------------- *)
       
    82 (* Critical section markup (multiprocessing)                                 *)
       
    83 (* ------------------------------------------------------------------------- *)
       
    84 
       
    85 val CRITICAL = CRITICAL;
    74 
    86 
    75 end
    87 end
    76 
    88 
    77 (* ------------------------------------------------------------------------- *)
    89 (* ------------------------------------------------------------------------- *)
    78 (* Quotations a la Moscow ML.                                                *)
    90 (* Quotations a la Moscow ML.                                                *)
  1000 fun newgenseed seed =
  1012 fun newgenseed seed =
  1001     {seedref = ref (nextrand seed)};
  1013     {seedref = ref (nextrand seed)};
  1002 
  1014 
  1003 fun newgen () = newgenseed (Time.toReal (Time.now ()));
  1015 fun newgen () = newgenseed (Time.toReal (Time.now ()));
  1004 
  1016 
  1005 fun random {seedref as ref seed} = 
  1017 fun random {seedref} = CRITICAL (fn () => 
  1006     (seedref := nextrand seed; seed / m);
  1018     (seedref := nextrand (! seedref); ! seedref / m));
  1007 
  1019 
  1008 fun randomlist (n, {seedref as ref seed0}) = 
  1020 fun randomlist (n, {seedref}) = CRITICAL (fn () =>
  1009     let fun h 0 seed res = (seedref := seed; res)
  1021     let val seed0 = ! seedref
       
  1022         fun h 0 seed res = (seedref := seed; res)
  1010 	  | h i seed res = h (i-1) (nextrand seed) (seed / m :: res)
  1023 	  | h i seed res = h (i-1) (nextrand seed) (seed / m :: res)
  1011     in h n seed0 [] end;
  1024     in h n seed0 [] end);
  1012 
  1025 
  1013 fun range (min, max) = 
  1026 fun range (min, max) = 
  1014     if min > max then raise Fail "Random.range: empty range" 
  1027     if min > max then raise Fail "Random.range: empty range" 
  1015     else 
  1028     else 
  1016 	fn {seedref as ref seed} =>
  1029 	fn {seedref} => CRITICAL (fn () =>
  1017 	(seedref := nextrand seed; min + (floor(real(max-min) * seed / m)));
  1030 	(seedref := nextrand (! seedref); min + (floor(real(max-min) * ! seedref / m))));
  1018 
  1031 
  1019 fun rangelist (min, max) =
  1032 fun rangelist (min, max) =
  1020     if min > max then raise Fail "Random.rangelist: empty range" 
  1033     if min > max then raise Fail "Random.rangelist: empty range" 
  1021     else 
  1034     else 
  1022 	fn (n, {seedref as ref seed0}) => 
  1035 	fn (n, {seedref}) => CRITICAL (fn () => 
  1023 	let fun h 0 seed res = (seedref := seed; res)
  1036 	let val seed0 = ! seedref
       
  1037             fun h 0 seed res = (seedref := seed; res)
  1024 	      | h i seed res = h (i-1) (nextrand seed) 
  1038 	      | h i seed res = h (i-1) (nextrand seed) 
  1025 		               (min + floor(real(max-min) * seed / m) :: res)
  1039 		               (min + floor(real(max-min) * seed / m) :: res)
  1026 	in h n seed0 [] end
  1040 	in h n seed0 [] end)
  1027 
  1041 
  1028 end
  1042 end
  1029 end;
  1043 end;
  1030 
  1044 
  1031 (**** Original file: Useful.sig ****)
  1045 (**** Original file: Useful.sig ****)
  1720 
  1734 
  1721   fun calcPrimes n = looking [] n (K true) 2
  1735   fun calcPrimes n = looking [] n (K true) 2
  1722 
  1736 
  1723   val primesList = ref (calcPrimes 10);
  1737   val primesList = ref (calcPrimes 10);
  1724 in
  1738 in
  1725   fun primes n =
  1739   fun primes n = CRITICAL (fn () =>
  1726       if length (!primesList) <= n then List.take (!primesList,n)
  1740       if length (!primesList) <= n then List.take (!primesList,n)
  1727       else
  1741       else
  1728         let
  1742         let
  1729           val l = calcPrimes n
  1743           val l = calcPrimes n
  1730           val () = primesList := l
  1744           val () = primesList := l
  1731         in
  1745         in
  1732           l
  1746           l
  1733         end;
  1747         end);
  1734 
  1748 
  1735   fun primesUpTo n =
  1749   fun primesUpTo n = CRITICAL (fn () =>
  1736       let
  1750       let
  1737         fun f k [] =
  1751         fun f k [] =
  1738             let
  1752             let
  1739               val l = calcPrimes (2 * k)
  1753               val l = calcPrimes (2 * k)
  1740               val () = primesList := l
  1754               val () = primesList := l
  1743             end
  1757             end
  1744           | f k (p :: ps) =
  1758           | f k (p :: ps) =
  1745             if p <= n then f (k + 1) ps else List.take (!primesList, k)
  1759             if p <= n then f (k + 1) ps else List.take (!primesList, k)
  1746       in
  1760       in
  1747         f 0 (!primesList)
  1761         f 0 (!primesList)
  1748       end;
  1762       end);
  1749 end;
  1763 end;
  1750 
  1764 
  1751 (* ------------------------------------------------------------------------- *)
  1765 (* ------------------------------------------------------------------------- *)
  1752 (* Strings.                                                                  *)
  1766 (* Strings.                                                                  *)
  1753 (* ------------------------------------------------------------------------- *)
  1767 (* ------------------------------------------------------------------------- *)
  1915 (* ------------------------------------------------------------------------- *)
  1929 (* ------------------------------------------------------------------------- *)
  1916 
  1930 
  1917 local
  1931 local
  1918   val generator = ref 0
  1932   val generator = ref 0
  1919 in
  1933 in
  1920   fun newInt () =
  1934   fun newInt () = CRITICAL (fn () =>
  1921       let
  1935       let
  1922         val n = !generator
  1936         val n = !generator
  1923         val () = generator := n + 1
  1937         val () = generator := n + 1
  1924       in
  1938       in
  1925         n
  1939         n
  1926       end;
  1940       end);
  1927 
  1941 
  1928   fun newInts 0 = []
  1942   fun newInts 0 = []
  1929     | newInts k =
  1943     | newInts k = CRITICAL (fn () =>
  1930       let
  1944       let
  1931         val n = !generator
  1945         val n = !generator
  1932         val () = generator := n + k
  1946         val () = generator := n + k
  1933       in
  1947       in
  1934         interval n k
  1948         interval n k
  1935       end;
  1949       end);
  1936 end;
  1950 end;
  1937 
  1951 
  1938 local
  1952 local
  1939   val gen = Random.newgenseed 1.0;
  1953   val gen = Random.newgenseed 1.0;
  1940 in
  1954 in
 11125 
 11139 
 11126 val newSkolemFunction =
 11140 val newSkolemFunction =
 11127     let
 11141     let
 11128       val counter : int NameMap.map ref = ref (NameMap.new ())
 11142       val counter : int NameMap.map ref = ref (NameMap.new ())
 11129     in
 11143     in
 11130       fn n =>
 11144       fn n => CRITICAL (fn () =>
 11131       let
 11145       let
 11132         val ref m = counter
 11146         val ref m = counter
 11133         val i = Option.getOpt (NameMap.peek m n, 0)
 11147         val i = Option.getOpt (NameMap.peek m n, 0)
 11134         val () = counter := NameMap.insert m (n, i + 1)
 11148         val () = counter := NameMap.insert m (n, i + 1)
 11135       in
 11149       in
 11136         "skolem_" ^ n ^ (if i = 0 then "" else "_" ^ Int.toString i)
 11150         "skolem_" ^ n ^ (if i = 0 then "" else "_" ^ Int.toString i)
 11137       end
 11151       end)
 11138     end;
 11152     end;
 11139 
 11153 
 11140 fun skolemize fv bv fm =
 11154 fun skolemize fv bv fm =
 11141     let
 11155     let
 11142       val fv = NameSet.transform Term.Var fv
 11156       val fv = NameSet.transform Term.Var fv
 11323 
 11337 
 11324 val newDefinitionRelation =
 11338 val newDefinitionRelation =
 11325     let
 11339     let
 11326       val counter : int ref = ref 0
 11340       val counter : int ref = ref 0
 11327     in
 11341     in
 11328       fn () =>
 11342       fn () => CRITICAL (fn () =>
 11329       let
 11343       let
 11330         val ref i = counter
 11344         val ref i = counter
 11331         val () = counter := i + 1
 11345         val () = counter := i + 1
 11332       in
 11346       in
 11333         "defCNF_" ^ Int.toString i
 11347         "defCNF_" ^ Int.toString i
 11334       end
 11348       end)
 11335     end;
 11349     end;
 11336 
 11350 
 11337 fun newDefinition def =
 11351 fun newDefinition def =
 11338     let
 11352     let
 11339       val fv = freeVars def
 11353       val fv = freeVars def
 14829 
 14843 
 14830 val newId =
 14844 val newId =
 14831     let
 14845     let
 14832       val r = ref 0
 14846       val r = ref 0
 14833     in
 14847     in
 14834       fn () => case r of ref n => let val () = r := n + 1 in n end
 14848       fn () => CRITICAL (fn () =>
       
 14849         case r of ref n => let val () = r := n + 1 in n end)
 14835     end;
 14850     end;
 14836 
 14851 
 14837 (* ------------------------------------------------------------------------- *)
 14852 (* ------------------------------------------------------------------------- *)
 14838 (* A type of clause.                                                         *)
 14853 (* A type of clause.                                                         *)
 14839 (* ------------------------------------------------------------------------- *)
 14854 (* ------------------------------------------------------------------------- *)