Built with Alectryon, running Coq+SerAPI v8.20.0+0.20.0. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑Ctrl+↓ to navigate, Ctrl+🖱️ to focus. On Mac, use ⌘ instead of Ctrl.
[Loading ML file ssrmatching_plugin.cmxs (using legacy method) ... done]
[Loading ML file ssreflect_plugin.cmxs (using legacy method) ... done]
[Loading ML file ring_plugin.cmxs (using legacy method) ... done]
Serlib plugin: coq-elpi.elpi is not available: serlib support is missing.
Incremental checking for commands in this plugin will be impacted.
[Loading ML file coq-elpi.elpi ... done]
Notation"_ + _" was already used in scope nat_scope.
[notation-overridden,parsing,default]
Notation"_ - _" was already used in scope nat_scope.
[notation-overridden,parsing,default]
Notation"_ <= _" was already used in scope nat_scope.
[notation-overridden,parsing,default]
Notation"_ < _" was already used in scope nat_scope.
[notation-overridden,parsing,default]
Notation"_ >= _" was already used in scope nat_scope.
[notation-overridden,parsing,default]
Notation"_ > _" was already used in scope nat_scope.
[notation-overridden,parsing,default]
Notation"_ <= _ <= _" was already used in scope
nat_scope. [notation-overridden,parsing,default]
Notation"_ < _ <= _" was already used in scope
nat_scope. [notation-overridden,parsing,default]
Notation"_ <= _ < _" was already used in scope
nat_scope. [notation-overridden,parsing,default]
Notation"_ < _ < _" was already used in scope
nat_scope. [notation-overridden,parsing,default]
Notation"_ * _" was already used in scope nat_scope.
[notation-overridden,parsing,default]
[Loading ML file zify_plugin.cmxs (using legacy method) ... done]
[Loading ML file micromega_core_plugin.cmxs (using legacy method) ... done]
[Loading ML file micromega_plugin.cmxs (using legacy method) ... done]
[Loading ML file btauto_plugin.cmxs (using legacy method) ... done]
(** In this section, we define and prove facts about superadditivity and superadditive functions. The definition of superadditivity presented here slightly differs from the standard one ([f a + f b <= f (a + b)] for any [a] and [b]), but it is proven to be equivalent to it. *)SectionSuperadditivity.(** First, we define subadditivity as a point-wise property; i.e., [f] is subadditive at [h] if standard subadditivity holds for any pair [(a,b)] that sums to [h]. *)Definitionsuperadditive_atfh :=
forallab,
a + b = h ->
f a + f b <= f h.(** Second, we define the concept of partial subadditivity until a certain horizon [h]. This definition is useful when dealing with finite sequences. *)Definitionsuperadditive_untilfh :=
forallx,
x < h ->
superadditive_at f x.(** Finally, give a definition of subadditive function: [f] is subadditive when it is subadditive at any point [h].*)Definitionsuperadditivef :=
forallh,
superadditive_at f h.(** In this section, we show that the proposed definition of subadditivity is equivalent to the standard one. *)SectionEquivalenceWithStandardDefinition.(** First, we give a standard definition of subadditivity. *)Definitionsuperadditive_standardf :=
forallab,
f a + f b <= f (a + b).(** Then, we prove that the two definitions are implied by each other. *)
forallf : nat -> nat,
superadditive f <-> superadditive_standard f
forallf : nat -> nat,
superadditive f <-> superadditive_standard f
f: nat -> nat
superadditive f -> superadditive_standard f
f: nat -> nat
superadditive_standard f -> superadditive f
f: nat -> nat
superadditive f -> superadditive_standard f
f: nat -> nat SUPER: superadditive f a, b: nat
f a + f b <= f (a + b)
byapply SUPER.
f: nat -> nat
superadditive_standard f -> superadditive f
f: nat -> nat SUPER: superadditive_standard f h, a, b: nat AB: a + b = h
f a + f b <= f h
f: nat -> nat SUPER: superadditive_standard f h, a, b: nat AB: a + b = h
f a + f b <= f (a + b)
byapply SUPER.Qed.EndEquivalenceWithStandardDefinition.(** In the following section, we prove some useful facts about superadditivity. *)SectionFacts.(** Consider a function [f]. *)Variablef : nat -> nat.(** First, we show that if [f] is superadditive in zero, then its value in zero must also be zero. *)
f: nat -> nat
superadditive_at f 0 -> f 0 = 0
f: nat -> nat
superadditive_at f 0 -> f 0 = 0
f: nat -> nat SUPER: superadditive_at f 0
f 0 = 0
f: nat -> nat SUPER: superadditive_at f 0 n: nat Fx: f 0 = n.+1
n.+1 = 0
f: nat -> nat SUPER: f 0 + f 0 <= f 0 n: nat Fx: f 0 = n.+1
n.+1 = 0
f: nat -> nat n: nat Fx: f 0 = n.+1
~ f 0 + f 0 <= f 0
f: nat -> nat n: nat Fx: f 0 = n.+1
f 0 < f 0 + f 0
bylia.Qed.(** In this section, we show some of the properties of superadditive functions. *)SectionSuperadditiveFunctions.(** Assume that [f] is superadditive. *)Hypothesish_superadditive : superadditive f.(** First, we show that [f] must also be monotone. *)
f: nat -> nat h_superadditive: superadditive f
monotone leq f
f: nat -> nat h_superadditive: superadditive f
monotone leq f
f: nat -> nat h_superadditive: superadditive f x, y: nat LEQ: x <= y
f x <= f y
f: nat -> nat h_superadditive: superadditive f x, y: nat LEQ: x <= y
f x <= f x + f (y - x)
f: nat -> nat h_superadditive: superadditive f x, y: nat LEQ: x <= y
f x + f (y - x) <= f y
f: nat -> nat h_superadditive: superadditive f x, y: nat LEQ: x <= y
f x <= f x + f (y - x)
bylia.
f: nat -> nat h_superadditive: superadditive f x, y: nat LEQ: x <= y
f x + f (y - x) <= f y
f: nat -> nat h_superadditive: superadditive f x, y: nat LEQ: x <= y
x + (y - x) = y
bylia.Qed.(** Next, we prove that moving any factor [m] outside of the arguments of [f] leads to a smaller or equal number. *)
f: nat -> nat h_superadditive: superadditive f
forallnm : nat, m * f n <= f (m * n)
f: nat -> nat h_superadditive: superadditive f
forallnm : nat, m * f n <= f (m * n)
f: nat -> nat h_superadditive: superadditive f n, m: nat
m * f n <= f (m * n)
f: nat -> nat h_superadditive: superadditive f n, m: nat IHm: m * f n <= f (m * n)
m.+1 * f n <= f (m.+1 * n)
f: nat -> nat h_superadditive: superadditive f n, m: nat IHm: m * f n <= f (m * n)
m * f n + f n <= f (m * n + n)
f: nat -> nat h_superadditive: superadditive f n, m: nat IHm: m * f n <= f (m * n)
m * f n + f n <= f (m * n) + f n
f: nat -> nat h_superadditive: superadditive f n, m: nat IHm: m * f n <= f (m * n)
f (m * n) + f n <= f (m * n + n)
f: nat -> nat h_superadditive: superadditive f n, m: nat IHm: m * f n <= f (m * n)
m * f n + f n <= f (m * n) + f n
byrewrite leq_add2r.
f: nat -> nat h_superadditive: superadditive f n, m: nat IHm: m * f n <= f (m * n)
f (m * n) + f n <= f (m * n + n)
byapply h_superadditive.Qed.(** In the next section, we show that any superadditive function that is not the zero constant function (i.e., [f x = 0] for any [x]) is forced to grow beyond any finite limit. *)SectionNonZeroSuperadditiveFunctions.(** Assume that [f] is not the zero constant function ... *)Hypothesish_non_zero: existsn, f n > 0.(** ... then, [f] will eventually grow larger than any number. *)
f: nat -> nat h_superadditive: superadditive f h_non_zero: existsn : nat, 0 < f n
forallt : nat, existsn' : nat, t <= f n'
f: nat -> nat h_superadditive: superadditive f h_non_zero: existsn : nat, 0 < f n
forallt : nat, existsn' : nat, t <= f n'
f: nat -> nat h_superadditive: superadditive f h_non_zero: existsn : nat, 0 < f n t: nat
existsn' : nat, t <= f n'
f: nat -> nat h_superadditive: superadditive f h_non_zero: existsn : nat, 0 < f n t, n: nat LT_n: 0 < f n
existsn' : nat, t <= f n'
f: nat -> nat h_superadditive: superadditive f h_non_zero: existsn : nat, 0 < f n t, n: nat LT_n: 0 < f n
t <= f (t * n)
f: nat -> nat h_superadditive: superadditive f h_non_zero: existsn : nat, 0 < f n t, n: nat LT_n: 0 < f n
t <= t * f n
f: nat -> nat h_superadditive: superadditive f h_non_zero: existsn : nat, 0 < f n t, n: nat LT_n: 0 < f n
t * f n <= f (t * n)
f: nat -> nat h_superadditive: superadditive f h_non_zero: existsn : nat, 0 < f n t, n: nat LT_n: 0 < f n
t <= t * f n
byapply leq_pmulr.
f: nat -> nat h_superadditive: superadditive f h_non_zero: existsn : nat, 0 < f n t, n: nat LT_n: 0 < f n
t * f n <= f (t * n)
byapply superadditive_leq_mul.Qed.EndNonZeroSuperadditiveFunctions.EndSuperadditiveFunctions.EndFacts.(** In this section, we present the define and prove facts about the minimal superadditive extension of superadditive functions. Given a prefix of a function, there are many ways to continue the function in order to maintain superadditivity. Among these possible extrapolations, there always exists a minimal one. *)SectionMinimalExtensionOfSuperadditiveFunctions.(** Consider a function [f]. *)Variablef : nat -> nat.(** First, we define what it means to find the minimal extension once a horizon is specified. *)SectionDefinitions.(** Consider a horizon [h].. *)Variableh : nat.(** Then, the minimal superadditive extension will be the maximum sum over the pairs that sum to [h]. Note that, in this formula, there are two important edge cases: both [h=0] and [h=1], the sequence of valid sums will be empty, so their maximum will be [0]. In both cases, the extrapolation is nonetheless correct. *)Definitionminimal_superadditive_extension :=
max0 [seq f a + f (h-a) | a <- index_iota 1 h].EndDefinitions.(** In the following section, we prove some facts about the minimal superadditive extension. Note that we currently do not prove that the implemented extension is minimal. However, we plan to add this fact in the future. The following discussion provides useful information on the subject, including its connection with Network Calculus: https://gitlab.mpi-sws.org/RT-PROOFS/rt-proofs/-/merge_requests/127#note_64177 *)SectionFacts.(** Consider a horizon [h] ... *)Variableh : nat.(** ... and assume that we know [f] to be superadditive until [h]. *)Hypothesish_superadditive_until : superadditive_until f h.(** Moreover, consider a second function, [f'], which is equivalent to [f] in all of its points except for [h], in which its value is exactly the superadditive extension of [f] in [h]. *)Variablef' : nat -> nat.Hypothesish_f'_min_extension : forallt,
f' t =
if t == h
then minimal_superadditive_extension h
else f t.(** First, we prove that [f'] is superadditive also in [h]. *)
f: nat -> nat h: nat h_superadditive_until: superadditive_until f h f': nat -> nat h_f'_min_extension: forallt : nat,
f' t =
(if t == h
then
minimal_superadditive_extension
h
else f t)
superadditive_at f' h
f: nat -> nat h: nat h_superadditive_until: superadditive_until f h f': nat -> nat h_f'_min_extension: forallt : nat,
f' t =
(if t == h
then
minimal_superadditive_extension
h
else f t)
superadditive_at f' h
f: nat -> nat h: nat h_superadditive_until: superadditive_until f h f': nat -> nat h_f'_min_extension: forallt : nat,
f' t =
(if t == h
then
minimal_superadditive_extension
h
else f t) a, b: nat SUM: a + b = h
f' a + f' b <= f' h
f: nat -> nat h: nat h_superadditive_until: superadditive_until f h f': nat -> nat h_f'_min_extension: forallt : nat,
f' t =
(if t == h
then
minimal_superadditive_extension
h
else f t) a, b: nat SUM: a + b = h
(if a == h
then minimal_superadditive_extension h
else f a) +
(if b == h
then minimal_superadditive_extension h
else f b) <=
(if h == h
then minimal_superadditive_extension h
else f h)
f: nat -> nat h: nat h_superadditive_until: superadditive_until f h f': nat -> nat h_f'_min_extension: forallt : nat,
f' t =
(if t == h
then
minimal_superadditive_extension
h
else f t) a, b: nat SUM: a + b = h
(if a == a + b
then minimal_superadditive_extension (a + b)
else f a) +
(if b == a + b
then minimal_superadditive_extension (a + b)
else f b) <=
(if a + b == a + b
then minimal_superadditive_extension (a + b)
else f (a + b))
f: nat -> nat h: nat h_superadditive_until: superadditive_until f h f': nat -> nat h_f'_min_extension: forallt : nat,
f' t =
(if t == h
then
minimal_superadditive_extension
h
else f t) a, b: nat EQa: a = 0 b': nat EQb: b = b'.+1 SUM: 0 + b'.+1 = h
f: nat -> nat h: nat h_superadditive_until: superadditive_until f h f': nat -> nat h_f'_min_extension: forallt : nat,
f' t =
(if t == h
then
minimal_superadditive_extension
h
else f t) a, b, a': nat EQa: a = a'.+1 EQb: b = 0 SUM: a'.+1 + 0 = h
f: nat -> nat h: nat h_superadditive_until: superadditive_until f h f': nat -> nat h_f'_min_extension: forallt : nat,
f' t =
(if t == h
then
minimal_superadditive_extension
h
else f t) a, b, a': nat EQa: a = a'.+1 b': nat EQb: b = b'.+1 SUM: a'.+1 + b'.+1 = h
f: nat -> nat h: nat h_superadditive_until: superadditive_until f h f': nat -> nat h_f'_min_extension: forallt : nat,
f' t =
(if t == h
then
minimal_superadditive_extension
h
else f t) a, b: nat EQa: a = 0 b': nat EQb: b = b'.+1 SUM: 0 + b'.+1 = h
f: nat -> nat h: nat h_superadditive_until: superadditive_until f h f': nat -> nat h_f'_min_extension: forallt : nat,
f' t =
(if t == h
then
minimal_superadditive_extension
h
else f t) a, b: nat EQa: a = 0 b': nat EQb: b = b'.+1 SUM: 0 + b'.+1 = h
superadditive_at f 0
byapply h_superadditive_until; lia.
f: nat -> nat h: nat h_superadditive_until: superadditive_until f h f': nat -> nat h_f'_min_extension: forallt : nat,
f' t =
(if t == h
then
minimal_superadditive_extension
h
else f t) a, b, a': nat EQa: a = a'.+1 EQb: b = 0 SUM: a'.+1 + 0 = h
f: nat -> nat h: nat h_superadditive_until: superadditive_until f h f': nat -> nat h_f'_min_extension: forallt : nat,
f' t =
(if t == h
then
minimal_superadditive_extension
h
else f t) a, b, a': nat EQa: a = a'.+1 b': nat EQb: b = b'.+1 SUM: a'.+1 + b'.+1 = h
f: nat -> nat h: nat h_superadditive_until: superadditive_until f h f': nat -> nat h_f'_min_extension: forallt : nat,
f' t =
(if t == h
then
minimal_superadditive_extension
h
else f t) a, b, a': nat EQa: a = a'.+1 EQb: b = 0 SUM: a'.+1 + 0 = h
f: nat -> nat h: nat h_superadditive_until: superadditive_until f h f': nat -> nat h_f'_min_extension: forallt : nat,
f' t =
(if t == h
then
minimal_superadditive_extension
h
else f t) a, b, a': nat EQa: a = a'.+1 EQb: b = 0 SUM: a'.+1 + 0 = h
superadditive_at f 0
byapply h_superadditive_until; lia.
f: nat -> nat h: nat h_superadditive_until: superadditive_until f h f': nat -> nat h_f'_min_extension: forallt : nat,
f' t =
(if t == h
then
minimal_superadditive_extension
h
else f t) a, b, a': nat EQa: a = a'.+1 b': nat EQb: b = b'.+1 SUM: a'.+1 + b'.+1 = h
f: nat -> nat h: nat h_superadditive_until: superadditive_until f h f': nat -> nat h_f'_min_extension: forallt : nat,
f' t =
(if t == h
then
minimal_superadditive_extension
h
else f t) a, b, a': nat EQa: a = a'.+1 b': nat EQb: b = b'.+1 SUM: a'.+1 + b'.+1 = h
f: nat -> nat h: nat h_superadditive_until: superadditive_until f h f': nat -> nat h_f'_min_extension: forallt : nat,
f' t =
(if t == h
then
minimal_superadditive_extension
h
else f t) a, b, a': nat EQa: a = a'.+1 b': nat EQb: b = b'.+1 SUM: a'.+1 + b'.+1 = h
(if a == a + b
then minimal_superadditive_extension (a + b)
else f a) +
(if b == a + b
then minimal_superadditive_extension (a + b)
else f b) <= minimal_superadditive_extension (a + b)
f: nat -> nat h: nat h_superadditive_until: superadditive_until f h f': nat -> nat h_f'_min_extension: forallt : nat,
f' t =
(if t == h
then
minimal_superadditive_extension
h
else f t) a, b, a': nat EQa: a = a'.+1 b': nat EQb: b = b'.+1 SUM: a'.+1 + b'.+1 = h
f a +
(if b == a + b
then minimal_superadditive_extension (a + b)
else f b) <= minimal_superadditive_extension (a + b)
f: nat -> nat h: nat h_superadditive_until: superadditive_until f h f': nat -> nat h_f'_min_extension: forallt : nat,
f' t =
(if t == h
then
minimal_superadditive_extension
h
else f t) a, b, a': nat EQa: a = a'.+1 b': nat EQb: b = b'.+1 SUM: a'.+1 + b'.+1 = h
f a + f b <= minimal_superadditive_extension (a + b)
f: nat -> nat h: nat h_superadditive_until: superadditive_until f h f': nat -> nat h_f'_min_extension: forallt : nat,
f' t =
(if t == h
then
minimal_superadditive_extension
h
else f t) a, b, a': nat EQa: a = a'.+1 b': nat EQb: b = b'.+1 SUM: a'.+1 + b'.+1 = h
f a + f b <=
max0
[seq f a0 + f (a + b - a0)
| a0 <- index_iota 1 (a + b)]
f: nat -> nat h: nat h_superadditive_until: superadditive_until f h f': nat -> nat h_f'_min_extension: forallt : nat,
f' t =
(if t == h
then
minimal_superadditive_extension
h
else f t) a, b, a': nat EQa: a = a'.+1 b': nat EQb: b = b'.+1 SUM: a'.+1 + b'.+1 = h
f a + f b
\in [seq f a0 + f (a + b - a0)
| a0 <- index_iota 1 (a + b)]
f: nat -> nat h: nat h_superadditive_until: superadditive_until f h f': nat -> nat h_f'_min_extension: forallt : nat,
f' t =
(if t == h
then
minimal_superadditive_extension
h
else f t) a, b, a': nat EQa: a = a'.+1 b': nat EQb: b = b'.+1 SUM: a'.+1 + b'.+1 = h
a \in index_iota 1 (a + b)
f: nat -> nat h: nat h_superadditive_until: superadditive_until f h f': nat -> nat h_f'_min_extension: forallt : nat,
f' t =
(if t == h
then
minimal_superadditive_extension
h
else f t) a, b, a': nat EQa: a = a'.+1 b': nat EQb: b = b'.+1 SUM: a'.+1 + b'.+1 = h
f a + f b = f a + f (a + b - a)
f: nat -> nat h: nat h_superadditive_until: superadditive_until f h f': nat -> nat h_f'_min_extension: forallt : nat,
f' t =
(if t == h
then
minimal_superadditive_extension
h
else f t) a, b, a': nat EQa: a = a'.+1 b': nat EQb: b = b'.+1 SUM: a'.+1 + b'.+1 = h
a \in index_iota 1 (a + b)
byrewrite mem_iota; lia.
f: nat -> nat h: nat h_superadditive_until: superadditive_until f h f': nat -> nat h_f'_min_extension: forallt : nat,
f' t =
(if t == h
then
minimal_superadditive_extension
h
else f t) a, b, a': nat EQa: a = a'.+1 b': nat EQb: b = b'.+1 SUM: a'.+1 + b'.+1 = h
f a + f b = f a + f (a + b - a)
byhave -> : a + b - a = b bylia.}Qed.(** And finally, we prove that [f'] is superadditive until [h.+1]. *)
f: nat -> nat h: nat h_superadditive_until: superadditive_until f h f': nat -> nat h_f'_min_extension: forallt : nat,
f' t =
(if t == h
then
minimal_superadditive_extension
h
else f t)
superadditive_until f' h.+1
f: nat -> nat h: nat h_superadditive_until: superadditive_until f h f': nat -> nat h_f'_min_extension: forallt : nat,
f' t =
(if t == h
then
minimal_superadditive_extension
h
else f t)
superadditive_until f' h.+1
f: nat -> nat h: nat h_superadditive_until: superadditive_until f h f': nat -> nat h_f'_min_extension: forallt : nat,
f' t =
(if t == h
then
minimal_superadditive_extension
h
else f t) t: nat LEQh: t < h.+1 a, b: nat SUM: a + b = t
f' a + f' b <= f' t
f: nat -> nat h: nat h_superadditive_until: superadditive_until f h f': nat -> nat h_f'_min_extension: forallt : nat,
f' t =
(if t == h
then
minimal_superadditive_extension
h
else f t) t: nat LEQh: t < h.+1 a, b: nat SUM: a + b = t LT: t < h
f' a + f' b <= f' t
f: nat -> nat h: nat h_superadditive_until: superadditive_until f h f': nat -> nat h_f'_min_extension: forallt : nat,
f' t =
(if t == h
then
minimal_superadditive_extension
h
else f t) t: nat LEQh: t < h.+1 a, b: nat SUM: a + b = t GT: h < t
f' a + f' b <= f' t
f: nat -> nat h: nat h_superadditive_until: superadditive_until f h f': nat -> nat h_f'_min_extension: forallt : nat,
f' t =
(if t == h
then
minimal_superadditive_extension
h
else f t) t: nat LEQh: t < h.+1 a, b: nat SUM: a + b = t EQ: t = h
f' a + f' b <= f' t
f: nat -> nat h: nat h_superadditive_until: superadditive_until f h f': nat -> nat h_f'_min_extension: forallt : nat,
f' t =
(if t == h
then
minimal_superadditive_extension
h
else f t) t: nat LEQh: t < h.+1 a, b: nat SUM: a + b = t LT: t < h
f' a + f' b <= f' t
f: nat -> nat h: nat h_superadditive_until: superadditive_until f h f': nat -> nat h_f'_min_extension: forallt : nat,
f' t =
(if t == h
then
minimal_superadditive_extension
h
else f t) t: nat LEQh: t < h.+1 a, b: nat SUM: a + b = t LT: t < h
(if a == h
then minimal_superadditive_extension h
else f a) +
(if b == h
then minimal_superadditive_extension h
else f b) <=
(if t == h
then minimal_superadditive_extension h
else f t)
f: nat -> nat h: nat h_superadditive_until: superadditive_until f h f': nat -> nat h_f'_min_extension: forallt : nat,
f' t =
(if t == h
then
minimal_superadditive_extension
h
else f t) t: nat LEQh: t < h.+1 a, b: nat SUM: a + b = t LT: t < h
f a + f b <= f t
byapply h_superadditive_until.
f: nat -> nat h: nat h_superadditive_until: superadditive_until f h f': nat -> nat h_f'_min_extension: forallt : nat,
f' t =
(if t == h
then
minimal_superadditive_extension
h
else f t) t: nat LEQh: t < h.+1 a, b: nat SUM: a + b = t GT: h < t
f' a + f' b <= f' t
bylia.
f: nat -> nat h: nat h_superadditive_until: superadditive_until f h f': nat -> nat h_f'_min_extension: forallt : nat,
f' t =
(if t == h
then
minimal_superadditive_extension
h
else f t) t: nat LEQh: t < h.+1 a, b: nat SUM: a + b = t EQ: t = h
f' a + f' b <= f' t
f: nat -> nat h: nat h_superadditive_until: superadditive_until f h f': nat -> nat h_f'_min_extension: forallt : nat,
f' t =
(if t == h
then
minimal_superadditive_extension
h
else f t) t: nat LEQh: t < h.+1 a, b: nat EQ: t = h SUM: a + b = h