Library prosa.analysis.facts.preemption.job.limited


(* ----------------------------------[ coqtop ]---------------------------------

Welcome to Coq 8.13.0 (January 2021)

----------------------------------------------------------------------------- *)


Require Export prosa.model.schedule.limited_preemptive.
Require Export prosa.analysis.definitions.job_properties.
Require Export prosa.analysis.facts.behavior.all.
Require Export prosa.analysis.facts.model.sequential.
Require Export prosa.analysis.facts.model.ideal_schedule.

Throughout this file, we assume the job model with limited preemption points.

Platform for Models with Limited Preemptions

In this section, we prove that instantiation of predicate [job_preemptable] to the model with limited preemptions indeed defines a valid preemption model.
Consider any type of tasks ...
  Context {Task : TaskType}.
  Context `{TaskCost Task}.

... and any type of jobs associated with these tasks.
  Context {Job : JobType}.
  Context `{JobTask Job Task}.
  Context `{JobArrival Job}.
  Context `{JobCost Job}.

In addition, assume the existence of a function that maps a job to the sequence of its preemption points.
  Context `{JobPreemptionPoints Job}.

Consider any arrival sequence.
  Variable arr_seq : arrival_sequence Job.

Next, consider any limited ideal uni-processor schedule of this arrival sequence ...
...where jobs do not execute after their completion.
Next, we assume that preemption points are defined by the job-level model with limited preemptions.
First, we prove a few auxiliary lemmas.
  Section AuxiliaryLemmas.

Consider a job j.
    Variable j : Job.
    Hypothesis H_j_arrives : arrives_in arr_seq j.

Recall that 0 is a preemption point.
    Remark zero_in_preemption_points: 0 \in job_preemption_points j.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 37)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  ============================
  0 \in job_preemption_points j

----------------------------------------------------------------------------- *)


    Proof. by apply H_valid_limited_preemptions_job_model.
(* ----------------------------------[ coqtop ]---------------------------------

No more subgoals.

----------------------------------------------------------------------------- *)


Qed.

Using the fact that [job_preemption_points] is a non-decreasing sequence, we prove that the first element of [job_preemption_points] is 0.
    Lemma zero_is_first_element: first0 (job_preemption_points j) = 0.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 41)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  ============================
  first0 (job_preemption_points j) = 0

----------------------------------------------------------------------------- *)


    Proof.
      have F := zero_in_preemption_points.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 46)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  F : 0 \in job_preemption_points j
  ============================
  first0 (job_preemption_points j) = 0

----------------------------------------------------------------------------- *)


      destruct H_valid_limited_preemptions_job_model as [_ [_ C]]; specialize (C j H_j_arrives).

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 60)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  F : 0 \in job_preemption_points j
  C : nondecreasing_sequence (job_preemption_points j)
  ============================
  first0 (job_preemption_points j) = 0

----------------------------------------------------------------------------- *)


        by apply nondec_seq_zero_first.

(* ----------------------------------[ coqtop ]---------------------------------

No more subgoals.

----------------------------------------------------------------------------- *)


    Qed.

We prove that the list of preemption points is not empty.
    Lemma list_of_preemption_point_is_not_empty:
      0 < size (job_preemption_points j).

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 45)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  ============================
  0 < size (job_preemption_points j)

----------------------------------------------------------------------------- *)


    Proof.
      move: H_valid_limited_preemptions_job_model ⇒ [BEG [END _]].

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 68)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  BEG : beginning_of_execution_in_preemption_points arr_seq
  END : end_of_execution_in_preemption_points arr_seq
  ============================
  0 < size (job_preemption_points j)

----------------------------------------------------------------------------- *)


      apply/negPn/negP; rewrite -eqn0Ngt; intros CONTR; rewrite size_eq0 in CONTR.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 199)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  BEG : beginning_of_execution_in_preemption_points arr_seq
  END : end_of_execution_in_preemption_points arr_seq
  CONTR : job_preemption_points j == [::]
  ============================
  False

----------------------------------------------------------------------------- *)


      specialize (BEG j H_j_arrives).

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 201)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  BEG : 0 \in job_preemption_points j
  END : end_of_execution_in_preemption_points arr_seq
  CONTR : job_preemption_points j == [::]
  ============================
  False

----------------------------------------------------------------------------- *)


        by rewrite /beginning_of_execution_in_preemption_points (eqbool_to_eqprop CONTR) in BEG.

(* ----------------------------------[ coqtop ]---------------------------------

No more subgoals.

----------------------------------------------------------------------------- *)


    Qed.

Next, we prove that the cost of a job is a preemption point.
    Lemma job_cost_in_nonpreemptive_points: job_cost j \in job_preemption_points j.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 54)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  ============================
  job_cost j \in job_preemption_points j

----------------------------------------------------------------------------- *)


    Proof.
      move: H_valid_limited_preemptions_job_model ⇒ [BEG [END _]].

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 77)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  BEG : beginning_of_execution_in_preemption_points arr_seq
  END : end_of_execution_in_preemption_points arr_seq
  ============================
  job_cost j \in job_preemption_points j

----------------------------------------------------------------------------- *)


      move: (END _ H_j_arrives) ⇒ EQ.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 81)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  BEG : beginning_of_execution_in_preemption_points arr_seq
  END : end_of_execution_in_preemption_points arr_seq
  EQ : last0 (job_preemption_points j) = job_cost j
  ============================
  job_cost j \in job_preemption_points j

----------------------------------------------------------------------------- *)


      rewrite -EQ; clear EQ.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 84)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  BEG : beginning_of_execution_in_preemption_points arr_seq
  END : end_of_execution_in_preemption_points arr_seq
  ============================
  last0 (job_preemption_points j) \in job_preemption_points j

----------------------------------------------------------------------------- *)


      rewrite /last0 -nth_last.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 90)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  BEG : beginning_of_execution_in_preemption_points arr_seq
  END : end_of_execution_in_preemption_points arr_seq
  ============================
  nth 0 (job_preemption_points j) (size (job_preemption_points j)).-1
    \in job_preemption_points j

----------------------------------------------------------------------------- *)


      apply/(nthP 0).

(* ----------------------------------[ coqtop ]---------------------------------

1 focused subgoal
(shelved: 1) (ID 118)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  BEG : beginning_of_execution_in_preemption_points arr_seq
  END : end_of_execution_in_preemption_points arr_seq
  ============================
  exists2 i : nat,
    i < size (job_preemption_points j) &
    nth 0 (job_preemption_points j) i =
    nth 0 (job_preemption_points j) (size (job_preemption_points j)).-1

----------------------------------------------------------------------------- *)


       ((size (job_preemption_points j)).-1); last by done.
(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 123)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  BEG : beginning_of_execution_in_preemption_points arr_seq
  END : end_of_execution_in_preemption_points arr_seq
  ============================
  (size (job_preemption_points j)).-1 < size (job_preemption_points j)

----------------------------------------------------------------------------- *)


      rewrite -(leq_add2r 1) !addn1 prednK //.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 140)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  BEG : beginning_of_execution_in_preemption_points arr_seq
  END : end_of_execution_in_preemption_points arr_seq
  ============================
  0 < size (job_preemption_points j)

----------------------------------------------------------------------------- *)


        by apply list_of_preemption_point_is_not_empty.

(* ----------------------------------[ coqtop ]---------------------------------

No more subgoals.

----------------------------------------------------------------------------- *)


    Qed.

As a corollary, we prove that the sequence of non-preemptive points of a job with positive cost contains at least 2 points.
    Corollary number_of_preemption_points_at_least_two:
      job_cost_positive j
      2 size (job_preemption_points j).

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 60)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  ============================
  job_cost_positive j -> 1 < size (job_preemption_points j)

----------------------------------------------------------------------------- *)


    Proof.
      intros POS.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 61)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  POS : job_cost_positive j
  ============================
  1 < size (job_preemption_points j)

----------------------------------------------------------------------------- *)


      move: H_valid_limited_preemptions_job_model ⇒ [BEG [END _]].
(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 84)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  POS : job_cost_positive j
  BEG : beginning_of_execution_in_preemption_points arr_seq
  END : end_of_execution_in_preemption_points arr_seq
  ============================
  1 < size (job_preemption_points j)

----------------------------------------------------------------------------- *)


      have EQ: 2 = size [::0; job_cost j]; first by done.
(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 94)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  POS : job_cost_positive j
  BEG : beginning_of_execution_in_preemption_points arr_seq
  END : end_of_execution_in_preemption_points arr_seq
  EQ : 2 = size [:: 0; job_cost j]
  ============================
  1 < size (job_preemption_points j)

----------------------------------------------------------------------------- *)


      rewrite EQ; clear EQ.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 97)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  POS : job_cost_positive j
  BEG : beginning_of_execution_in_preemption_points arr_seq
  END : end_of_execution_in_preemption_points arr_seq
  ============================
  size [:: 0; job_cost j] <= size (job_preemption_points j)

----------------------------------------------------------------------------- *)


      apply subseq_leq_size.

(* ----------------------------------[ coqtop ]---------------------------------

2 subgoals (ID 99)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  POS : job_cost_positive j
  BEG : beginning_of_execution_in_preemption_points arr_seq
  END : end_of_execution_in_preemption_points arr_seq
  ============================
  uniq [:: 0; job_cost j]

subgoal 2 (ID 100) is:
 forall x : nat_eqType,
 x \in [:: 0; job_cost j] -> x \in job_preemption_points j

----------------------------------------------------------------------------- *)


      rewrite !cons_uniq.

(* ----------------------------------[ coqtop ]---------------------------------

2 subgoals (ID 110)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  POS : job_cost_positive j
  BEG : beginning_of_execution_in_preemption_points arr_seq
  END : end_of_execution_in_preemption_points arr_seq
  ============================
  [&& 0 \notin [:: job_cost j], job_cost j \notin [::] & uniq [::]]

subgoal 2 (ID 100) is:
 forall x : nat_eqType,
 x \in [:: 0; job_cost j] -> x \in job_preemption_points j

----------------------------------------------------------------------------- *)


      {
(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 110)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  POS : job_cost_positive j
  BEG : beginning_of_execution_in_preemption_points arr_seq
  END : end_of_execution_in_preemption_points arr_seq
  ============================
  [&& 0 \notin [:: job_cost j], job_cost j \notin [::] & uniq [::]]

----------------------------------------------------------------------------- *)


apply/andP; split.

(* ----------------------------------[ coqtop ]---------------------------------

2 subgoals (ID 139)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  POS : job_cost_positive j
  BEG : beginning_of_execution_in_preemption_points arr_seq
  END : end_of_execution_in_preemption_points arr_seq
  ============================
  0 \notin [:: job_cost j]

subgoal 2 (ID 140) is:
 (job_cost j \notin [::]) && uniq [::]

----------------------------------------------------------------------------- *)


        rewrite in_cons negb_or; apply/andP; split; last by done.

(* ----------------------------------[ coqtop ]---------------------------------

2 subgoals (ID 176)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  POS : job_cost_positive j
  BEG : beginning_of_execution_in_preemption_points arr_seq
  END : end_of_execution_in_preemption_points arr_seq
  ============================
  0 != job_cost j

subgoal 2 (ID 140) is:
 (job_cost j \notin [::]) && uniq [::]

----------------------------------------------------------------------------- *)


        rewrite neq_ltn; apply/orP; left; eauto 2.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 140)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  POS : job_cost_positive j
  BEG : beginning_of_execution_in_preemption_points arr_seq
  END : end_of_execution_in_preemption_points arr_seq
  ============================
  (job_cost j \notin [::]) && uniq [::]

----------------------------------------------------------------------------- *)


        apply/andP; split; by done.
(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal

subgoal 1 (ID 100) is:
 forall x : nat_eqType,
 x \in [:: 0; job_cost j] -> x \in job_preemption_points j

----------------------------------------------------------------------------- *)


}
(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 100)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  POS : job_cost_positive j
  BEG : beginning_of_execution_in_preemption_points arr_seq
  END : end_of_execution_in_preemption_points arr_seq
  ============================
  forall x : nat_eqType,
  x \in [:: 0; job_cost j] -> x \in job_preemption_points j

----------------------------------------------------------------------------- *)



      intros t EQ; move: EQ; rewrite !in_cons.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 254)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  POS : job_cost_positive j
  BEG : beginning_of_execution_in_preemption_points arr_seq
  END : end_of_execution_in_preemption_points arr_seq
  t : nat_eqType
  ============================
  [|| t == 0, t == job_cost j | t \in [::]] -> t \in job_preemption_points j

----------------------------------------------------------------------------- *)


      move ⇒ /orP [/eqP EQ| /orP [/eqP EQ|EQ]]; last by done.

(* ----------------------------------[ coqtop ]---------------------------------

2 subgoals (ID 402)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  POS : job_cost_positive j
  BEG : beginning_of_execution_in_preemption_points arr_seq
  END : end_of_execution_in_preemption_points arr_seq
  t : nat_eqType
  EQ : t = 0
  ============================
  t \in job_preemption_points j

subgoal 2 (ID 403) is:
 t \in job_preemption_points j

----------------------------------------------------------------------------- *)


      - by rewrite EQ; apply zero_in_preemption_points.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 403)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  POS : job_cost_positive j
  BEG : beginning_of_execution_in_preemption_points arr_seq
  END : end_of_execution_in_preemption_points arr_seq
  t : nat_eqType
  EQ : t = job_cost j
  ============================
  t \in job_preemption_points j

----------------------------------------------------------------------------- *)


      - by rewrite EQ; apply job_cost_in_nonpreemptive_points.

(* ----------------------------------[ coqtop ]---------------------------------

No more subgoals.

----------------------------------------------------------------------------- *)


    Qed.

Next we prove that "anti-density" property (from [preemption.util] file) holds for [job_preemption_point j].
    Lemma antidensity_of_preemption_points:
       (ρ : work),
        ρ job_cost j
        ~~ (ρ \in job_preemption_points j)
        first0 (job_preemption_points j) ρ < last0 (job_preemption_points j).
(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 73)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  ============================
  forall ρ : work,
  ρ <= job_cost j ->
  ρ \notin job_preemption_points j ->
  first0 (job_preemption_points j) <= ρ < last0 (job_preemption_points j)

----------------------------------------------------------------------------- *)


    Proof.
      intros ρ LE NotIN.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 76)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  ρ : work
  LE : ρ <= job_cost j
  NotIN : ρ \notin job_preemption_points j
  ============================
  first0 (job_preemption_points j) <= ρ < last0 (job_preemption_points j)

----------------------------------------------------------------------------- *)


      move: H_valid_limited_preemptions_job_model ⇒ [BEG [END NDEC]].

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 98)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  ρ : work
  LE : ρ <= job_cost j
  NotIN : ρ \notin job_preemption_points j
  BEG : beginning_of_execution_in_preemption_points arr_seq
  END : end_of_execution_in_preemption_points arr_seq
  NDEC : preemption_points_is_nondecreasing_sequence arr_seq
  ============================
  first0 (job_preemption_points j) <= ρ < last0 (job_preemption_points j)

----------------------------------------------------------------------------- *)


      apply/andP; split.

(* ----------------------------------[ coqtop ]---------------------------------

2 subgoals (ID 124)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  ρ : work
  LE : ρ <= job_cost j
  NotIN : ρ \notin job_preemption_points j
  BEG : beginning_of_execution_in_preemption_points arr_seq
  END : end_of_execution_in_preemption_points arr_seq
  NDEC : preemption_points_is_nondecreasing_sequence arr_seq
  ============================
  first0 (job_preemption_points j) <= ρ

subgoal 2 (ID 125) is:
 ρ < last0 (job_preemption_points j)

----------------------------------------------------------------------------- *)


      - by rewrite zero_is_first_element.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 125)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  ρ : work
  LE : ρ <= job_cost j
  NotIN : ρ \notin job_preemption_points j
  BEG : beginning_of_execution_in_preemption_points arr_seq
  END : end_of_execution_in_preemption_points arr_seq
  NDEC : preemption_points_is_nondecreasing_sequence arr_seq
  ============================
  ρ < last0 (job_preemption_points j)

----------------------------------------------------------------------------- *)


      - rewrite END; last by done.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 133)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  ρ : work
  LE : ρ <= job_cost j
  NotIN : ρ \notin job_preemption_points j
  BEG : beginning_of_execution_in_preemption_points arr_seq
  END : end_of_execution_in_preemption_points arr_seq
  NDEC : preemption_points_is_nondecreasing_sequence arr_seq
  ============================
  ρ < job_cost j

----------------------------------------------------------------------------- *)


        rewrite ltn_neqAle; apply/andP; split; last by done.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 164)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  ρ : work
  LE : ρ <= job_cost j
  NotIN : ρ \notin job_preemption_points j
  BEG : beginning_of_execution_in_preemption_points arr_seq
  END : end_of_execution_in_preemption_points arr_seq
  NDEC : preemption_points_is_nondecreasing_sequence arr_seq
  ============================
  ρ != job_cost j

----------------------------------------------------------------------------- *)


        apply/negP; intros CONTR; move: CONTR ⇒ /eqP CONTR.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 222)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  ρ : work
  LE : ρ <= job_cost j
  NotIN : ρ \notin job_preemption_points j
  BEG : beginning_of_execution_in_preemption_points arr_seq
  END : end_of_execution_in_preemption_points arr_seq
  NDEC : preemption_points_is_nondecreasing_sequence arr_seq
  CONTR : ρ = job_cost j
  ============================
  False

----------------------------------------------------------------------------- *)


        rewrite CONTR in NotIN.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 252)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  ρ : work
  LE : ρ <= job_cost j
  BEG : beginning_of_execution_in_preemption_points arr_seq
  END : end_of_execution_in_preemption_points arr_seq
  NDEC : preemption_points_is_nondecreasing_sequence arr_seq
  CONTR : ρ = job_cost j
  NotIN : job_cost j \notin job_preemption_points j
  ============================
  False

----------------------------------------------------------------------------- *)


        move: NotIN ⇒ /negP NIN; apply: NIN.
(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 285)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  ρ : work
  LE : ρ <= job_cost j
  BEG : beginning_of_execution_in_preemption_points arr_seq
  END : end_of_execution_in_preemption_points arr_seq
  NDEC : preemption_points_is_nondecreasing_sequence arr_seq
  CONTR : ρ = job_cost j
  ============================
  job_cost j \in job_preemption_points j

----------------------------------------------------------------------------- *)


          by apply job_cost_in_nonpreemptive_points.

(* ----------------------------------[ coqtop ]---------------------------------

No more subgoals.

----------------------------------------------------------------------------- *)


    Qed.

We also prove that any work that doesn't belong to preemption points of job j is placed strictly between two neighboring preemption points.
    Lemma work_belongs_to_some_nonpreemptive_segment:
       (ρ : work),
        ρ job_cost j
        ~~ (ρ \in job_preemption_points j)
         n,
          n.+1 < size (job_preemption_points j)
          nth 0 (job_preemption_points j) n < ρ < nth 0 (job_preemption_points j) n.+1.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 93)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  ============================
  forall ρ : work,
  ρ <= job_cost j ->
  ρ \notin job_preemption_points j ->
  exists n : nat,
    n.+1 < size (job_preemption_points j) /\
    nth 0 (job_preemption_points j) n < ρ <
    nth 0 (job_preemption_points j) n.+1

----------------------------------------------------------------------------- *)


    Proof.
      intros ρ LE NotIN.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 96)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  ρ : work
  LE : ρ <= job_cost j
  NotIN : ρ \notin job_preemption_points j
  ============================
  exists n : nat,
    n.+1 < size (job_preemption_points j) /\
    nth 0 (job_preemption_points j) n < ρ <
    nth 0 (job_preemption_points j) n.+1

----------------------------------------------------------------------------- *)


      case: (posnP (job_cost j)) ⇒ [ZERO|POS].

(* ----------------------------------[ coqtop ]---------------------------------

2 subgoals (ID 119)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  ρ : work
  LE : ρ <= job_cost j
  NotIN : ρ \notin job_preemption_points j
  ZERO : job_cost j = 0
  ============================
  exists n : nat,
    n.+1 < size (job_preemption_points j) /\
    nth 0 (job_preemption_points j) n < ρ <
    nth 0 (job_preemption_points j) n.+1

subgoal 2 (ID 120) is:
 exists n : nat,
   n.+1 < size (job_preemption_points j) /\
   nth 0 (job_preemption_points j) n < ρ <
   nth 0 (job_preemption_points j) n.+1

----------------------------------------------------------------------------- *)


      {
(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 119)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  ρ : work
  LE : ρ <= job_cost j
  NotIN : ρ \notin job_preemption_points j
  ZERO : job_cost j = 0
  ============================
  exists n : nat,
    n.+1 < size (job_preemption_points j) /\
    nth 0 (job_preemption_points j) n < ρ <
    nth 0 (job_preemption_points j) n.+1

----------------------------------------------------------------------------- *)


exfalso; move: NotIN ⇒ /negP NIN; apply: NIN.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 154)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  ρ : work
  LE : ρ <= job_cost j
  ZERO : job_cost j = 0
  ============================
  ρ \in job_preemption_points j

----------------------------------------------------------------------------- *)


        move: LE.
(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 156)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  ρ : work
  ZERO : job_cost j = 0
  ============================
  ρ <= job_cost j -> ρ \in job_preemption_points j

----------------------------------------------------------------------------- *)


rewrite ZERO leqn0; move ⇒ /eqP →.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 197)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  ρ : work
  ZERO : job_cost j = 0
  ============================
  0 \in job_preemption_points j

----------------------------------------------------------------------------- *)


          by apply zero_in_preemption_points.
(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal

subgoal 1 (ID 120) is:
 exists n : nat,
   n.+1 < size (job_preemption_points j) /\
   nth 0 (job_preemption_points j) n < ρ <
   nth 0 (job_preemption_points j) n.+1

----------------------------------------------------------------------------- *)


}

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 120)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  ρ : work
  LE : ρ <= job_cost j
  NotIN : ρ \notin job_preemption_points j
  POS : 0 < job_cost j
  ============================
  exists n : nat,
    n.+1 < size (job_preemption_points j) /\
    nth 0 (job_preemption_points j) n < ρ <
    nth 0 (job_preemption_points j) n.+1

----------------------------------------------------------------------------- *)


      move: (belonging_to_segment_of_seq_is_total
               (job_preemption_points j) ρ (number_of_preemption_points_at_least_two POS)
               (antidensity_of_preemption_points _ LE NotIN)) ⇒ [n [SIZE2 /andP [N1 N2]]].

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 261)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  ρ : work
  LE : ρ <= job_cost j
  NotIN : ρ \notin job_preemption_points j
  POS : 0 < job_cost j
  n : nat
  SIZE2 : n.+1 < size (job_preemption_points j)
  N1 : nth 0 (job_preemption_points j) n <= ρ
  N2 : ρ < nth 0 (job_preemption_points j) n.+1
  ============================
  exists n0 : nat,
    n0.+1 < size (job_preemption_points j) /\
    nth 0 (job_preemption_points j) n0 < ρ <
    nth 0 (job_preemption_points j) n0.+1

----------------------------------------------------------------------------- *)


       n; split; first by done.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 266)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  ρ : work
  LE : ρ <= job_cost j
  NotIN : ρ \notin job_preemption_points j
  POS : 0 < job_cost j
  n : nat
  SIZE2 : n.+1 < size (job_preemption_points j)
  N1 : nth 0 (job_preemption_points j) n <= ρ
  N2 : ρ < nth 0 (job_preemption_points j) n.+1
  ============================
  nth 0 (job_preemption_points j) n < ρ <
  nth 0 (job_preemption_points j) n.+1

----------------------------------------------------------------------------- *)


      apply/andP; split; last by done.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 292)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  ρ : work
  LE : ρ <= job_cost j
  NotIN : ρ \notin job_preemption_points j
  POS : 0 < job_cost j
  n : nat
  SIZE2 : n.+1 < size (job_preemption_points j)
  N1 : nth 0 (job_preemption_points j) n <= ρ
  N2 : ρ < nth 0 (job_preemption_points j) n.+1
  ============================
  nth 0 (job_preemption_points j) n < ρ

----------------------------------------------------------------------------- *)


      move: N1; rewrite leq_eqVlt; move ⇒ /orP [/eqP EQ | G]; last by done.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 372)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  ρ : work
  LE : ρ <= job_cost j
  NotIN : ρ \notin job_preemption_points j
  POS : 0 < job_cost j
  n : nat
  SIZE2 : n.+1 < size (job_preemption_points j)
  N2 : ρ < nth 0 (job_preemption_points j) n.+1
  EQ : nth 0 (job_preemption_points j) n = ρ
  ============================
  nth 0 (job_preemption_points j) n < ρ

----------------------------------------------------------------------------- *)


      exfalso.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 374)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  ρ : work
  LE : ρ <= job_cost j
  NotIN : ρ \notin job_preemption_points j
  POS : 0 < job_cost j
  n : nat
  SIZE2 : n.+1 < size (job_preemption_points j)
  N2 : ρ < nth 0 (job_preemption_points j) n.+1
  EQ : nth 0 (job_preemption_points j) n = ρ
  ============================
  False

----------------------------------------------------------------------------- *)


      move: NotIN ⇒ /negP CONTR; apply: CONTR.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 407)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  ρ : work
  LE : ρ <= job_cost j
  POS : 0 < job_cost j
  n : nat
  SIZE2 : n.+1 < size (job_preemption_points j)
  N2 : ρ < nth 0 (job_preemption_points j) n.+1
  EQ : nth 0 (job_preemption_points j) n = ρ
  ============================
  ρ \in job_preemption_points j

----------------------------------------------------------------------------- *)


      rewrite -EQ; clear EQ.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 410)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  ρ : work
  LE : ρ <= job_cost j
  POS : 0 < job_cost j
  n : nat
  SIZE2 : n.+1 < size (job_preemption_points j)
  N2 : ρ < nth 0 (job_preemption_points j) n.+1
  ============================
  nth 0 (job_preemption_points j) n \in job_preemption_points j

----------------------------------------------------------------------------- *)


      rewrite mem_nth //.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 418)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  ρ : work
  LE : ρ <= job_cost j
  POS : 0 < job_cost j
  n : nat
  SIZE2 : n.+1 < size (job_preemption_points j)
  N2 : ρ < nth 0 (job_preemption_points j) n.+1
  ============================
  n < size (job_preemption_points j)

----------------------------------------------------------------------------- *)


        by apply ltnW.
(* ----------------------------------[ coqtop ]---------------------------------

No more subgoals.

----------------------------------------------------------------------------- *)


    Qed.

Recall that file [job.parameters] also defines notion of preemption points. And note that [job.parameter.job_preemption_points] cannot have a duplicating preemption points. Therefore, we need additional lemmas to relate [job.parameter.job_preemption_points] and [limited.job_preemption_points]].
First we show that the length of the last non-preemptive segment of [job.parameter.job_preemption_points] is equal to the length of the last non-empty non-preemptive segment of [limited.job_preemption_points].
    Lemma job_parameters_last_np_to_job_limited:
        last0 (distances (parameter.job_preemption_points j)) =
        last0 (filter (fun x ⇒ 0 < x) (distances (job_preemption_points j))).

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 103)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  ============================
  last0 (distances (parameter.job_preemption_points j)) =
  last0 [seq x <- distances (job_preemption_points j) | 0 < x]

----------------------------------------------------------------------------- *)


    Proof.
      destruct H_valid_limited_preemptions_job_model as [A1 [A2 A3]].

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 113)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  A1 : beginning_of_execution_in_preemption_points arr_seq
  A2 : end_of_execution_in_preemption_points arr_seq
  A3 : preemption_points_is_nondecreasing_sequence arr_seq
  ============================
  last0 (distances (parameter.job_preemption_points j)) =
  last0 [seq x <- distances (job_preemption_points j) | 0 < x]

----------------------------------------------------------------------------- *)


      unfold parameter.job_preemption_points, job_preemptable, limited_preemptions_model.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 114)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  A1 : beginning_of_execution_in_preemption_points arr_seq
  A2 : end_of_execution_in_preemption_points arr_seq
  A3 : preemption_points_is_nondecreasing_sequence arr_seq
  ============================
  last0
    (distances
       [seq ρ <- range 0 (job_cost j) | ρ \in job_preemption_points j]) =
  last0 [seq x <- distances (job_preemption_points j) | 0 < x]

----------------------------------------------------------------------------- *)


      intros; rewrite distances_iota_filtered; eauto.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 121)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  A1 : beginning_of_execution_in_preemption_points arr_seq
  A2 : end_of_execution_in_preemption_points arr_seq
  A3 : preemption_points_is_nondecreasing_sequence arr_seq
  ============================
  forall x : nat, x \in job_preemption_points j -> x <= job_cost j

----------------------------------------------------------------------------- *)


      rewrite -A2 //.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 5166)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  A1 : beginning_of_execution_in_preemption_points arr_seq
  A2 : end_of_execution_in_preemption_points arr_seq
  A3 : preemption_points_is_nondecreasing_sequence arr_seq
  ============================
  forall x : nat,
  x \in job_preemption_points j -> x <= last0 (job_preemption_points j)

----------------------------------------------------------------------------- *)


        by intros; apply last_is_max_in_nondecreasing_seq; eauto 2.

(* ----------------------------------[ coqtop ]---------------------------------

No more subgoals.

----------------------------------------------------------------------------- *)


    Qed.

Next we show that the length of the max non-preemptive segment of [job.parameter.job_preemption_points] is equal to the length of the max non-preemptive segment of [limited.job_preemption_points].
    Lemma job_parameters_max_np_to_job_limited:
      max0 (distances (parameter.job_preemption_points j)) =
      max0 (distances (job_preemption_points j)).

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 111)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  ============================
  max0 (distances (parameter.job_preemption_points j)) =
  max0 (distances (job_preemption_points j))

----------------------------------------------------------------------------- *)


    Proof.
      destruct H_valid_limited_preemptions_job_model as [A1 [A2 A3]].

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 121)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  A1 : beginning_of_execution_in_preemption_points arr_seq
  A2 : end_of_execution_in_preemption_points arr_seq
  A3 : preemption_points_is_nondecreasing_sequence arr_seq
  ============================
  max0 (distances (parameter.job_preemption_points j)) =
  max0 (distances (job_preemption_points j))

----------------------------------------------------------------------------- *)


      unfold parameter.job_preemption_points, job_preemptable, limited_preemptions_model.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 122)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  A1 : beginning_of_execution_in_preemption_points arr_seq
  A2 : end_of_execution_in_preemption_points arr_seq
  A3 : preemption_points_is_nondecreasing_sequence arr_seq
  ============================
  max0
    (distances
       [seq ρ <- range 0 (job_cost j) | ρ \in job_preemption_points j]) =
  max0 (distances (job_preemption_points j))

----------------------------------------------------------------------------- *)


      intros; rewrite distances_iota_filtered; eauto 2.

(* ----------------------------------[ coqtop ]---------------------------------

2 subgoals (ID 128)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  A1 : beginning_of_execution_in_preemption_points arr_seq
  A2 : end_of_execution_in_preemption_points arr_seq
  A3 : preemption_points_is_nondecreasing_sequence arr_seq
  ============================
  max0 [seq x <- distances (job_preemption_points j) | 0 < x] =
  max0 (distances (job_preemption_points j))

subgoal 2 (ID 129) is:
 forall x : nat, x \in job_preemption_points j -> x <= job_cost j

----------------------------------------------------------------------------- *)


      rewrite max0_rem0 //.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 129)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  A1 : beginning_of_execution_in_preemption_points arr_seq
  A2 : end_of_execution_in_preemption_points arr_seq
  A3 : preemption_points_is_nondecreasing_sequence arr_seq
  ============================
  forall x : nat, x \in job_preemption_points j -> x <= job_cost j

----------------------------------------------------------------------------- *)


      rewrite -A2 //.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 168)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  H_j_arrives : arrives_in arr_seq j
  A1 : beginning_of_execution_in_preemption_points arr_seq
  A2 : end_of_execution_in_preemption_points arr_seq
  A3 : preemption_points_is_nondecreasing_sequence arr_seq
  ============================
  forall x : nat,
  x \in job_preemption_points j -> x <= last0 (job_preemption_points j)

----------------------------------------------------------------------------- *)


        by intros; apply last_is_max_in_nondecreasing_seq; eauto 2.
(* ----------------------------------[ coqtop ]---------------------------------

No more subgoals.

----------------------------------------------------------------------------- *)



    Qed.

  End AuxiliaryLemmas.

We prove that the [fixed_preemption_point_model] function defines a valid preemption model.
  Lemma valid_fixed_preemption_points_model_lemma:
    valid_preemption_model arr_seq sched.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 36)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  ============================
  valid_preemption_model arr_seq sched

----------------------------------------------------------------------------- *)


  Proof.
    intros j ARR; repeat split.
(* ----------------------------------[ coqtop ]---------------------------------

4 subgoals (ID 41)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  ARR : arrives_in arr_seq j
  ============================
  job_cannot_become_nonpreemptive_before_execution j

subgoal 2 (ID 45) is:
 job_cannot_be_nonpreemptive_after_completion j
subgoal 3 (ID 49) is:
 not_preemptive_implies_scheduled sched j
subgoal 4 (ID 50) is:
 execution_starts_with_preemption_point sched j

----------------------------------------------------------------------------- *)


    {
(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 41)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  ARR : arrives_in arr_seq j
  ============================
  job_cannot_become_nonpreemptive_before_execution j

----------------------------------------------------------------------------- *)


by apply zero_in_preemption_points.
(* ----------------------------------[ coqtop ]---------------------------------

3 subgoals

subgoal 1 (ID 45) is:
 job_cannot_be_nonpreemptive_after_completion j
subgoal 2 (ID 49) is:
 not_preemptive_implies_scheduled sched j
subgoal 3 (ID 50) is:
 execution_starts_with_preemption_point sched j

----------------------------------------------------------------------------- *)


}

(* ----------------------------------[ coqtop ]---------------------------------

3 subgoals (ID 45)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  ARR : arrives_in arr_seq j
  ============================
  job_cannot_be_nonpreemptive_after_completion j

subgoal 2 (ID 49) is:
 not_preemptive_implies_scheduled sched j
subgoal 3 (ID 50) is:
 execution_starts_with_preemption_point sched j

----------------------------------------------------------------------------- *)


    {
(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 45)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  ARR : arrives_in arr_seq j
  ============================
  job_cannot_be_nonpreemptive_after_completion j

----------------------------------------------------------------------------- *)


by apply job_cost_in_nonpreemptive_points.
(* ----------------------------------[ coqtop ]---------------------------------

2 subgoals

subgoal 1 (ID 49) is:
 not_preemptive_implies_scheduled sched j
subgoal 2 (ID 50) is:
 execution_starts_with_preemption_point sched j

----------------------------------------------------------------------------- *)


}

(* ----------------------------------[ coqtop ]---------------------------------

2 subgoals (ID 49)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  ARR : arrives_in arr_seq j
  ============================
  not_preemptive_implies_scheduled sched j

subgoal 2 (ID 50) is:
 execution_starts_with_preemption_point sched j

----------------------------------------------------------------------------- *)


    {
(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 49)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  ARR : arrives_in arr_seq j
  ============================
  not_preemptive_implies_scheduled sched j

----------------------------------------------------------------------------- *)


by movet NPP; apply H_schedule_respects_preemption_model.
(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal

subgoal 1 (ID 50) is:
 execution_starts_with_preemption_point sched j

----------------------------------------------------------------------------- *)


}

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 50)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  ARR : arrives_in arr_seq j
  ============================
  execution_starts_with_preemption_point sched j

----------------------------------------------------------------------------- *)


    {
(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 50)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  ARR : arrives_in arr_seq j
  ============================
  execution_starts_with_preemption_point sched j

----------------------------------------------------------------------------- *)


intros t NSCHED SCHED.
(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 68)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  ARR : arrives_in arr_seq j
  t : instant
  NSCHED : ~~ scheduled_at sched j t
  SCHED : scheduled_at sched j t.+1
  ============================
  job_preemptable j (service sched j t.+1)

----------------------------------------------------------------------------- *)


      have SERV: service sched j t = service sched j t.+1.

(* ----------------------------------[ coqtop ]---------------------------------

2 subgoals (ID 76)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  ARR : arrives_in arr_seq j
  t : instant
  NSCHED : ~~ scheduled_at sched j t
  SCHED : scheduled_at sched j t.+1
  ============================
  service sched j t = service sched j t.+1

subgoal 2 (ID 78) is:
 job_preemptable j (service sched j t.+1)

----------------------------------------------------------------------------- *)


      {
(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 76)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  ARR : arrives_in arr_seq j
  t : instant
  NSCHED : ~~ scheduled_at sched j t
  SCHED : scheduled_at sched j t.+1
  ============================
  service sched j t = service sched j t.+1

----------------------------------------------------------------------------- *)


rewrite -[service sched j t]addn0 /service /service_during; apply/eqP.
(* ----------------------------------[ coqtop ]---------------------------------

1 focused subgoal
(shelved: 1) (ID 155)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  ARR : arrives_in arr_seq j
  t : instant
  NSCHED : ~~ scheduled_at sched j t
  SCHED : scheduled_at sched j t.+1
  ============================
  \sum_(0 <= t0 < t) service_at sched j t0 + 0 ==
  \sum_(0 <= t0 < t.+1) service_at sched j t0

----------------------------------------------------------------------------- *)


        rewrite big_nat_recr //=.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 166)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  ARR : arrives_in arr_seq j
  t : instant
  NSCHED : ~~ scheduled_at sched j t
  SCHED : scheduled_at sched j t.+1
  ============================
  \sum_(0 <= t0 < t) (sched t0 == Some j) + 0 ==
  \sum_(0 <= i < t) (sched i == Some j) + (sched t == Some j)

----------------------------------------------------------------------------- *)


        rewrite eqn_add2l eq_sym.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 198)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  ARR : arrives_in arr_seq j
  t : instant
  NSCHED : ~~ scheduled_at sched j t
  SCHED : scheduled_at sched j t.+1
  ============================
  (sched t == Some j) == 0

----------------------------------------------------------------------------- *)


        rewrite scheduled_at_def in NSCHED.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 229)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  ARR : arrives_in arr_seq j
  t : instant
  SCHED : scheduled_at sched j t.+1
  NSCHED : sched t != Some j
  ============================
  (sched t == Some j) == 0

----------------------------------------------------------------------------- *)


          by rewrite eqb0.
(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal

subgoal 1 (ID 78) is:
 job_preemptable j (service sched j t.+1)

----------------------------------------------------------------------------- *)


}

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 78)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  ARR : arrives_in arr_seq j
  t : instant
  NSCHED : ~~ scheduled_at sched j t
  SCHED : scheduled_at sched j t.+1
  SERV : service sched j t = service sched j t.+1
  ============================
  job_preemptable j (service sched j t.+1)

----------------------------------------------------------------------------- *)


      rewrite -[job_preemptable _ _]Bool.negb_involutive.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 239)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  ARR : arrives_in arr_seq j
  t : instant
  NSCHED : ~~ scheduled_at sched j t
  SCHED : scheduled_at sched j t.+1
  SERV : service sched j t = service sched j t.+1
  ============================
  ~~ ~~ job_preemptable j (service sched j t.+1)

----------------------------------------------------------------------------- *)


      apply/negP; intros CONTR.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 261)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  ARR : arrives_in arr_seq j
  t : instant
  NSCHED : ~~ scheduled_at sched j t
  SCHED : scheduled_at sched j t.+1
  SERV : service sched j t = service sched j t.+1
  CONTR : ~~ job_preemptable j (service sched j t.+1)
  ============================
  False

----------------------------------------------------------------------------- *)


      move: NSCHED ⇒ /negP NSCHED; apply: NSCHED.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 294)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  ARR : arrives_in arr_seq j
  t : instant
  SCHED : scheduled_at sched j t.+1
  SERV : service sched j t = service sched j t.+1
  CONTR : ~~ job_preemptable j (service sched j t.+1)
  ============================
  scheduled_at sched j t

----------------------------------------------------------------------------- *)


      apply H_schedule_respects_preemption_model; first by done.

(* ----------------------------------[ coqtop ]---------------------------------

1 subgoal (ID 296)
  
  Task : TaskType
  H : TaskCost Task
  Job : JobType
  H0 : JobTask Job Task
  H1 : JobArrival Job
  H2 : JobCost Job
  H3 : JobPreemptionPoints Job
  arr_seq : arrival_sequence Job
  sched : schedule (ideal.processor_state Job)
  H_schedule_respects_preemption_model : schedule_respects_preemption_model
                                           arr_seq sched
  H_completed_jobs_dont_execute : completed_jobs_dont_execute sched
  H_valid_limited_preemptions_job_model : valid_limited_preemptions_job_model
                                            arr_seq
  j : Job
  ARR : arrives_in arr_seq j
  t : instant
  SCHED : scheduled_at sched j t.+1
  SERV : service sched j t = service sched j t.+1
  CONTR : ~~ job_preemptable j (service sched j t.+1)
  ============================
  ~~ job_preemptable j (service sched j t)

----------------------------------------------------------------------------- *)


        by rewrite SERV.

(* ----------------------------------[ coqtop ]---------------------------------

No more subgoals.

----------------------------------------------------------------------------- *)


    }
(* ----------------------------------[ coqtop ]---------------------------------

No more subgoals.

----------------------------------------------------------------------------- *)


           
  Qed.

End ModelWithLimitedPreemptions.
Global Hint Resolve valid_fixed_preemption_points_model_lemma : basic_facts.