diff --git a/analysis/uni/susp/dynamic/jitter/rta_by_reduction.v b/analysis/uni/susp/dynamic/jitter/rta_by_reduction.v
index 21ebe100fbd9c29fdbb25ebe0a58c52e0b5fc94c..aadfaeda9ee6ae7c029669a7a7e5b190e18f8f20 100644
--- a/analysis/uni/susp/dynamic/jitter/rta_by_reduction.v
+++ b/analysis/uni/susp/dynamic/jitter/rta_by_reduction.v
@@ -188,8 +188,8 @@ Module RTAByReduction.
       {
         intros j_hp ARRhp OTHERhp.
         rewrite /actual_response_time.
-        apply pick_min_holds; last by intros r RESP _.
-        exists (Ordinal (ltnSn (R (job_task j_hp)))).
+        apply pick_min_holds; last by intros r _ RESP _.
+        exists (R (job_task j_hp)); split; first by done.
         by apply RESPhp; try (by done); [by apply FROM | rewrite /other_hep_task -H_job_of_tsk].
       }
       {
diff --git a/analysis/uni/susp/dynamic/jitter/taskset_membership.v b/analysis/uni/susp/dynamic/jitter/taskset_membership.v
index 40a2fb460d92665524c81dd5147bab3600381121..f16e79e95927c739d252ebdf4c605b03cab0fa5d 100644
--- a/analysis/uni/susp/dynamic/jitter/taskset_membership.v
+++ b/analysis/uni/susp/dynamic/jitter/taskset_membership.v
@@ -133,7 +133,7 @@ Module TaskSetMembership.
       intros j_hp ARRhp HP.
       rewrite /actual_response_time.
       apply pick_min_holds; last by done.
-      exists (Ordinal (ltnSn (R (job_task j_hp)))). simpl.
+      exists (R (job_task j_hp)); split; first by done.
       by apply RESPhp; try (by done); first by apply FROM.
     Qed.
 
@@ -153,14 +153,14 @@ Module TaskSetMembership.
         rewrite /actual_response_time.
         apply pick_min_holds;
           last by intros x RESPx _ MINx; rewrite -ltnS in LT; apply (MINx (Ordinal LT)).
-        exists (Ordinal (ltnSn (R (job_task j_hp)))).
+        exists (R (job_task j_hp)); split; first by done.
         by apply RESPhp; try (by done); first by apply FROM.
       }
       {
         apply leq_trans with (n := (R (job_task j_hp))); last by apply ltnW. 
         rewrite -ltnS /actual_response_time.
         apply pick_min_ltn.
-        exists (Ordinal (ltnSn (R (job_task j_hp)))). simpl.
+        exists (R (job_task j_hp)); split; first by done.
         by apply RESPhp; try (by done); first by apply FROM.
       }
     Qed.
diff --git a/util/pick.v b/util/pick.v
index 3cc3a0929681483d452087a3b431809df3c7c141..dea4dcce3b4e945ee0faaf136e4f45fe8a166751 100644
--- a/util/pick.v
+++ b/util/pick.v
@@ -11,17 +11,18 @@ Definition arg_pred_nat n (P: pred 'I_n) ord :=
 
 Definition pred_min_nat n (P: pred 'I_n) := arg_pred_nat n P leq.
 Definition pred_max_nat n (P: pred 'I_n) := arg_pred_nat n P (fun x y => geq x y).
+Definition to_pred_ord n (P: pred nat) := (fun x:'I_n => P (nat_of_ord x)).
 
 (** Defining Pick functions *)
 
 (* (pick_any n P) returns some number < n that satisfies P, or 0 if it cannot be found. *)
-Definition pick_any n (P: pred 'I_n) := default0 (pick P).
+Definition pick_any n (P: pred nat) := default0 (pick (to_pred_ord n P)).
 
 (* (pick_min n P) returns the smallest number < n that satisfies P, or 0 if it cannot be found. *)
-Definition pick_min n (P: pred 'I_n) := default0 (pick (pred_min_nat n P)).
+Definition pick_min n (P: pred nat) := default0 (pick (pred_min_nat n (to_pred_ord n P))).
 
 (* (pick_max n P) returns the largest number < n that satisfies P, or 0 if it cannot be found. *)
-Definition pick_max n (P: pred 'I_n) := default0 (pick (pred_max_nat n P)).
+Definition pick_max n (P: pred nat) := default0 (pick (pred_max_nat n (to_pred_ord n P))).
 
 (** Improved notation *)
 
@@ -30,27 +31,27 @@ Definition pick_max n (P: pred 'I_n) := default0 (pick (pred_max_nat n P)).
      [pick-min x <= N | P], [pick-min x < N | P]
      [pick-max x <= N | P], [pick-max x < N | P]. *)
 Notation "[ 'pick-any' x <= N | P ]" :=
-  (pick_any N.+1 (fun x : 'I_N.+1 => P%B))
+  (pick_any N.+1 (fun x : nat => P%B))
   (at level 0, x ident, only parsing) : form_scope.
     
 Notation "[ 'pick-any' x < N | P ]" :=
-  (pick_any N (fun x : 'I_N => P%B))
+  (pick_any N (fun x : nat => P%B))
   (at level 0, x ident, only parsing) : form_scope.
 
 Notation "[ 'pick-min' x <= N | P ]" :=
-  (pick_min N.+1 (fun x : 'I_N.+1 => P%B))
+  (pick_min N.+1 (fun x : nat => P%B))
   (at level 0, x ident, only parsing) : form_scope.
 
 Notation "[ 'pick-min' x < N | P ]" :=
-  (pick_min N (fun x : 'I_N => P%B))
+  (pick_min N (fun x : nat => P%B))
   (at level 0, x ident, only parsing) : form_scope.
 
 Notation "[ 'pick-max' x <= N | P ]" :=
-  (pick_max N.+1 (fun x : 'I_N.+1 => P%B))
+  (pick_max N.+1 (fun x : nat => P%B))
   (at level 0, x ident, only parsing) : form_scope.
 
 Notation "[ 'pick-max' x < N | P ]" :=
-  (pick_max N (fun x : 'I_N => P%B))
+  (pick_max N (fun x : nat => P%B))
   (at level 0, x ident, only parsing) : form_scope.
 
 (** Lemmas about pick_any *)
@@ -58,11 +59,11 @@ Notation "[ 'pick-max' x < N | P ]" :=
 Section PickAny.
 
   Variable n: nat.
-  Variable p: pred 'I_n.
+  Variable p: pred nat.
 
   Variable P: nat -> Prop.
 
-  Hypothesis EX: exists x:'I_n, p x.
+  Hypothesis EX: exists x, x < n /\ p x.
 
   Hypothesis HOLDS: forall x, p x -> P x.
 
@@ -73,8 +74,8 @@ Section PickAny.
     rewrite /pick_any /default0.
     case: pickP; first by intros x PRED; apply HOLDS.
     intros NONE; red in NONE; exfalso.
-    move: EX => [x PRED].
-    by specialize (NONE x); rewrite PRED in NONE.
+    move: EX => [x [LTN PRED]].
+    by specialize (NONE (Ordinal LTN)); rewrite /to_pred_ord /= PRED in NONE.
   Qed.
 
 End PickAny.
@@ -83,12 +84,12 @@ End PickAny.
 Section PickMin.
 
   Variable n: nat.
-  Variable p: pred 'I_n.
+  Variable p: pred nat.
 
   Variable P: nat -> Prop.
 
   (* Assume that there is some number < n that satisfies p. *)
-  Hypothesis EX: exists x:'I_n, p x.
+  Hypothesis EX: exists x, x < n /\ p x.
 
   Section Bound.
 
@@ -99,12 +100,12 @@ Section PickMin.
       case: pickP.
       {
         move => x /andP [PRED /forallP ALL].
-          by rewrite /default0.
+        by rewrite /default0.
       }
       {
         intros NONE; red in NONE; exfalso.
-        move: EX => [x PRED]; clear EX.
-        set argmin := arg_min x p id.
+        move: EX => [x [LT PRED]]; clear EX.
+        set argmin := arg_min (Ordinal LT) p id.
         specialize (NONE argmin).
         suff ARGMIN: (pred_min_nat n p) argmin by rewrite ARGMIN in NONE.
         rewrite /argmin; case: arg_minP; first by done.
@@ -120,9 +121,9 @@ Section PickMin.
     
     Hypothesis MIN:
       forall x,
-        p x ->
         x < n ->
-        (forall y, p y -> x <= y) ->
+        p x ->
+        (forall y, y < n -> p y -> x <= y) ->
         P x.
     
     (* Next, we show that any property P of (pick_min n p) can be proven by showing
@@ -133,70 +134,71 @@ Section PickMin.
       case: pickP.
       {
         move => x /andP [PRED /forallP ALL].
-        apply MIN; try (by done).
-          by intros y Py; specialize (ALL y); move: ALL => /implyP ALL; apply ALL.
+        apply MIN; [by rewrite /default0 | by done |].
+        intros y LTy Py; specialize (ALL (Ordinal LTy)).
+        by move: ALL => /implyP ALL; apply ALL.
       }
       {
         intros NONE; red in NONE; exfalso.
-        move: EX => [x PRED]; clear EX.
-        set argmin := arg_min x p id.
+        move: EX => [x [LT PRED]]; clear EX.
+        set argmin := arg_min (Ordinal LT) p id.
         specialize (NONE argmin).
         suff ARGMIN: (pred_min_nat n p) argmin by rewrite ARGMIN in NONE.
         rewrite /argmin; case: arg_minP; first by done.
         intros y Py MINy.
         apply/andP; split; first by done.
-          by apply/forallP; intros y0; apply/implyP; intros Py0; apply MINy.
+        by apply/forallP; intros y0; apply/implyP; intros Py0; apply MINy.
       }
     Qed.
 
   End Minimum.
-  
+
 End PickMin.
 
 (** Lemmas about pick_max *)
 Section PickMax.
 
   Variable n: nat.
-  Variable p: pred 'I_n.
+  Variable p: pred nat.
 
   Variable P: nat -> Prop.
 
   (* Assume that there is some number < n that satisfies p. *)
-  Hypothesis EX: exists x:'I_n, p x.
+  Hypothesis EX: exists x, x < n /\ p x.
 
   Section Bound.
     
-    (* First, we show that (pick_max n p) < n. *)
+    (* First, we show that (pick_max n p) < n... *)
     Lemma pick_max_ltn: pick_max n p < n.
     Proof.
       rewrite /pick_max /odflt /oapp.
       case: pickP.
       {
         move => x /andP [PRED /forallP ALL].
-          by rewrite /default0.
+        by rewrite /default0.
       }
       {
         intros NONE; red in NONE; exfalso.
-        move: EX => [x PRED]; clear EX.
-        set argmax := arg_max x p id.
+        move: EX => [x [LT PRED]]; clear EX.
+        set argmax := arg_max (Ordinal LT) p id.
         specialize (NONE argmax).
         suff ARGMAX: (pred_max_nat n p) argmax by rewrite ARGMAX in NONE.
         rewrite /argmax; case: arg_maxP; first by done.
         intros y Py MAXy.
         apply/andP; split; first by done.
-          by apply/forallP; intros y0; apply/implyP; intros Py0; apply MAXy.
+        by apply/forallP; intros y0; apply/implyP; intros Py0; apply MAXy.
       }
     Qed.
 
   End Bound.
-
+  
   Section Maximum.
     
     Hypothesis MAX:
       forall x,
-        p x ->
         x < n ->
-        (forall y, p y -> x >= y) ->
+        p x ->
+        (forall y, y < n -> p y -> x >= y) ->
         P x.
     
     (* Next, we show that any property P of (pick_max n p) can be proven by showing that
@@ -207,22 +209,83 @@ Section PickMax.
       case: pickP.
       {
         move => x /andP [PRED /forallP ALL].
-        apply MAX; try (by done).
-          by intros y Py; specialize (ALL y); move: ALL => /implyP ALL; apply ALL.
+        apply MAX; [by rewrite /default0 | by rewrite /default0 |].
+        intros y LTy Py; specialize (ALL (Ordinal LTy)).
+        by move: ALL => /implyP ALL; apply ALL.
       }
       {
         intros NONE; red in NONE; exfalso.
-        move: EX => [x PRED]; clear EX.
-        set argmax := arg_max x p id.
+        move: EX => [x [LT PRED]]; clear EX.
+        set argmax := arg_max (Ordinal LT) p id.
         specialize (NONE argmax).
         suff ARGMAX: (pred_max_nat n p) argmax by rewrite ARGMAX in NONE.
         rewrite /argmax; case: arg_maxP; first by done.
         intros y Py MAXy.
         apply/andP; split; first by done.
-          by apply/forallP; intros y0; apply/implyP; intros Py0; apply MAXy.
+        by apply/forallP; intros y0; apply/implyP; intros Py0; apply MAXy.
       }
     Qed.
 
   End Maximum.
+
+End PickMax.
+
+Section Predicate.
+
+  Variable n: nat.
+  Variable p: pred nat.
+
+  Hypothesis EX: exists x, x < n /\ p x.
+
+  (* Here we prove that pick_any satiesfies the predicate p, ... *)
+  Lemma pick_any_pred: p (pick_any n p).
+  Proof.
+    by apply pick_any_holds.
+  Qed.
+
+  (* ...and the same holds for pick_min... *)
+  Lemma pick_min_pred: p (pick_min n p).
+  Proof.
+    by apply pick_min_holds.
+  Qed.
+
+  (* ...and pick_max. *)
+  Lemma pick_max_pred: p (pick_max n p).
+  Proof.
+    by apply pick_max_holds.
+  Qed.
+
+End Predicate.
+
+Section PickMinCompare.
+
+  Variable n: nat.
+  Variable p1 p2: pred nat.
+
+  Hypothesis EX1 : exists x, x < n /\ p1 x.
+  Hypothesis EX2 : exists x, x < n /\ p2 x.
+
+  Hypothesis OUT:
+    forall x y, x < n -> y < n -> p1 x -> p2 y -> ~~ p1 y -> x <= y. 
+  
+  Lemma pick_min_compare: pick_min n p1 <= pick_min n p2.
+  Proof.
+    set m1:= pick_min _ _.
+    set m2:= pick_min _ _.
+    case IN: (p1 m2).
+    {
+      apply pick_min_holds; first by done.
+      intros x Px LTN ALL.
+      by apply ALL; first by apply pick_min_ltn.
+    }
+    {
+      apply (OUT m1 m2).
+      - by apply pick_min_ltn.
+      - by apply pick_min_ltn.
+      - by apply pick_min_pred.
+      - by apply pick_min_pred.
+      - by apply negbT.
+    }
+  Qed.
   
-End PickMax.
\ No newline at end of file
+End PickMinCompare.
\ No newline at end of file