1-- Open and half-open intervals of the real line, with their membership laws,2-- their inclusion in the closed interval with the same endpoints, and the3-- open balls inside an open interval4-- Part of Cumulus, the Grace17 mathematics library.5-- Copyright (c) 2026 Grant Passmore.6-- Released under the Apache License 2.0. See LICENSE in the repository root.7-- Authors: Grant Passmore89module Grace.Cumulus.Real.Analysis.OpenIntervals10import Intervals1112def openInterval (A B : Real) : Set:= { X ∈ ℝ | A < X ∧ X < B }13def leftOpenInterval (A B : Real) : Set:= { X ∈ ℝ | A < X ∧ X ≤ B }14def rightOpenInterval (A B : Real) : Set:= { X ∈ ℝ | A ≤ X ∧ X < B }1516theorem openInterval.subset_closed (A B : Real)17shows openInterval(A, B) ⊆ closedInterval(A, B)18proof19intros X hX20obtain⟨real, lower, upper⟩:= openInterval.membership.forward with hX21apply closedInterval.membership.backward22exact⟨real, ⟨realLess.implies_le with lower, realLess.implies_le with upper⟩⟩2324theorem leftOpenInterval.subset_closed (A B : Real)25shows leftOpenInterval(A, B) ⊆ closedInterval(A, B)26proof27intros X hX28obtain⟨real, lower, upper⟩:= leftOpenInterval.membership.forward with hX29apply closedInterval.membership.backward30exact⟨real, ⟨realLess.implies_le with lower, upper⟩⟩3132theorem rightOpenInterval.subset_closed (A B : Real)33shows rightOpenInterval(A, B) ⊆ closedInterval(A, B)34proof35intros X hX36obtain⟨real, lower, upper⟩:= rightOpenInterval.membership.forward with hX37apply closedInterval.membership.backward38exact⟨real, ⟨lower, realLess.implies_le with upper⟩⟩3940theorem openInterval.subset_left_open (A B : Real)41shows openInterval(A, B) ⊆ leftOpenInterval(A, B)42proof43intros X hX44obtain⟨real, lower, upper⟩:= openInterval.membership.forward with hX45apply leftOpenInterval.membership.backward46exact⟨real, ⟨lower, realLess.implies_le with upper⟩⟩4748theorem openInterval.subset_right_open (A B : Real)49shows openInterval(A, B) ⊆ rightOpenInterval(A, B)50proof51intros X hX52obtain⟨real, lower, upper⟩:= openInterval.membership.forward with hX53apply rightOpenInterval.membership.backward54exact⟨real, ⟨realLess.implies_le with lower, upper⟩⟩5556theorem openInterval.empty_of_le (A B : Real)57requires le : B ≤ A58shows openInterval(A, B) =∅59proof60ext X61constructor62 . intro hX63obtain⟨real, lower, upper⟩:= openInterval.membership.forward with hX64exfalso65linarith66 . intro hX67exfalso68 simpa using hX6970theorem openInterval.subset_reals (A B : Real)71shows openInterval(A, B) ⊆ ℝ72proof73intros X hX74obtain⟨real, lower, upper⟩:= openInterval.membership.forward with hX75exact real7677-- A ball that stays between the endpoints lies in the interval.78theorem openInterval.ball_subset (A B X E : Real)79requires lower : A ≤ X - E80requires upper : X + E ≤ B81shows openBall(X, E) ⊆ openInterval(A, B)82proof83intros Y hY84obtain⟨realY, near⟩:= openBall.membership.forward with hY85obtain⟨lowerY, upperY⟩:= openBall.order_characterization.forward with hY86apply openInterval.membership.backward87refine⟨realY, ?_, ?_⟩88 . linarith89 . linarith90