Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
P
PROSA - Formally Proven Schedulability Analysis
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package Registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Service Desk
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Terms and privacy
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Lasse Blaauwbroek
PROSA - Formally Proven Schedulability Analysis
Commits
839079c7
Commit
839079c7
authored
7 years ago
by
Felipe Cerqueira
Browse files
Options
Downloads
Patches
Plain Diff
Add more lemmas about pick
parent
3a2bf991
No related branches found
Branches containing commit
No related tags found
Tags containing commit
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
util/pick.v
+127
-61
127 additions, 61 deletions
util/pick.v
with
127 additions
and
61 deletions
util/pick.v
+
127
−
61
View file @
839079c7
...
...
@@ -53,10 +53,8 @@ Notation "[ 'pick-max' x < N | P ]" :=
(
pick_max
N
(
fun
x
:
'
I_N
=>
P
%
B
))
(
at
level
0
,
x
ident
,
only
parsing
)
:
form_scope
.
(** Lemmas *)
(** Lemmas
about pick_any
*)
(* First, we show that any property P of (pick_any n p) can be proven by showing that
P holds for any number < n that satisfies p. *)
Section
PickAny
.
Variable
n
:
nat
.
...
...
@@ -68,6 +66,8 @@ Section PickAny.
Hypothesis
HOLDS
:
forall
x
,
p
x
->
P
x
.
(* First, we show that any property P of (pick_any n p) can be proven by showing
that P holds for any number < n that satisfies p. *)
Lemma
pick_any_holds
:
P
(
pick_any
n
p
)
.
Proof
.
rewrite
/
pick_any
/
default0
.
...
...
@@ -79,8 +79,7 @@ Section PickAny.
End
PickAny
.
(* Next, we show that any property P of (pick_min n p) can be proven by showing that
P holds for the smallest number < n that satisfies p. *)
(** Lemmas about pick_min *)
Section
PickMin
.
Variable
n
:
nat
.
...
...
@@ -88,40 +87,73 @@ Section PickMin.
Variable
P
:
nat
->
Prop
.
(* Assume that there is some number < n that satisfies p. *)
Hypothesis
EX
:
exists
x
:
'
I_n
,
p
x
.
Hypothesis
MIN
:
forall
x
,
p
x
->
(
forall
y
,
p
y
->
x
<=
y
)
->
P
x
.
Section
Bound
.
(* First, we show that (pick_min n p) < n. *)
Lemma
pick_min_ltn
:
pick_min
n
p
<
n
.
Proof
.
rewrite
/
pick_min
/
odflt
/
oapp
.
case
:
pickP
.
{
move
=>
x
/
andP
[
PRED
/
forallP
ALL
]
.
by
rewrite
/
default0
.
}
{
intros
NONE
;
red
in
NONE
;
exfalso
.
move
:
EX
=>
[
x
PRED
];
clear
EX
.
set
argmin
:=
arg_min
x
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
.
}
Qed
.
End
Bound
.
Section
Minimum
.
Hypothesis
MIN
:
forall
x
,
p
x
->
x
<
n
->
(
forall
y
,
p
y
->
x
<=
y
)
->
P
x
.
(* Next, we show that any property P of (pick_min n p) can be proven by showing
that P holds for the smallest number < n that satisfies p. *)
Lemma
pick_min_holds
:
P
(
pick_min
n
p
)
.
Proof
.
rewrite
/
pick_min
/
odflt
/
oapp
.
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
.
}
{
intros
NONE
;
red
in
NONE
;
exfalso
.
move
:
EX
=>
[
x
PRED
];
clear
EX
.
set
argmin
:=
arg_min
x
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
.
}
Qed
.
End
Minimum
.
Lemma
pick_min_holds
:
P
(
pick_min
n
p
)
.
Proof
.
rewrite
/
pick_min
/
odflt
/
oapp
.
case
:
pickP
.
{
move
=>
x
/
andP
[
PRED
/
forallP
ALL
]
.
apply
MIN
;
first
by
done
.
by
intros
y
Py
;
specialize
(
ALL
y
);
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
.
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
.
}
Qed
.
End
PickMin
.
(* Next, we show that any property P of (pick_max n p) can be proven by showing that
P holds for the largest number < n that satisfies p. *)
(** Lemmas about pick_max *)
Section
PickMax
.
Variable
n
:
nat
.
...
...
@@ -129,34 +161,68 @@ Section PickMax.
Variable
P
:
nat
->
Prop
.
(* Assume that there is some number < n that satisfies p. *)
Hypothesis
EX
:
exists
x
:
'
I_n
,
p
x
.
Hypothesis
MAX
:
forall
x
,
p
x
->
(
forall
y
,
p
y
->
x
>=
y
)
->
P
x
.
Section
Bound
.
(* 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
.
}
{
intros
NONE
;
red
in
NONE
;
exfalso
.
move
:
EX
=>
[
x
PRED
];
clear
EX
.
set
argmax
:=
arg_max
x
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
.
}
Qed
.
End
Bound
.
Section
Maximum
.
Hypothesis
MAX
:
forall
x
,
p
x
->
x
<
n
->
(
forall
y
,
p
y
->
x
>=
y
)
->
P
x
.
(* Next, we show that any property P of (pick_max n p) can be proven by showing that
P holds for the largest number < n that satisfies p. *)
Lemma
pick_max_holds
:
P
(
pick_max
n
p
)
.
Proof
.
rewrite
/
pick_max
/
odflt
/
oapp
.
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
.
}
{
intros
NONE
;
red
in
NONE
;
exfalso
.
move
:
EX
=>
[
x
PRED
];
clear
EX
.
set
argmax
:=
arg_max
x
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
.
}
Qed
.
End
Maximum
.
Lemma
pick_max_holds
:
P
(
pick_max
n
p
)
.
Proof
.
rewrite
/
pick_max
/
odflt
/
oapp
.
case
:
pickP
.
{
move
=>
x
/
andP
[
PRED
/
forallP
ALL
]
.
apply
MAX
;
first
by
done
.
by
intros
y
Py
;
specialize
(
ALL
y
);
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
.
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
.
}
Qed
.
End
PickMax
.
\ No newline at end of file
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment