Skip to content
Snippets Groups Projects
Commit 9884f13e authored by Felipe Cerqueira's avatar Felipe Cerqueira
Browse files

Add lemmas about pick and make it easier to use

parent 258edf49
No related branches found
No related tags found
No related merge requests found
......@@ -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].
}
{
......
......@@ -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.
......
......@@ -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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment