chemoelectric

A code fragment from ats2-timsort

Sep 8th, 2025
237
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.63 KB | None | 0 0
  1. fn {a : vt@ype}
  2. insertion_position
  3. {p_arr : addr}
  4. {n : int}
  5. {i : pos | i < n}
  6. (pf_arr : !array_v (a, p_arr, n) |
  7. bp_arr : bptr_anchor (a, p_arr),
  8. bp_i : bptr (a, p_arr, i))
  9. :<> [j : nat | j <= i]
  10. bptr (a, p_arr, j) =
  11. (*
  12. A binary search.
  13.  
  14. References:
  15.  
  16. * H. Bottenbruch, "Structure and use of ALGOL 60", Journal of
  17. the ACM, Volume 9, Issue 2, April 1962, pp.161-221.
  18. https://doi.org/10.1145/321119.321120
  19.  
  20. The general algorithm is described on pages 214 and 215.
  21.  
  22. * https://en.wikipedia.org/w/index.php?title=Binary_search_algorithm&oldid=1062988272#Alternative_procedure
  23. *)
  24. let
  25. fun
  26. loop {j, k : int | 0 <= j; j <= k; k < i}
  27. .<k - j>.
  28. (pf_arr : !array_v (a, p_arr, n) |
  29. bp_j : bptr (a, p_arr, j),
  30. bp_k : bptr (a, p_arr, k))
  31. :<> [j1 : nat | j1 <= i]
  32. bptr (a, p_arr, j1) =
  33. if bp_j <> bp_k then
  34. let
  35. (* Find the point that is halfway between bp_j and bp_k,
  36. rounding towards bp_k. *)
  37. stadef h = k - ((k - j) / 2)
  38. val bp_h : bptr (a, p_arr, h) =
  39. bp_k - (half (bp_k - bp_j))
  40. in
  41. if elem_lt<a> (pf_arr | bp_i, bp_h) then
  42. loop (pf_arr | bp_j, pred bp_h)
  43. else
  44. loop (pf_arr | bp_h, bp_k)
  45. end
  46. else if bp_j <> bp_arr then
  47. succ bp_j
  48. else if elem_lt<a> (pf_arr | bp_i, bp_arr) then
  49. bp_arr
  50. else
  51. succ bp_arr
  52. in
  53. loop (pf_arr | bp_arr, pred bp_i)
  54. end
  55.  
Advertisement
Add Comment
Please, Sign In to add comment