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]
Require Import prosa.util.tactics prosa.util.notation.(** We say that a function [f] is a unit growth function iff for any time instant [t] it holds that [f (t + 1) <= f t + 1]. *)Definitionunit_growth_function (f : nat -> nat) :=
forallt, f (t + 1) <= f t + 1.(** In this section, we prove a few useful lemmas about unit growth functions. *)SectionLemmas.(** Let [f] be any unit growth function over natural numbers. *)Variablef : nat -> nat.HypothesisH_unit_growth_function : unit_growth_function f.(** In the following section, we prove a result similar to the intermediate value theorem for continuous functions. *)SectionExistsIntermediateValue.(** Consider any interval <<[x1, x2]>>. *)Variablex1x2 : nat.HypothesisH_is_interval : x1 <= x2.(** Let [y] be any value such that [f x1 <= y < f x2]. *)Variabley : nat.HypothesisH_between : f x1 <= y < f x2.(** Then, we prove that there exists an intermediate point [x_mid] such that [f x_mid = y]. *)
f: nat -> nat H_unit_growth_function: unit_growth_function f x1, x2: nat H_is_interval: x1 <= x2 y: nat H_between: f x1 <= y < f x2
existsx_mid : nat, x1 <= x_mid < x2 /\ f x_mid = y
f: nat -> nat H_unit_growth_function: unit_growth_function f x1, x2: nat H_is_interval: x1 <= x2 y: nat H_between: f x1 <= y < f x2
existsx_mid : nat, x1 <= x_mid < x2 /\ f x_mid = y
f: nat -> nat UNIT: unit_growth_function f x1, x2: nat INT: x1 <= x2 y: nat BETWEEN: f x1 <= y < f x2
existsx_mid : nat, x1 <= x_mid < x2 /\ f x_mid = y
f: nat -> nat UNIT: unit_growth_function f x1, y: nat
forallx2 : nat,
x1 <= x2 ->
f x1 <= y < f x2 ->
existsx_mid : nat, x1 <= x_mid < x2 /\ f x_mid = y
f: nat -> nat UNIT: unit_growth_function f x1, y: nat DELTA: foralldelta : nat,
f x1 <= y < f (x1 + delta) ->
existsx_mid : nat,
x1 <= x_mid < x1 + delta /\ f x_mid = y
forallx2 : nat,
x1 <= x2 ->
f x1 <= y < f x2 ->
existsx_mid : nat, x1 <= x_mid < x2 /\ f x_mid = y
f: nat -> nat UNIT: unit_growth_function f x1, y: nat
foralldelta : nat,
f x1 <= y < f (x1 + delta) ->
existsx_mid : nat,
x1 <= x_mid < x1 + delta /\ f x_mid = y
f: nat -> nat UNIT: unit_growth_function f x1, y: nat DELTA: foralldelta : nat,
f x1 <= y < f (x1 + delta) ->
existsx_mid : nat,
x1 <= x_mid < x1 + delta /\ f x_mid = y
forallx2 : nat,
x1 <= x2 ->
f x1 <= y < f x2 ->
existsx_mid : nat, x1 <= x_mid < x2 /\ f x_mid = y
f: nat -> nat UNIT: unit_growth_function f x1, y: nat DELTA: foralldelta : nat,
f x1 <= y < f (x1 + delta) ->
existsx_mid : nat,
x1 <= x_mid < x1 + delta /\ f x_mid = y x2: nat LE: x1 <= x2 GEy: f x1 <= y LTy: y < f x2
existsx_mid : nat, x1 <= x_mid < x2 /\ f x_mid = y
f: nat -> nat UNIT: unit_growth_function f x1, y, x2: nat DELTA: f x1 <= y < f (x1 + (x2 - x1)) ->
existsx_mid : nat,
x1 <= x_mid < x1 + (x2 - x1) /\ f x_mid = y LE: x1 <= x2 GEy: f x1 <= y LTy: y < f x2
f x1 <= y < f (x1 + (x2 - x1))
f: nat -> nat UNIT: unit_growth_function f x1, y, x2: nat DELTA: existsx_mid : nat,
x1 <= x_mid < x1 + (x2 - x1) /\ f x_mid = y LE: x1 <= x2 GEy: f x1 <= y LTy: y < f x2
existsx_mid : nat, x1 <= x_mid < x2 /\ f x_mid = y
f: nat -> nat UNIT: unit_growth_function f x1, y, x2: nat DELTA: f x1 <= y < f (x1 + (x2 - x1)) ->
existsx_mid : nat,
x1 <= x_mid < x1 + (x2 - x1) /\ f x_mid = y LE: x1 <= x2 GEy: f x1 <= y LTy: y < f x2
f: nat -> nat UNIT: unit_growth_function f x1, y, x2: nat DELTA: existsx_mid : nat,
x1 <= x_mid < x1 + (x2 - x1) /\ f x_mid = y LE: x1 <= x2 GEy: f x1 <= y LTy: y < f x2
existsx_mid : nat, x1 <= x_mid < x2 /\ f x_mid = y
byrewrite subnKC in DELTA.
f: nat -> nat UNIT: unit_growth_function f x1, y: nat
foralldelta : nat,
f x1 <= y < f (x1 + delta) ->
existsx_mid : nat,
x1 <= x_mid < x1 + delta /\ f x_mid = y
f: nat -> nat UNIT: unit_growth_function f x1, y: nat
f x1 <= y < f (x1 + 0) ->
existsx_mid : nat,
x1 <= x_mid < x1 + 0 /\ f x_mid = y
f: nat -> nat UNIT: unit_growth_function f x1, y, delta: nat IHdelta: f x1 <= y < f (x1 + delta) ->
existsx_mid : nat,
x1 <= x_mid < x1 + delta /\ f x_mid = y
f x1 <= y < f (x1 + delta.+1) ->
existsx_mid : nat,
x1 <= x_mid < x1 + delta.+1 /\ f x_mid = y
f: nat -> nat UNIT: unit_growth_function f x1, y: nat
f x1 <= y < f (x1 + 0) ->
existsx_mid : nat,
x1 <= x_mid < x1 + 0 /\ f x_mid = y
f: nat -> nat UNIT: unit_growth_function f x1, y: nat GE0: f x1 <= y LT0: y < f x1
existsx_mid : nat, x1 <= x_mid < x1 /\ f x_mid = y
byapply (leq_ltn_trans GE0) in LT0; rewrite ltnn in LT0.
f: nat -> nat UNIT: unit_growth_function f x1, y, delta: nat IHdelta: f x1 <= y < f (x1 + delta) ->
existsx_mid : nat,
x1 <= x_mid < x1 + delta /\ f x_mid = y
f x1 <= y < f (x1 + delta.+1) ->
existsx_mid : nat,
x1 <= x_mid < x1 + delta.+1 /\ f x_mid = y
f: nat -> nat UNIT: unit_growth_function f x1, y, delta: nat IHdelta: f x1 <= y < f (x1 + delta) ->
existsx_mid : nat,
x1 <= x_mid < x1 + delta /\ f x_mid = y
f x1 <= y < f (x1 + delta.+1) ->
existsx_mid : nat,
x1 <= x_mid < x1 + delta.+1 /\ f x_mid = y
f: nat -> nat UNIT: unit_growth_function f x1, y, delta: nat IHdelta: f x1 <= y < f (x1 + delta) ->
existsx_mid : nat,
x1 <= x_mid < x1 + delta /\ f x_mid = y GT: f x1 <= y LT: y < f (x1 + delta.+1)
existsx_mid : nat,
x1 <= x_mid < x1 + delta.+1 /\ f x_mid = y
f: nat -> nat x1, delta, y: nat IHdelta: f x1 <= y < f (x1 + delta) ->
existsx_mid : nat,
x1 <= x_mid < x1 + delta /\ f x_mid = y GT: f x1 <= y LT: y < f (x1 + delta.+1) UNIT: (f (x1 + delta + 1) == f (x1 + delta) + 1)
|| (f (x1 + delta + 1) < f (x1 + delta) + 1)
existsx_mid : nat,
x1 <= x_mid < x1 + delta.+1 /\ f x_mid = y
f: nat -> nat x1, delta, y: nat IHdelta: f x1 <= y < f (x1 + delta) ->
existsx_mid : nat,
x1 <= x_mid < x1 + delta /\ f x_mid = y GT: f x1 <= y LT: y < f (x1 + delta.+1) UNIT: (f (x1 + delta + 1) == f (x1 + delta) + 1)
|| (f (x1 + delta + 1) < f (x1 + delta) + 1)
y <= f (x1 + delta)
f: nat -> nat x1, delta, y: nat IHdelta: f x1 <= y < f (x1 + delta) ->
existsx_mid : nat,
x1 <= x_mid < x1 + delta /\ f x_mid = y GT: f x1 <= y LT: y < f (x1 + delta.+1) UNIT: (f (x1 + delta + 1) == f (x1 + delta) + 1)
|| (f (x1 + delta + 1) < f (x1 + delta) + 1) LE: y <= f (x1 + delta)
existsx_mid : nat,
x1 <= x_mid < x1 + delta.+1 /\ f x_mid = y
f: nat -> nat x1, delta, y: nat IHdelta: f x1 <= y < f (x1 + delta) ->
existsx_mid : nat,
x1 <= x_mid < x1 + delta /\ f x_mid = y GT: f x1 <= y LT: y < f (x1 + delta.+1) UNIT: (f (x1 + delta + 1) == f (x1 + delta) + 1)
|| (f (x1 + delta + 1) < f (x1 + delta) + 1)
y <= f (x1 + delta)
f: nat -> nat x1, delta, y: nat IHdelta: f x1 <= y < f (x1 + delta) ->
existsx_mid : nat,
x1 <= x_mid < x1 + delta /\ f x_mid = y GT: f x1 <= y LT: y < f (x1 + delta.+1) UNIT: f (x1 + delta + 1) < f (x1 + delta) + 1
y <= f (x1 + delta)
f: nat -> nat x1, delta, y: nat IHdelta: f x1 <= y < f (x1 + delta) ->
existsx_mid : nat,
x1 <= x_mid < x1 + delta /\ f x_mid = y GT: f x1 <= y LT: y < f (x1 + delta.+1) UNIT: f (x1 + delta + 1) <= f (x1 + delta)
y <= f (x1 + delta)
f: nat -> nat x1, delta, y: nat IHdelta: f x1 <= y < f (x1 + delta) ->
existsx_mid : nat,
x1 <= x_mid < x1 + delta /\ f x_mid = y GT: f x1 <= y LT: y < f (x1 + delta.+1) UNIT: f (x1 + delta + 1) <= f (x1 + delta)
y <= f (x1 + delta + 1)
byrewrite addn1 -addnS ltnW.
f: nat -> nat x1, delta, y: nat IHdelta: f x1 <= y < f (x1 + delta) ->
existsx_mid : nat,
x1 <= x_mid < x1 + delta /\ f x_mid = y GT: f x1 <= y LT: y < f (x1 + delta.+1) UNIT: (f (x1 + delta + 1) == f (x1 + delta) + 1)
|| (f (x1 + delta + 1) < f (x1 + delta) + 1) LE: y <= f (x1 + delta)
existsx_mid : nat,
x1 <= x_mid < x1 + delta.+1 /\ f x_mid = y
f: nat -> nat x1, delta, y: nat IHdelta: f x1 <= y < f (x1 + delta) ->
existsx_mid : nat,
x1 <= x_mid < x1 + delta /\ f x_mid = y GT: f x1 <= y LE: y <= f (x1 + delta)
existsx_mid : nat,
x1 <= x_mid < x1 + delta.+1 /\ f x_mid = y
f: nat -> nat x1, delta, y: nat IHdelta: f x1 <= y < f (x1 + delta) ->
existsx_mid : nat,
x1 <= x_mid < x1 + delta /\ f x_mid = y GT: f x1 <= y LE: (y == f (x1 + delta)) || (y < f (x1 + delta))
existsx_mid : nat,
x1 <= x_mid < x1 + delta.+1 /\ f x_mid = y
f: nat -> nat x1, delta, y: nat IHdelta: f x1 <= y < f (x1 + delta) ->
existsx_mid : nat,
x1 <= x_mid < x1 + delta /\ f x_mid = y GT: f x1 <= y EQy: y = f (x1 + delta)
existsx_mid : nat,
x1 <= x_mid < x1 + delta.+1 /\ f x_mid = y
f: nat -> nat x1, delta, y: nat IHdelta: f x1 <= y < f (x1 + delta) ->
existsx_mid : nat,
x1 <= x_mid < x1 + delta /\ f x_mid = y GT: f x1 <= y LT: y < f (x1 + delta)
existsx_mid : nat,
x1 <= x_mid < x1 + delta.+1 /\ f x_mid = y
f: nat -> nat x1, delta, y: nat IHdelta: f x1 <= y < f (x1 + delta) ->
existsx_mid : nat,
x1 <= x_mid < x1 + delta /\ f x_mid = y GT: f x1 <= y EQy: y = f (x1 + delta)
existsx_mid : nat,
x1 <= x_mid < x1 + delta.+1 /\ f x_mid = y
f: nat -> nat x1, delta, y: nat IHdelta: f x1 <= y < f (x1 + delta) ->
existsx_mid : nat,
x1 <= x_mid < x1 + delta /\ f x_mid = y GT: f x1 <= y EQy: y = f (x1 + delta)
f: nat -> nat x1, delta, y: nat IHdelta: f x1 <= y < f (x1 + delta) ->
existsx_mid : nat,
x1 <= x_mid < x1 + delta /\ f x_mid = y GT: f x1 <= y LT: y < f (x1 + delta)
existsx_mid : nat,
x1 <= x_mid < x1 + delta.+1 /\ f x_mid = y
f: nat -> nat x1, delta, y: nat IHdelta: f x1 <= y < f (x1 + delta) ->
existsx_mid : nat,
x1 <= x_mid < x1 + delta /\ f x_mid = y GT: f x1 <= y LT: y < f (x1 + delta)
existsx_mid : nat,
x1 <= x_mid < x1 + delta.+1 /\ f x_mid = y
f: nat -> nat x1, delta, y: nat IHdelta: existsx_mid : nat,
x1 <= x_mid < x1 + delta /\ f x_mid = y GT: f x1 <= y LT: y < f (x1 + delta)
existsx_mid : nat,
x1 <= x_mid < x1 + delta.+1 /\ f x_mid = y
f: nat -> nat x1, delta, y: nat GT: f x1 <= y LT: y < f (x1 + delta) x_mid: nat GE0: x1 <= x_mid LT0: x_mid < x1 + delta EQ0: f x_mid = y
existsx_mid : nat,
x1 <= x_mid < x1 + delta.+1 /\ f x_mid = y
f: nat -> nat x1, delta, y: nat GT: f x1 <= y LT: y < f (x1 + delta) x_mid: nat GE0: x1 <= x_mid LT0: x_mid < x1 + delta EQ0: f x_mid = y
x1 <= x_mid < x1 + delta.+1
f: nat -> nat x1, delta, y: nat GT: f x1 <= y LT: y < f (x1 + delta) x_mid: nat GE0: x1 <= x_mid LT0: x_mid < x1 + delta EQ0: f x_mid = y
x_mid < x1 + delta.+1
byapply: (leq_trans LT0); rewrite addnS.}}Qed.EndExistsIntermediateValue.(** Next, we prove the same lemma with slightly different boundary conditions. *)SectionExistsIntermediateValueLEQ.(** Consider any interval <<[x1, x2]>>. *)Variablex1x2 : nat.HypothesisH_is_interval : x1 <= x2.(** Let [y] be any value such that [f x1 <= y <= f x2]. Note that [y] is allowed to be equal to [f x2]. *)Variabley : nat.HypothesisH_between : f x1 <= y <= f x2.(** Then, we prove that there exists an intermediate point [x_mid] such that [f x_mid = y]. *)
f: nat -> nat H_unit_growth_function: unit_growth_function f x1, x2: nat H_is_interval: x1 <= x2 y: nat H_between: f x1 <= y <= f x2
existsx_mid : nat, x1 <= x_mid <= x2 /\ f x_mid = y
f: nat -> nat H_unit_growth_function: unit_growth_function f x1, x2: nat H_is_interval: x1 <= x2 y: nat H_between: f x1 <= y <= f x2
existsx_mid : nat, x1 <= x_mid <= x2 /\ f x_mid = y
f: nat -> nat H_unit_growth_function: unit_growth_function f x1, x2: nat H_is_interval: x1 <= x2 y: nat H_between: f x1 <= y <= f x2 H1: f x1 <= y H2: y <= f x2
existsx_mid : nat, x1 <= x_mid <= x2 /\ f x_mid = y
f: nat -> nat H_unit_growth_function: unit_growth_function f x1, x2: nat H_is_interval: x1 <= x2 y: nat H_between: f x1 <= y <= f x2 H1: f x1 <= y EQ: y = f x2
existsx_mid : nat, x1 <= x_mid <= x2 /\ f x_mid = y
f: nat -> nat H_unit_growth_function: unit_growth_function f x1, x2: nat H_is_interval: x1 <= x2 y: nat H_between: f x1 <= y <= f x2 H1: f x1 <= y LT: y < f x2
existsx_mid : nat, x1 <= x_mid <= x2 /\ f x_mid = y
f: nat -> nat H_unit_growth_function: unit_growth_function f x1, x2: nat H_is_interval: x1 <= x2 y: nat H_between: f x1 <= y <= f x2 H1: f x1 <= y EQ: y = f x2
existsx_mid : nat, x1 <= x_mid <= x2 /\ f x_mid = y
f: nat -> nat H_unit_growth_function: unit_growth_function f x1, x2: nat H_is_interval: x1 <= x2 y: nat H_between: f x1 <= y <= f x2 H1: f x1 <= y EQ: y = f x2
x1 <= x2 <= x2
f: nat -> nat H_unit_growth_function: unit_growth_function f x1, x2: nat H_is_interval: x1 <= x2 y: nat H_between: f x1 <= y <= f x2 H1: f x1 <= y EQ: y = f x2
f x2 = y
f: nat -> nat H_unit_growth_function: unit_growth_function f x1, x2: nat H_is_interval: x1 <= x2 y: nat H_between: f x1 <= y <= f x2 H1: f x1 <= y EQ: y = f x2
x1 <= x2 <= x2
byapply /andP; split => //.
f: nat -> nat H_unit_growth_function: unit_growth_function f x1, x2: nat H_is_interval: x1 <= x2 y: nat H_between: f x1 <= y <= f x2 H1: f x1 <= y EQ: y = f x2
f x2 = y
bydone.
f: nat -> nat H_unit_growth_function: unit_growth_function f x1, x2: nat H_is_interval: x1 <= x2 y: nat H_between: f x1 <= y <= f x2 H1: f x1 <= y LT: y < f x2
existsx_mid : nat, x1 <= x_mid <= x2 /\ f x_mid = y
f: nat -> nat H_unit_growth_function: unit_growth_function f x1, x2: nat H_is_interval: x1 <= x2 y: nat H_between: f x1 <= y <= f x2 H1: f x1 <= y LT: y < f x2
existsx_mid : nat, x1 <= x_mid <= x2 /\ f x_mid = y
f: nat -> nat H_unit_growth_function: unit_growth_function f x1, x2: nat H_is_interval: x1 <= x2 y: nat H_between: f x1 <= y <= f x2 H1: f x1 <= y LT: y < f x2
f x1 <= ?y < f x2
f: nat -> nat H_unit_growth_function: unit_growth_function f x1, x2: nat H_is_interval: x1 <= x2 y: nat H_between: f x1 <= y <= f x2 H1: f x1 <= y LT: y < f x2 mid: nat NEQ: x1 <= mid < x2 EQ: f mid = ?y
existsx_mid : nat, x1 <= x_mid <= x2 /\ f x_mid = y
f: nat -> nat H_unit_growth_function: unit_growth_function f x1, x2: nat H_is_interval: x1 <= x2 y: nat H_between: f x1 <= y <= f x2 H1: f x1 <= y LT: y < f x2
f x1 <= ?y < f x2
byapply/andP; split; [ apply H1 | apply LT].
f: nat -> nat H_unit_growth_function: unit_growth_function f x1, x2: nat H_is_interval: x1 <= x2 y: nat H_between: f x1 <= y <= f x2 H1: f x1 <= y LT: y < f x2 mid: nat NEQ: x1 <= mid < x2 EQ: f mid = y
existsx_mid : nat, x1 <= x_mid <= x2 /\ f x_mid = y
f: nat -> nat H_unit_growth_function: unit_growth_function f x1, x2: nat H_is_interval: x1 <= x2 y: nat H_between: f x1 <= y <= f x2 H1: f x1 <= y LT: y < f x2 mid: nat NEQ: x1 <= mid < x2 EQ: f mid = y
x1 <= mid <= x2
f: nat -> nat H_unit_growth_function: unit_growth_function f x1, x2: nat H_is_interval: x1 <= x2 y: nat H_between: f x1 <= y <= f x2 H1: f x1 <= y LT: y < f x2 mid: nat EQ: f mid = y NEQ1: x1 <= mid NEQ2: mid < x2
x1 <= mid <= x2
byapply/andP; split => //.}Qed.EndExistsIntermediateValueLEQ.(** In this section, we, again, prove an analogue of the intermediate value theorem, but for predicates over natural numbers. *)SectionExistsIntermediateValuePredicates.(** Let [P] be any predicate on natural numbers. *)VariableP : nat -> bool.(** Consider a time interval <<[t1,t2]>> such that ... *)Variablest1t2 : nat.HypothesisH_t1_le_t2 : t1 <= t2.(** ... [P] doesn't hold for [t1] ... *)HypothesisH_not_P_at_t1 : ~~ P t1.(** ... but holds for [t2]. *)HypothesisH_P_at_t2 : P t2.(** Then we prove that within time interval <<[t1,t2]>> there exists time instant [t] such that [t] is the first time instant when [P] holds. *)
f: nat -> nat H_unit_growth_function: unit_growth_function f P: nat -> bool t1, t2: nat H_t1_le_t2: t1 <= t2 H_not_P_at_t1: ~~ P t1 H_P_at_t2: P t2
existst : nat,
t1 < t <= t2 /\
(forallx : nat, t1 <= x < t -> ~~ P x) /\ P t
f: nat -> nat H_unit_growth_function: unit_growth_function f P: nat -> bool t1, t2: nat H_t1_le_t2: t1 <= t2 H_not_P_at_t1: ~~ P t1 H_P_at_t2: P t2
existst : nat,
t1 < t <= t2 /\
(forallx : nat, t1 <= x < t -> ~~ P x) /\ P t
f: nat -> nat H_unit_growth_function: unit_growth_function f P: nat -> bool t1, t2: nat H_t1_le_t2: t1 <= t2 H_not_P_at_t1: ~~ P t1 H_P_at_t2: P t2
existsx : nat, [&& P x, t1 < x & x <= t2]
f: nat -> nat H_unit_growth_function: unit_growth_function f P: nat -> bool t1, t2: nat H_t1_le_t2: t1 <= t2 H_not_P_at_t1: ~~ P t1 H_P_at_t2: P t2 EX: existsx : nat, [&& P x, t1 < x & x <= t2]
existst : nat,
t1 < t <= t2 /\
(forallx : nat, t1 <= x < t -> ~~ P x) /\ P t
f: nat -> nat H_unit_growth_function: unit_growth_function f P: nat -> bool t1, t2: nat H_t1_le_t2: t1 <= t2 H_not_P_at_t1: ~~ P t1 H_P_at_t2: P t2
existsx : nat, [&& P x, t1 < x & x <= t2]
f: nat -> nat H_unit_growth_function: unit_growth_function f P: nat -> bool t1, t2: nat H_t1_le_t2: t1 <= t2 H_not_P_at_t1: ~~ P t1 H_P_at_t2: P t2
[&& P t2, t1 < t2 & t2 <= t2]
f: nat -> nat H_unit_growth_function: unit_growth_function f P: nat -> bool t1, t2: nat H_t1_le_t2: t1 <= t2 H_not_P_at_t1: ~~ P t1 H_P_at_t2: P t2
t1 < t2 <= t2
f: nat -> nat H_unit_growth_function: unit_growth_function f P: nat -> bool t1, t2: nat H_t1_le_t2: t1 <= t2 H_not_P_at_t1: ~~ P t1 H_P_at_t2: P t2
t1 < t2
f: nat -> nat H_unit_growth_function: unit_growth_function f P: nat -> bool t1, t2: nat H_t1_le_t2: t1 <= t2 H_not_P_at_t1: ~~ P t1 H_P_at_t2: P t2 EQ: t1 = t2
f: nat -> nat H_unit_growth_function: unit_growth_function f P: nat -> bool t1, t2: nat H_t1_le_t2: t1 <= t2 H_not_P_at_t1: ~~ P t1 H_P_at_t2: P t2 EX: existsx : nat, [&& P x, t1 < x & x <= t2]
existst : nat,
t1 < t <= t2 /\
(forallx : nat, t1 <= x < t -> ~~ P x) /\ P t
f: nat -> nat H_unit_growth_function: unit_growth_function f P: nat -> bool t1, t2: nat H_t1_le_t2: t1 <= t2 H_not_P_at_t1: ~~ P t1 H_P_at_t2: P t2 EX: existsx : nat, [&& P x, t1 < x & x <= t2] MIN: ex_minn_spec
(funx : nat => [&& P x, t1 < x & x <= t2])
(ex_minn
(P:=funx : nat =>
[&& P x, t1 < x & x <= t2]) EX)
existst : nat,
t1 < t <= t2 /\
(forallx : nat, t1 <= x < t -> ~~ P x) /\ P t
f: nat -> nat H_unit_growth_function: unit_growth_function f P: nat -> bool t1, t2: nat H_t1_le_t2: t1 <= t2 H_not_P_at_t1: ~~ P t1 H_P_at_t2: P t2 x: nat Px: P x LT1: t1 < x LT2: x <= t2 MIN: foralln : nat,
[&& P n, t1 < n & n <= t2] -> x <= n
existst : nat,
t1 < t <= t2 /\
(forallx : nat, t1 <= x < t -> ~~ P x) /\ P t
f: nat -> nat H_unit_growth_function: unit_growth_function f P: nat -> bool t1, t2: nat H_t1_le_t2: t1 <= t2 H_not_P_at_t1: ~~ P t1 H_P_at_t2: P t2 x: nat Px: P x LT1: t1 < x LT2: x <= t2 MIN: foralln : nat,
[&& P n, t1 < n & n <= t2] -> x <= n
forallx0 : nat, t1 <= x0 < x -> ~~ P x0
f: nat -> nat H_unit_growth_function: unit_growth_function f P: nat -> bool t1, t2: nat H_t1_le_t2: t1 <= t2 H_not_P_at_t1: ~~ P t1 H_P_at_t2: P t2 x: nat Px: P x LT1: t1 < x LT2: x <= t2 MIN: foralln : nat,
[&& P n, t1 < n & n <= t2] -> x <= n y: nat NEQ1: t1 <= y NEQ2: y < x Py: P y
False
f: nat -> nat H_unit_growth_function: unit_growth_function f P: nat -> bool t1, t2: nat H_t1_le_t2: t1 <= t2 H_not_P_at_t1: ~~ P t1 H_P_at_t2: P t2 x: nat Px: P x LT1: t1 < x LT2: x <= t2 MIN: foralln : nat,
[&& P n, t1 < n & n <= t2] -> x <= n y: nat NEQ1: t1 <= y NEQ2: y < x Py: P y
[&& P y, t1 < y & y <= t2]
f: nat -> nat H_unit_growth_function: unit_growth_function f P: nat -> bool t1, t2: nat H_t1_le_t2: t1 <= t2 H_not_P_at_t1: ~~ P t1 H_P_at_t2: P t2 x: nat Px: P x LT1: t1 < x LT2: x <= t2 y: nat MIN: x <= y NEQ1: t1 <= y NEQ2: y < x Py: P y
False
f: nat -> nat H_unit_growth_function: unit_growth_function f P: nat -> bool t1, t2: nat H_t1_le_t2: t1 <= t2 H_not_P_at_t1: ~~ P t1 H_P_at_t2: P t2 x: nat Px: P x LT1: t1 < x LT2: x <= t2 MIN: foralln : nat,
[&& P n, t1 < n & n <= t2] -> x <= n y: nat NEQ1: t1 <= y NEQ2: y < x Py: P y
[&& P y, t1 < y & y <= t2]
f: nat -> nat H_unit_growth_function: unit_growth_function f P: nat -> bool t1, t2: nat H_t1_le_t2: t1 <= t2 H_not_P_at_t1: ~~ P t1 H_P_at_t2: P t2 x: nat Px: P x LT1: t1 < x LT2: x <= t2 MIN: foralln : nat,
[&& P n, t1 < n & n <= t2] -> x <= n y: nat NEQ1: t1 <= y NEQ2: y < x Py: P y
t1 < y <= t2
f: nat -> nat H_unit_growth_function: unit_growth_function f P: nat -> bool t1, t2: nat H_t1_le_t2: t1 <= t2 H_not_P_at_t1: ~~ P t1 H_P_at_t2: P t2 x: nat Px: P x LT1: t1 < x LT2: x <= t2 MIN: foralln : nat,
[&& P n, t1 < n & n <= t2] -> x <= n y: nat NEQ1: t1 <= y NEQ2: y < x Py: P y
t1 < y
f: nat -> nat H_unit_growth_function: unit_growth_function f P: nat -> bool t1, t2: nat H_t1_le_t2: t1 <= t2 H_not_P_at_t1: ~~ P t1 H_P_at_t2: P t2 x: nat Px: P x LT1: t1 < x LT2: x <= t2 MIN: foralln : nat,
[&& P n, t1 < n & n <= t2] -> x <= n y: nat NEQ1: t1 <= y NEQ2: y < x Py: P y
y <= t2
f: nat -> nat H_unit_growth_function: unit_growth_function f P: nat -> bool t1, t2: nat H_t1_le_t2: t1 <= t2 H_not_P_at_t1: ~~ P t1 H_P_at_t2: P t2 x: nat Px: P x LT1: t1 < x LT2: x <= t2 MIN: foralln : nat,
[&& P n, t1 < n & n <= t2] -> x <= n y: nat NEQ1: t1 <= y NEQ2: y < x Py: P y
t1 < y
f: nat -> nat H_unit_growth_function: unit_growth_function f P: nat -> bool t1, t2: nat H_t1_le_t2: t1 <= t2 H_not_P_at_t1: ~~ P t1 H_P_at_t2: P t2 x: nat Px: P x LT1: t1 < x LT2: x <= t2 MIN: foralln : nat,
[&& P n, t1 < n & n <= t2] -> x <= n y: nat NEQ2: y < x Py: P y
t1 <= y -> t1 < y
f: nat -> nat H_unit_growth_function: unit_growth_function f P: nat -> bool t1, t2: nat H_t1_le_t2: t1 <= t2 H_not_P_at_t1: ~~ P t1 H_P_at_t2: P t2 x: nat Px: P x LT1: t1 < x LT2: x <= t2 MIN: foralln : nat,
[&& P n, t1 < n & n <= t2] -> x <= n y: nat NEQ2: y < x Py: P y EQ: t1 = y
f: nat -> nat H_unit_growth_function: unit_growth_function f P: nat -> bool t1, t2: nat H_t1_le_t2: t1 <= t2 H_not_P_at_t1: ~~ P t1 H_P_at_t2: P t2 x: nat Px: P x LT1: t1 < x LT2: x <= t2 MIN: foralln : nat,
[&& P n, t1 < n & n <= t2] -> x <= n y: nat NEQ1: t1 <= y NEQ2: y < x Py: P y
y <= t2
byapply ltnW, leq_trans with x.
f: nat -> nat H_unit_growth_function: unit_growth_function f P: nat -> bool t1, t2: nat H_t1_le_t2: t1 <= t2 H_not_P_at_t1: ~~ P t1 H_P_at_t2: P t2 x: nat Px: P x LT1: t1 < x LT2: x <= t2 y: nat MIN: x <= y NEQ1: t1 <= y NEQ2: y < x Py: P y