Have lib/interval use [m ..= n] syntax
diff --git a/lib/interval/interval.go b/lib/interval/interval.go
index 2d5c8b4..e0b154a 100644
--- a/lib/interval/interval.go
+++ b/lib/interval/interval.go
@@ -17,17 +17,19 @@
 // Package interval provides interval arithmetic on big integers. Big means
 // arbitrary-precision, as per the standard math/big package.
 //
-// For example, if x is in the interval [3, 6] and y is in the interval [10,
-// 15] then x+y is in the interval [13, 21].
+// For example, if x is in the interval [3 ..= 6] and y is in the interval [10
+// ..= 15] then x+y is in the interval [13 ..= 21].
 //
-// Such intervals may have infinite bounds. For example, if x is in the
-// interval [3, +∞) and y is in the interval [-4, -2], then x*y is in the
-// interval (-∞, -6].
+// As in Rust, the [m ..= n] syntax means all integers i such that (m <= i) and
+// (i <= n). Unlike Rust, neither bound can be omitted, but they may be
+// infinite. For example, if x is in the interval [3 ..= +∞] and y is in the
+// interval [-4 ..= -2], then x*y is in the interval [-∞ ..= -6].
 //
 // As a motivating example, if a compiler knows that the integer-typed
-// variables i and j are in the intervals [0, 255] and [0, 3], and that the
-// array a has 1024 elements, then it can prove that the array-index expression
-// a[4*i + j] is memory-safe without needing an at-runtime bounds check.
+// variables i and j are in the intervals [0 ..= 255] and [0 ..= 3], and that
+// the array a has 1024 elements, then it can prove that the array-index
+// expression a[4*i + j] is memory-safe without needing an at-runtime bounds
+// check.
 //
 // This package depends only on the standard math/big package.
 package interval
@@ -146,19 +148,19 @@
 // String returns a string representation of x.
 func (x IntRange) String() string {
 	if x.Empty() {
-		return "<empty>"
+		return "[empty]"
 	}
 	buf := []byte(nil)
 	if x[0] == nil {
-		buf = append(buf, "(-∞"...)
+		buf = append(buf, "[-∞ ..= "...)
 	} else {
 		buf = append(buf, '[')
 		buf = x[0].Append(buf, 10)
+		buf = append(buf, " ..= "...)
 	}
 	if x[1] == nil {
-		buf = append(buf, " .. +∞)"...)
+		buf = append(buf, "+∞]"...)
 	} else {
-		buf = append(buf, " ..= "...)
 		buf = x[1].Append(buf, 10)
 		buf = append(buf, ']')
 	}
@@ -243,7 +245,7 @@
 	return x[0] != nil && x[1] != nil && x[0].Cmp(x[1]) > 0
 }
 
-// justZero returns whether x is the [0, 0] interval, containing exactly one
+// justZero returns whether x is the [0 ..= 0] interval, containing exactly one
 // element: the integer zero.
 func (x IntRange) justZero() bool {
 	return x[0] != nil && x[1] != nil && x[0].Sign() == 0 && x[1].Sign() == 0
diff --git a/lib/interval/radial_test.go b/lib/interval/radial_test.go
index f84bc88..3a54b50 100644
--- a/lib/interval/radial_test.go
+++ b/lib/interval/radial_test.go
@@ -36,14 +36,14 @@
 //  - radialOutput has a radius R of 16 << 16 (which equals 1048576).
 //
 // If x and y are "small" radialInput values or one of the two "smallest large"
-// radialInput values, i.e. x and y are in the range [-16, +16], then (x op y)
-// will always be a "small" radialOutput value, for the common binary
+// radialInput values, i.e. x and y are in the range [-16 ..= +16], then (x op
+// y) will always be a "small" radialOutput value, for the common binary
 // operators: add, subtract, multiply, divide, left-shift, right-shift, and,
 // or.
 //
 // Both of these radialInput and radialOutput types are encoded as an int32:
 //  - math.MinInt32 (which equals -1 << 31) encodes a NaN.
-//  - "small" numbers (within the interval [-R, +R]) encode themselves.
+//  - "small" numbers (within the interval [-R ..= +R]) encode themselves.
 //  - any other negative int32 encodes "less than -R".
 //  - any other positive int32 encodes "greater than +R".
 //
@@ -51,10 +51,10 @@
 // integers greater than +15.
 //
 // Binary operators take two radialInput values and produce a pair of
-// radialOutput values: either a [min, max] interval, or [NaN, NaN]. For
+// radialOutput values: either a [min ..= max] interval, or [NaN ..= NaN]. For
 // example, adding the "-3" box to the "greater than +15" box would produce the
-// radialOutPair ["13", "greater than +16 << 16"], or in more conventional
-// notation, the half-open interval [13, +∞).
+// radialOutPair ["13" ..= "greater than +16 << 16"], or in more conventional
+// notation, the half-open interval [13 ..= +∞].
 //
 // These radial number types are not exported by package interval, as the
 // radius values (15 and 16 << 16) are somewhat arbitrary and not so generally