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 |
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 |