From d5f22a4e4e12985fc1245f8e5dfed6c07f7ce60f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Brandenburg?= <bbb@mpi-sws.org>
Date: Thu, 27 Feb 2025 22:03:51 +0100
Subject: [PATCH] add definition of a job's (precise) finish time

---
 analysis/definitions/finish_time.v | 83 ++++++++++++++++++++++++++++++
 1 file changed, 83 insertions(+)
 create mode 100644 analysis/definitions/finish_time.v

diff --git a/analysis/definitions/finish_time.v b/analysis/definitions/finish_time.v
new file mode 100644
index 000000000..4cf10e0da
--- /dev/null
+++ b/analysis/definitions/finish_time.v
@@ -0,0 +1,83 @@
+Require Export prosa.behavior.service.
+
+(** * Finish Time of a Job *)
+
+(** In this file, we define a job's precise finish time.
+
+    Note that in general a job's finish time may not be defined: if a job never
+    finishes in a given schedule, it does not have a finish time. To get around
+    this, we define a job's finish time under the assumption that _some_ (not
+    necessarily tight) response-time bound [R] is known for the job.
+
+    Under this assumption, we can simply re-use ssreflect's existing [ex_minn]
+    search mechanism (for finding the minimum natural number satisfying a given
+    predicate given a witness that some natural number satisfies the predicate)
+    and benefit from the existing corresponding lemmas. This file briefly
+    illustrates how this can be done. *)
+
+Section JobFinishTime.
+
+  (** Consider any type of jobs with arrival times and costs ... *)
+  Context {Job : JobType} `{JobArrival Job} `{JobCost Job}.
+
+  (** ... and any schedule of such jobs. *)
+  Context {PState : ProcessorState Job}.
+  Variable sched : schedule PState.
+
+  (** Consider an arbitrary job [j]. *)
+  Variable j : Job.
+
+  (** In the following, we proceed under the assumption that [j] finishes
+      eventually (i.e., no later than [R] time units after its arrival, for any
+      finite [R]). *)
+  Variable R : nat.
+  Hypothesis H_response_time_bounded : job_response_time_bound sched j R.
+
+  (** For technical reasons, we restate the response-time assumption explicitly
+      as an existentially quantified variable. *)
+  #[local] Corollary job_finishes : exists t, completed_by sched j t.
+  Proof. by exists (job_arrival j + R); exact: H_response_time_bounded. Qed.
+
+  (** We are now ready for the main definition: job [j]'s finish time is the
+      earliest time [t] such that [completed_by sched j t] holds. This time can
+      be computed with ssreflect's [ex_minn] utility function, which is
+      convenient because then we can reuse the corresponding lemmas. *)
+  Definition finish_time : instant := ex_minn job_finishes.
+
+  (** In the following, we demonstrate the reuse of [ex_minn] properties by
+      establishing three natural properties of a job's finish time. *)
+
+  (** First, a job is indeed complete at its finish time. *)
+  Corollary finished_at_finish_time : completed_by sched j finish_time.
+  Proof.
+    rewrite /finish_time/ex_minn.
+    by case: find_ex_minn.
+  Qed.
+
+  (** Second, a job's finish time is the earliest time that it is complete. *)
+  Corollary earliest_finish_time :
+    forall t,
+      completed_by sched j t ->
+      finish_time <= t.
+  Proof.
+    move=> t COMP.
+    rewrite /finish_time/ex_minn.
+    by case: find_ex_minn.
+  Qed.
+
+  (** Third, Prosa's notion of [completes_at] is satisfied at the finish time. *)
+  Corollary completes_at_finish_time :
+    completes_at sched j finish_time.
+  Proof.
+    apply/andP; split; last exact: finished_at_finish_time.
+    apply/orP; case FIN: finish_time; [by right|left].
+    apply: contra_ltnN => [?|];
+      first by apply: earliest_finish_time.
+    by lia.
+  Qed.
+
+  (** Finally, we can define a job's precise response time as usual as the time
+      from its arrival until its finish time. *)
+  Definition response_time : duration := finish_time - job_arrival j.
+
+End JobFinishTime.
-- 
GitLab