diff --git a/results/rs/edf/floating_nonpreemptive.v b/results/rs/edf/floating_nonpreemptive.v
new file mode 100644
index 0000000000000000000000000000000000000000..997bd1cdeb9591b9feca9a36200639508807a21f
--- /dev/null
+++ b/results/rs/edf/floating_nonpreemptive.v
@@ -0,0 +1,225 @@
+Require Import prosa.analysis.facts.readiness.basic.
+Require Export prosa.analysis.facts.model.restricted_supply.schedule.
+Require Export prosa.analysis.facts.preemption.rtc_threshold.floating.
+Require Export prosa.analysis.abstract.restricted_supply.task_intra_interference_bound.
+Require Export prosa.analysis.abstract.restricted_supply.bounded_bi.edf.
+Require Export prosa.analysis.abstract.restricted_supply.search_space.edf.
+Require Export prosa.analysis.facts.model.task_cost.
+Require Export prosa.analysis.facts.priority.edf.
+Require Export prosa.analysis.facts.blocking_bound.edf.
+Require Export prosa.analysis.facts.workload.edf_athep_bound.
+Require Export prosa.analysis.definitions.sbf.busy.
+
+(** * RTA for EDF Scheduling with Floating Non-Preemptive Regions on Restricted-Supply Uniprocessors *)
+
+(** In the following, we derive a response-time analysis for EDF
+    schedulers, assuming a workload of sporadic real-time tasks
+    characterized by arbitrary arrival curves executing upon a
+    uniprocessor with arbitrary supply restrictions. To this end, we
+    instantiate the sequential variant of _abstract Restricted-Supply
+    Response-Time Analysis_ (aRSA) as provided in the
+    [prosa.analysis.abstract.restricted_supply] module. *)
+Section RTAforFloatingEDFModelwithArrivalCurves.
+
+  (** ** Defining the System Model *)
+
+  (** Before any formal claims can be stated, an initial setup is
+      needed to define the system model under consideration. To this
+      end, we next introduce and define the following notions using
+      Prosa's standard definitions and behavioral semantics:
+
+      - processor model,
+      - tasks, jobs, and their parameters,
+      - the sequence of job arrivals,
+      - worst-case execution time (WCET) and the absence of self-suspensions,
+      - the set of tasks under analysis,
+      - the task under analysis,
+      - an arbitrary schedule of the task set, and finally,
+      - a supply-bound function. *)
+
+  (** *** Processor Model *)
+
+  (** Consider a restricted-supply uniprocessor model. *)
+  #[local] Existing Instance rs_processor_state.
+
+  (** *** Tasks and Jobs  *)
+
+  (** Consider any type of tasks, each characterized by a WCET
+      [task_cost], relative deadline [task_deadline], an arrival curve
+      [max_arrivals], and a bound on the the task's longest
+      non-preemptive segment [task_max_nonpreemptive_segment], ... *)
+  Context {Task : TaskType}.
+  Context `{TaskCost Task}.
+  Context `{TaskDeadline Task}.
+  Context `{MaxArrivals Task}.
+  Context `{TaskMaxNonpreemptiveSegment Task}.
+
+  (** ... and any type of jobs associated with these tasks, where each
+      job has a task [job_task], a cost [job_cost], and an arrival
+      time [job_arrival], and a predicate indicating job's preemption
+      points [job_preemptive_points]. *)
+  Context {Job : JobType}.
+  Context `{JobTask Job Task}.
+  Context `{JobCost Job}.
+  Context `{JobArrival Job}.
+  Context `{JobPreemptionPoints Job}.
+
+  (** We assume that jobs are limited-preemptive. *)
+  #[local] Existing Instance limited_preemptive_job_model.
+
+  (** *** The Job Arrival Sequence *)
+
+  (** Consider any arrival sequence [arr_seq] with consistent, non-duplicate arrivals. *)
+  Variable arr_seq : arrival_sequence Job.
+  Hypothesis H_valid_arrival_sequence : valid_arrival_sequence arr_seq.
+
+  (** *** Absence of Self-Suspensions and WCET Compliance *)
+
+  (** We assume the classic (i.e., Liu & Layland) model of readiness
+      without jitter or self-suspensions, wherein pending jobs are
+      always ready. *)
+  #[local] Existing Instance basic_ready_instance.
+
+  (** We further require that a job's cost cannot exceed its task's stated WCET. *)
+  Hypothesis H_valid_job_cost : arrivals_have_valid_job_costs arr_seq.
+
+  (** *** The Task Set *)
+
+  (** We consider an arbitrary task set [ts] ... *)
+  Variable ts : seq Task.
+
+  (** ... and assume that all jobs stem from tasks in this task set. *)
+  Hypothesis H_all_jobs_from_taskset : all_jobs_from_taskset arr_seq ts.
+
+  (** Assume a model with floating non-preemptive regions. I.e., for
+      each task only the length of the maximal non-preemptive segment
+      is known and each job level is divided into a number of
+      non-preemptive segments by inserting preemption points. *)
+  Hypothesis H_valid_task_model_with_floating_nonpreemptive_regions :
+    valid_model_with_floating_nonpreemptive_regions arr_seq.
+
+  (** We assume that [max_arrivals] is a family of valid arrival
+      curves that constrains the arrival sequence [arr_seq], i.e., for
+      any task [tsk] in [ts], [max_arrival tsk] is (1) an arrival
+      bound of [tsk], and ... *)
+  Hypothesis H_is_arrival_curve : taskset_respects_max_arrivals arr_seq ts.
+
+  (** ... (2) a monotonic function that equals 0 for the empty interval [delta = 0]. *)
+  Hypothesis H_valid_arrival_curve : valid_taskset_arrival_curve ts max_arrivals.
+
+  (** *** The Task Under Analysis *)
+
+  (** Let [tsk] be any task in [ts] that is to be analyzed. *)
+  Variable tsk : Task.
+  Hypothesis H_tsk_in_ts : tsk \in ts.
+
+  (** *** The Schedule *)
+
+  (** Consider any arbitrary, work-conserving, valid restricted-supply
+      uni-processor schedule with limited preemptions of the given
+      arrival sequence [arr_seq] (and hence the given task set [ts]). *)
+  Variable sched : schedule (rs_processor_state Job).
+  Hypothesis H_valid_schedule : valid_schedule sched arr_seq.
+  Hypothesis H_work_conserving : work_conserving arr_seq sched.
+  Hypothesis H_schedule_with_limited_preemptions :
+    schedule_respects_preemption_model arr_seq sched.
+
+  (** Assume that the schedule respects the EDF policy. *)
+  Hypothesis H_respects_policy :
+    respects_JLFP_policy_at_preemption_point arr_seq sched (EDF Job).
+
+  (** *** Supply-Bound Function *)
+
+  (** Assume the minimum amount of supply that any job of task [tsk]
+      receives is defined by a monotone unit-supply-bound function [SBF]. *)
+  Context {SBF : SupplyBoundFunction}.
+  Hypothesis H_SBF_monotone : sbf_is_monotone SBF.
+  Hypothesis H_unit_SBF : unit_supply_bound_function SBF.
+
+  (** We assume that [SBF] properly characterizes all busy intervals
+      (w.r.t. task [tsk]) in [sched]. That is, (1) [SBF 0 = 0] and (2)
+      for any duration [Δ], at least [SBF Δ] supply is available in
+      any busy-interval prefix of length [Δ]. *)
+  Hypothesis H_valid_SBF : valid_busy_sbf arr_seq sched tsk SBF.
+
+  (** ** Workload Abbreviation *)
+
+  (** Let's denote the relative deadline of a task as [D]. *)
+  Let D tsk := task_deadline tsk.
+
+  (** We introduce [task_rbf] as an abbreviation
+      for the task request bound function of task [tsk]. *)
+  Let task_rbf := task_request_bound_function tsk.
+
+  (** ** Length of Busy Interval *)
+
+  (** The next step is to establish a bound on the maximum busy-window
+      length, which aRSA requires to be given. *)
+
+  (** To this end, let [L] be any positive constant such that ...  *)
+  Variable L : duration.
+  Hypothesis H_L_positive : 0 < L.
+
+  (** ... [L] satisfies a fixed-point recurrence for the
+      busy-interval-length bound (i.e., [total_RBF ts L <= SBF L] ... *)
+  Hypothesis H_fixed_point : total_request_bound_function ts L <= SBF L.
+
+  (** ... and [SBF L] bounds [longest_busy_interval_with_pi ts tsk]. *)
+  Hypothesis H_L_bounds_bi_with_pi :
+    longest_busy_interval_with_pi ts tsk <= SBF L.
+
+  (** ** Response-Time Bound *)
+
+  (** Having established all necessary preliminaries, it is finally
+      time to state the claimed response-time bound [R].
+
+      A value [R] is a response-time bound if, for any given offset
+      [A] in the search space, the response-time bound recurrence has
+      a solution [F] not exceeding [R]. *)
+  Definition rta_recurrence_solution R :=
+    forall (A : duration),
+      is_in_search_space ts tsk L A ->
+      exists (F : duration),
+        A <= F <= A + R
+        /\ blocking_bound ts tsk A + task_rbf (A + ε) + bound_on_athep_workload ts tsk A F <= SBF F.
+
+  (** Finally, using the sequential variant of abstract
+      restricted-supply analysis, we establish that any such [R] is a
+      sound response-time bound for the concrete model of EDF
+      scheduling with floating non-preemptive regions with arbitrary
+      supply restrictions. *)
+  Theorem uniprocessor_response_time_bound_floating_edf :
+    forall (R : duration),
+      rta_recurrence_solution R ->
+      task_response_time_bound arr_seq sched tsk R.
+  Proof.
+    move=> R SOL js ARRs TSKs.
+    have VAL1 : valid_preemption_model arr_seq sched.
+    { apply valid_fixed_preemption_points_model_lemma => //.
+      by apply H_valid_task_model_with_floating_nonpreemptive_regions. }
+    have [ZERO|POS] := posnP (job_cost js);
+      first by rewrite /job_response_time_bound /completed_by ZERO.
+    have READ : work_bearing_readiness arr_seq sched by done.
+    eapply uniprocessor_response_time_bound_restricted_supply_seq with (L := L) => //.
+    - exact: instantiated_i_and_w_are_coherent_with_schedule.
+    - exact: EDF_implies_sequential_tasks.
+    - exact: instantiated_interference_and_workload_consistent_with_sequential_tasks.
+    - apply: busy_intervals_are_bounded_rs_edf => //.
+    - apply: valid_pred_sbf_switch_predicate; last by exact: H_valid_SBF.
+      move => ? ? ? ? [? ?]; split => //.
+      by apply instantiated_busy_interval_prefix_equivalent_busy_interval_prefix.
+    - apply: instantiated_task_intra_interference_is_bounded; eauto 1 => //; first last.
+      + by (apply: bound_on_athep_workload_is_valid; try apply H_fixed_point) => //.
+      + apply: service_inversion_is_bounded => // => jo t1 t2 ARRo TSKo BUSYo.
+        by apply: nonpreemptive_segments_bounded_by_blocking => //.
+    - move=> A SP.
+      move: (SOL A) => [].
+      { by apply: search_space_sub => //; apply: search_space_switch_IBF. }
+      move=> FF [EQ1 EQ2].
+      exists FF; split; last split.
+      + lia.
+      + by move: EQ2; rewrite /task_intra_IBF -/task_rbf; lia.
+      + by rewrite subnn addn0; apply H_SBF_monotone; lia.
+  Qed.
+
+End RTAforFloatingEDFModelwithArrivalCurves.
diff --git a/results/rs/edf/fully_nonpreemptive.v b/results/rs/edf/fully_nonpreemptive.v
index 5aed50b6a9639cec140ed242f19b533da4762744..15560d9a79d5f8b6a7217b7dfe84eed9e77e6e9f 100644
--- a/results/rs/edf/fully_nonpreemptive.v
+++ b/results/rs/edf/fully_nonpreemptive.v
@@ -17,7 +17,7 @@ Require Export prosa.analysis.definitions.sbf.busy.
     schedulers, assuming a workload of sporadic real-time tasks
     characterized by arbitrary arrival curves executing upon a
     uniprocessor with arbitrary supply restrictions. To this end, we
-    instantiate the _abstract Sequential Restricted-Supply
+    instantiate the sequential variant of _abstract Restricted-Supply
     Response-Time Analysis_ (aRSA) as provided in the
     [prosa.analysis.abstract.restricted_supply] module. *)
 Section RTAforFullyNonPreemptiveEDFModelwithArrivalCurves.
@@ -34,20 +34,15 @@ Section RTAforFullyNonPreemptiveEDFModelwithArrivalCurves.
       - the sequence of job arrivals,
       - worst-case execution time (WCET) and the absence of self-suspensions,
       - the set of tasks under analysis,
-      - the task under analysis, and, finally,
-      - an arbitrary schedule of the task set. *)
+      - the task under analysis,
+      - an arbitrary schedule of the task set, and finally,
+      - a supply-bound function. *)
 
   (** *** Processor Model *)
 
-  (** Consider a restricted-supply uniprocessor model, ... *)
+  (** Consider a restricted-supply uniprocessor model. *)
   #[local] Existing Instance rs_processor_state.
 
-  (** ... where the minimum amount of supply is lower-bounded via a
-      monotone unit-supply-bound function [SBF]. *)
-  Context {SBF : SupplyBoundFunction}.
-  Hypothesis H_SBF_monotone : sbf_is_monotone SBF.
-  Hypothesis H_unit_SBF : unit_supply_bound_function SBF.
-
   (** *** Tasks and Jobs  *)
 
   (** Consider any type of tasks, each characterized by a WCET
@@ -112,28 +107,35 @@ Section RTAforFullyNonPreemptiveEDFModelwithArrivalCurves.
 
   (** *** The Schedule *)
 
-  (** Finally, consider any non-preemptive, work-conserving, valid
+  (** Consider any non-preemptive, work-conserving, valid
       restricted-supply uni-processor schedule of the given arrival
-      sequence [arr_seq] (and hence the given task set [ts]) ... *)
+      sequence [arr_seq] (and hence the given task set [ts]). *)
   Variable sched : schedule (rs_processor_state Job).
   Hypothesis H_valid_schedule : valid_schedule sched arr_seq.
   Hypothesis H_work_conserving : work_conserving arr_seq sched.
   Hypothesis H_nonpreemptive_sched : nonpreemptive_schedule sched.
 
-  (** ... and assume that the schedule respects the EDF policy. *)
+  (** Assume that the schedule respects the EDF policy. *)
   Hypothesis H_respects_policy :
     respects_JLFP_policy_at_preemption_point arr_seq sched (EDF Job).
 
-  (** Last but not least, we assume that [SBF] properly characterizes
-      all busy intervals (w.r.t. task [tsk]) in [sched]. That is, (1)
-      [SBF 0 = 0] and (2) for any duration [Δ], at least [SBF Δ]
-      supply is available in any busy-interval prefix of length
-      [Δ]. *)
+  (** *** Supply-Bound Function *)
+
+  (** Assume the minimum amount of supply that any job of task [tsk]
+      receives is defined by a monotone unit-supply-bound function [SBF]. *)
+  Context {SBF : SupplyBoundFunction}.
+  Hypothesis H_SBF_monotone : sbf_is_monotone SBF.
+  Hypothesis H_unit_SBF : unit_supply_bound_function SBF.
+
+  (** We assume that [SBF] properly characterizes all busy intervals
+      (w.r.t. task [tsk]) in [sched]. That is, (1) [SBF 0 = 0] and (2)
+      for any duration [Δ], at least [SBF Δ] supply is available in
+      any busy-interval prefix of length [Δ]. *)
   Hypothesis H_valid_SBF : valid_busy_sbf arr_seq sched tsk SBF.
 
   (** ** Workload Abbreviation *)
 
-  (** For brevity, let's denote the relative deadline of a task as [D]. *)
+  (** Let's denote the relative deadline of a task as [D]. *)
   Let D tsk := task_deadline tsk.
 
   (** We introduce [task_rbf] as an abbreviation
@@ -157,7 +159,6 @@ Section RTAforFullyNonPreemptiveEDFModelwithArrivalCurves.
   Hypothesis H_L_bounds_bi_with_pi :
     longest_busy_interval_with_pi ts tsk <= SBF L.
 
-
   (** ** Response-Time Bound *)
 
   (** Having established all necessary preliminaries, it is finally
@@ -166,8 +167,7 @@ Section RTAforFullyNonPreemptiveEDFModelwithArrivalCurves.
       A value [R] is a response-time bound if, for any given offset
       [A] in the search space, the response-time bound recurrence has
       a solution [F] not exceeding [R]. *)
-  Variable R : duration.
-  Hypothesis H_R_is_maximum :
+  Definition rta_recurrence_solution R :=
     forall (A : duration),
       is_in_search_space ts tsk L A ->
       exists (F : duration),
@@ -184,9 +184,11 @@ Section RTAforFullyNonPreemptiveEDFModelwithArrivalCurves.
       fully-nonpreemptive EDF scheduling with arbitrary supply
       restrictions. *)
   Theorem uniprocessor_response_time_bound_fully_nonpreemptive_edf :
-    task_response_time_bound arr_seq sched tsk R.
+    forall (R : duration),
+      rta_recurrence_solution R ->
+      task_response_time_bound arr_seq sched tsk R.
   Proof.
-    move=> js ARRs TSKs.
+    move=> R SOL js ARRs TSKs.
     have [ZERO|POS] := posnP (job_cost js); first by rewrite /job_response_time_bound /completed_by ZERO.
     have READ : work_bearing_readiness arr_seq sched by done.
     have VPR : valid_preemption_model arr_seq sched by exact: valid_fully_nonpreemptive_model => //.
@@ -202,7 +204,7 @@ Section RTAforFullyNonPreemptiveEDFModelwithArrivalCurves.
       + by (apply: bound_on_athep_workload_is_valid; try apply H_fixed_point) => //.
       + apply: service_inversion_is_bounded => // => jo t1 t2 ARRo TSKo BUSYo.
         by apply: nonpreemptive_segments_bounded_by_blocking => //.
-    - move => A SP; move: (H_R_is_maximum A) => [].
+    - move => A SP; move: (SOL A) => [].
       + by apply: search_space_sub => //.
       + move => F [/andP [_ LE] [FIX1 FIX2]]; exists F; split => //.
         rewrite /task_intra_IBF /task_rtct /fully_nonpreemptive_rtc_threshold /constant.
diff --git a/results/rs/edf/fully_preemptive.v b/results/rs/edf/fully_preemptive.v
index 7a865caf37f023d33ce2d40b610246dc0d2c41c2..e6ee0ffedd298561141d787f768ee5a974a5aadc 100644
--- a/results/rs/edf/fully_preemptive.v
+++ b/results/rs/edf/fully_preemptive.v
@@ -17,7 +17,7 @@ Require Export prosa.analysis.facts.workload.edf_athep_bound.
     schedulers, assuming a workload of sporadic real-time tasks
     characterized by arbitrary arrival curves executing upon a
     uniprocessor with arbitrary supply restrictions. To this end, we
-    instantiate the _abstract Sequential Restricted-Supply
+    instantiate the sequential variant of _abstract Restricted-Supply
     Response-Time Analysis_ (aRSA) as provided in the
     [prosa.analysis.abstract.restricted_supply] module. *)
 Section RTAforFullyPreemptiveEDFModelwithArrivalCurves.
@@ -34,20 +34,15 @@ Section RTAforFullyPreemptiveEDFModelwithArrivalCurves.
       - the sequence of job arrivals,
       - worst-case execution time (WCET) and the absence of self-suspensions,
       - the set of tasks under analysis,
-      - the task under analysis, and, finally,
-      - an arbitrary schedule of the task set. *)
+      - the task under analysis,
+      - an arbitrary schedule of the task set, and finally,
+      - a supply-bound function. *)
 
   (** *** Processor Model *)
 
-  (** Consider a restricted-supply uniprocessor model, ... *)
+  (** Consider a restricted-supply uniprocessor model. *)
   #[local] Existing Instance rs_processor_state.
 
-  (** ... where the minimum amount of supply is lower-bounded via a
-      monotone unit-supply-bound function [SBF]. *)
-  Context {SBF : SupplyBoundFunction}.
-  Hypothesis H_SBF_monotone : sbf_is_monotone SBF.
-  Hypothesis H_unit_SBF : unit_supply_bound_function SBF.
-
   (** *** Tasks and Jobs  *)
 
   (** Consider any type of tasks, each characterized by a WCET
@@ -112,27 +107,34 @@ Section RTAforFullyPreemptiveEDFModelwithArrivalCurves.
 
   (** *** The Schedule *)
 
-  (** Finally, consider any arbitrary, work-conserving, valid
-      restricted-supply uni-processor schedule of the given arrival
-      sequence [arr_seq] (and hence the given task set [ts]) ... *)
+  (** Consider any arbitrary, work-conserving, valid restricted-supply
+      uni-processor schedule of the given arrival sequence [arr_seq]
+      (and hence the given task set [ts]). *)
   Variable sched : schedule (rs_processor_state Job).
   Hypothesis H_valid_schedule : valid_schedule sched arr_seq.
   Hypothesis H_work_conserving : work_conserving arr_seq sched.
 
-  (** ... and assume that the schedule respects the EDF policy. *)
+  (** Assume that the schedule respects the EDF policy. *)
   Hypothesis H_respects_policy :
     respects_JLFP_policy_at_preemption_point arr_seq sched (EDF Job).
 
-  (** Last but not least, we assume that [SBF] properly characterizes
-      all busy intervals (w.r.t. task [tsk]) in [sched]. That is, (1)
-      [SBF 0 = 0] and (2) for any duration [Δ], at least [SBF Δ]
-      supply is available in any busy-interval prefix of length
-      [Δ]. *)
+  (** *** Supply-Bound Function *)
+
+  (** Assume the minimum amount of supply that any job of task [tsk]
+      receives is defined by a monotone unit-supply-bound function [SBF]. *)
+  Context {SBF : SupplyBoundFunction}.
+  Hypothesis H_SBF_monotone : sbf_is_monotone SBF.
+  Hypothesis H_unit_SBF : unit_supply_bound_function SBF.
+
+  (** We assume that [SBF] properly characterizes all busy intervals
+      (w.r.t. task [tsk]) in [sched]. That is, (1) [SBF 0 = 0] and (2)
+      for any duration [Δ], at least [SBF Δ] supply is available in
+      any busy-interval prefix of length [Δ]. *)
   Hypothesis H_valid_SBF : valid_busy_sbf arr_seq sched tsk SBF.
 
   (** ** Workload Abbreviation *)
 
-  (** For brevity, let's denote the relative deadline of a task as [D]. *)
+  (** Let's denote the relative deadline of a task as [D]. *)
   Let D tsk := task_deadline tsk.
 
   (** ** Length of Busy Interval *)
@@ -157,8 +159,7 @@ Section RTAforFullyPreemptiveEDFModelwithArrivalCurves.
       A value [R] is a response-time bound if, for any given offset
       [A] in the search space, the response-time bound recurrence has
       a solution [F] not exceeding [R]. *)
-  Variable R : duration.
-  Hypothesis H_R_is_maximum :
+  Definition rta_recurrence_solution R :=
     forall (A : duration),
       is_in_search_space ts tsk L A ->
       exists (F : duration),
@@ -171,9 +172,11 @@ Section RTAforFullyPreemptiveEDFModelwithArrivalCurves.
       fully-preemptive EDF scheduling with arbitrary supply
       restrictions.  *)
   Theorem uniprocessor_response_time_bound_fully_preemptive_edf :
-    task_response_time_bound arr_seq sched tsk R.
+    forall (R : duration),
+      rta_recurrence_solution R ->
+      task_response_time_bound arr_seq sched tsk R.
   Proof.
-    move=> js ARRs TSKs.
+    move=> R SOL js ARRs TSKs.
     have [ZERO|POS] := posnP (job_cost js);
                        first by rewrite /job_response_time_bound /completed_by ZERO.
     have READ : work_bearing_readiness arr_seq sched by done.
@@ -196,7 +199,7 @@ Section RTAforFullyPreemptiveEDFModelwithArrivalCurves.
       + apply: service_inversion_is_bounded => // => jo t1 t2 ARRo TSKo BUSYo.
         by apply: nonpreemptive_segments_bounded_by_blocking => //.
     - move => A SP.
-      move: (H_R_is_maximum A) => [].
+      move: (SOL A) => [].
       + by apply: search_space_sub => //.
       + move => F [/andP [_ LE] FIX]; exists F; split => //.
         rewrite /task_intra_IBF /task_rtct /fully_preemptive_rtc_threshold.
diff --git a/results/rs/edf/limited_preemptive.v b/results/rs/edf/limited_preemptive.v
new file mode 100644
index 0000000000000000000000000000000000000000..2d5bbbf9a46a417fa106fd1ac75bccca9b803edb
--- /dev/null
+++ b/results/rs/edf/limited_preemptive.v
@@ -0,0 +1,228 @@
+Require Import prosa.analysis.facts.readiness.basic.
+Require Export prosa.analysis.facts.model.restricted_supply.schedule.
+Require Export prosa.analysis.facts.preemption.rtc_threshold.limited.
+Require Export prosa.analysis.abstract.restricted_supply.task_intra_interference_bound.
+Require Export prosa.analysis.abstract.restricted_supply.bounded_bi.edf.
+Require Export prosa.analysis.abstract.restricted_supply.search_space.edf.
+Require Export prosa.analysis.facts.model.task_cost.
+Require Export prosa.analysis.facts.priority.edf.
+Require Export prosa.analysis.facts.blocking_bound.edf.
+Require Export prosa.analysis.facts.workload.edf_athep_bound.
+Require Export prosa.analysis.definitions.sbf.busy.
+
+(** * RTA for EDF Scheduling with Fixed Preemption Points on Restricted-Supply Uniprocessors *)
+
+(** In the following, we derive a response-time analysis for EDF
+    schedulers, assuming a workload of sporadic real-time tasks
+    characterized by arbitrary arrival curves executing upon a
+    uniprocessor with arbitrary supply restrictions. To this end, we
+    instantiate the sequential variant of _abstract Restricted-Supply
+    Response-Time Analysis_ (aRSA) as provided in the
+    [prosa.analysis.abstract.restricted_supply] module. *)
+Section RTAforLimitedPreemptiveEDFModelwithArrivalCurves.
+
+  (** ** Defining the System Model *)
+
+  (** Before any formal claims can be stated, an initial setup is
+      needed to define the system model under consideration. To this
+      end, we next introduce and define the following notions using
+      Prosa's standard definitions and behavioral semantics:
+
+      - processor model,
+      - tasks, jobs, and their parameters,
+      - the sequence of job arrivals,
+      - worst-case execution time (WCET) and the absence of self-suspensions,
+      - the set of tasks under analysis,
+      - the task under analysis,
+      - an arbitrary schedule of the task set, and finally,
+      - a supply-bound function. *)
+
+  (** *** Processor Model *)
+
+  (** Consider a restricted-supply uniprocessor model. *)
+  #[local] Existing Instance rs_processor_state.
+
+  (** *** Tasks and Jobs  *)
+
+  (** Consider any type of tasks, each characterized by a WCET
+      [task_cost], relative deadline [task_deadline], an arrival curve
+      [max_arrivals], and a predicate indicating task's preemption
+      points [task_preemption_points], ... *)
+  Context {Task : TaskType}.
+  Context `{TaskCost Task}.
+  Context `{TaskDeadline Task}.
+  Context `{MaxArrivals Task}.
+  Context `{TaskPreemptionPoints Task}.
+
+  (** ... and any type of jobs associated with these tasks, where each
+      job has a task [job_task], a cost [job_cost], an arrival time
+      [job_arrival], and a predicate indicating job's preemption
+      points [job_preemptive_points]. *)
+  Context {Job : JobType}.
+  Context `{JobTask Job Task}.
+  Context `{JobCost Job}.
+  Context `{JobArrival Job}.
+  Context `{JobPreemptionPoints Job}.
+
+  (** We assume that jobs are limited-preemptive. *)
+  #[local] Existing Instance limited_preemptive_job_model.
+
+  (** *** The Job Arrival Sequence *)
+
+  (** Consider any arrival sequence [arr_seq] with consistent, non-duplicate arrivals. *)
+  Variable arr_seq : arrival_sequence Job.
+  Hypothesis H_valid_arrival_sequence : valid_arrival_sequence arr_seq.
+
+  (** *** Absence of Self-Suspensions and WCET Compliance *)
+
+  (** We assume the classic (i.e., Liu & Layland) model of readiness
+      without jitter or self-suspensions, wherein pending jobs are
+      always ready. *)
+  #[local] Existing Instance basic_ready_instance.
+
+  (** We further require that a job's cost cannot exceed its task's stated WCET. *)
+  Hypothesis H_valid_job_cost : arrivals_have_valid_job_costs arr_seq.
+
+  (** *** The Task Set *)
+
+  (** We consider an arbitrary task set [ts] ... *)
+  Variable ts : seq Task.
+
+  (** ... and assume that all jobs stem from tasks in this task set. *)
+  Hypothesis H_all_jobs_from_taskset : all_jobs_from_taskset arr_seq ts.
+
+  (** We assume a model with fixed preemption points. I.e., each task
+      is divided into a number of non-preemptive segments by inserting
+      statically predefined preemption points. *)
+  Hypothesis H_valid_model_with_fixed_preemption_points :
+    valid_fixed_preemption_points_model arr_seq ts.
+
+  (** We assume that [max_arrivals] is a family of valid arrival
+      curves that constrains the arrival sequence [arr_seq], i.e., for
+      any task [tsk] in [ts], [max_arrival tsk] is (1) an arrival
+      bound of [tsk], and ... *)
+  Hypothesis H_is_arrival_curve : taskset_respects_max_arrivals arr_seq ts.
+
+  (** ... (2) a monotonic function that equals 0 for the empty interval [delta = 0]. *)
+  Hypothesis H_valid_arrival_curve : valid_taskset_arrival_curve ts max_arrivals.
+
+  (** *** The Task Under Analysis *)
+
+  (** Let [tsk] be any task in [ts] that is to be analyzed. *)
+  Variable tsk : Task.
+  Hypothesis H_tsk_in_ts : tsk \in ts.
+
+  (** *** The Schedule *)
+
+  (** Consider any arbitrary, work-conserving, valid restricted-supply
+      uni-processor schedule with limited preemptions of the given
+      arrival sequence [arr_seq] (and hence the given task set [ts]). *)
+  Variable sched : schedule (rs_processor_state Job).
+  Hypothesis H_valid_schedule : valid_schedule sched arr_seq.
+  Hypothesis H_work_conserving : work_conserving arr_seq sched.
+  Hypothesis H_schedule_with_limited_preemptions:
+    schedule_respects_preemption_model arr_seq sched.
+
+  (** Assume that the schedule respects the EDF policy. *)
+  Hypothesis H_respects_policy :
+    respects_JLFP_policy_at_preemption_point arr_seq sched (EDF Job).
+
+  (** *** Supply-Bound Function *)
+
+  (** Assume the minimum amount of supply that any job of task [tsk]
+      receives is defined by a monotone unit-supply-bound function [SBF]. *)
+  Context {SBF : SupplyBoundFunction}.
+  Hypothesis H_SBF_monotone : sbf_is_monotone SBF.
+  Hypothesis H_unit_SBF : unit_supply_bound_function SBF.
+
+  (** We assume that [SBF] properly characterizes all busy intervals
+      (w.r.t. task [tsk]) in [sched]. That is, (1) [SBF 0 = 0] and (2)
+      for any duration [Δ], at least [SBF Δ] supply is available in
+      any busy-interval prefix of length [Δ]. *)
+  Hypothesis H_valid_SBF : valid_busy_sbf arr_seq sched tsk SBF.
+
+  (** ** Workload Abbreviation *)
+
+  (** Let's denote the relative deadline of a task as [D]. *)
+  Let D tsk := task_deadline tsk.
+
+  (** We introduce [task_rbf] as an abbreviation
+      for the task request bound function of task [tsk]. *)
+  Let task_rbf := task_request_bound_function tsk.
+
+  (** ** Length of Busy Interval *)
+
+  (** The next step is to establish a bound on the maximum busy-window
+      length, which aRSA requires to be given. *)
+
+  (** To this end, let [L] be any positive constant such that ...  *)
+  Variable L : duration.
+  Hypothesis H_L_positive : 0 < L.
+
+  (** ... [L] satisfies a fixed-point recurrence for the
+      busy-interval-length bound (i.e., [total_RBF ts L <= SBF L] ... *)
+  Hypothesis H_fixed_point : total_request_bound_function ts L <= SBF L.
+
+  (** ... and [SBF L] bounds [longest_busy_interval_with_pi ts tsk]. *)
+  Hypothesis H_L_bounds_bi_with_pi :
+    longest_busy_interval_with_pi ts tsk <= SBF L.
+
+  (** ** Response-Time Bound *)
+
+  (** Having established all necessary preliminaries, it is finally
+      time to state the claimed response-time bound [R].
+
+      A value [R] is a response-time bound if, for any given offset
+      [A] in the search space, the response-time bound recurrence has
+      a solution [F] not exceeding [R]. *)
+  Definition rta_recurrence_solution R :=
+    forall (A : duration),
+      is_in_search_space ts tsk L A ->
+      exists (F : duration),
+        A <= F <= A + R
+        /\ blocking_bound ts tsk A
+          + (task_rbf (A + ε) - (task_last_nonpr_segment tsk - ε))
+          + bound_on_athep_workload ts tsk A F
+          <= SBF F
+        /\ SBF F + (task_last_nonpr_segment tsk - ε) <= SBF (A + R).
+
+  (** Finally, using the sequential variant of abstract
+      restricted-supply analysis, we establish that any such [R] is a
+      sound response-time bound for the concrete model of EDF
+      scheduling with limited preemptions with arbitrary supply
+      restrictions. *)
+  Theorem uniprocessor_response_time_bound_limited_edf :
+    forall (R : duration),
+      rta_recurrence_solution R ->
+      task_response_time_bound arr_seq sched tsk R.
+  Proof.
+    move=> R SOL js ARRs TSKs.
+    have [ZERO|POS] := posnP (job_cost js); first by rewrite /job_response_time_bound /completed_by ZERO.
+    have VAL1 : valid_preemption_model arr_seq sched.
+    { apply valid_fixed_preemption_points_model_lemma => //.
+      by apply H_valid_model_with_fixed_preemption_points. }
+    have READ : work_bearing_readiness arr_seq sched by done.
+    eapply uniprocessor_response_time_bound_restricted_supply_seq with (L := L) => //.
+    - exact: instantiated_i_and_w_are_coherent_with_schedule.
+    - exact: EDF_implies_sequential_tasks.
+    - exact: instantiated_interference_and_workload_consistent_with_sequential_tasks.
+    - apply: busy_intervals_are_bounded_rs_edf => //.
+    - apply: valid_pred_sbf_switch_predicate; last by exact: H_valid_SBF.
+      move => ? ? ? ? [? ?]; split => //.
+      by apply instantiated_busy_interval_prefix_equivalent_busy_interval_prefix.
+    - apply: instantiated_task_intra_interference_is_bounded; eauto 1 => //; first last.
+      + by (apply: bound_on_athep_workload_is_valid; try apply H_fixed_point) => //.
+      + apply: service_inversion_is_bounded => // => jo t1 t2 ARRo TSKo BUSYo.
+        by apply: nonpreemptive_segments_bounded_by_blocking => //.
+    - move=> A SP.
+      move: (SOL A) => [].
+      { by apply: search_space_sub => //; apply: search_space_switch_IBF. }
+      move=> FF [EQ1 [EQ2 EQ3]].
+      exists FF; split; last split.
+      + lia.
+      + move: EQ2; rewrite /task_intra_IBF -/task_rbf.
+        by erewrite last_segment_eq_cost_minus_rtct => //; lia.
+      + by erewrite last_segment_eq_cost_minus_rtct.
+  Qed.
+
+End RTAforLimitedPreemptiveEDFModelwithArrivalCurves.