From stdpp Require Import prelude. From Coq Require Import Sorting. From VLSM.Lib Require Import Preamble ListExtras ListSetExtras.
Insert an element into a sorted list.
Fixpoint add_in_sorted_list_fn {A} (compare : A -> A -> comparison) (x : A) (l : list A) : list A := match l with | [] => [x] | h :: t => match compare x h with | Lt => x :: h :: t | Eq => h :: t | Gt => h :: @add_in_sorted_list_fn A compare x t end end.A: Type
compare: A → A → comparison∀ (msg : A) (sigma : list A), add_in_sorted_list_fn compare msg sigma ≠ []A: Type
compare: A → A → comparison∀ (msg : A) (sigma : list A), add_in_sorted_list_fn compare msg sigma ≠ []A: Type
compare: A → A → comparison∀ (msg : A) (sigma : list A), add_in_sorted_list_fn compare msg sigma = [] → FalseA: Type
compare: A → A → comparison
msg: A
sigma: list A
H: add_in_sorted_list_fn compare msg sigma = []FalseA: Type
compare: A → A → comparison
msg: A
H: [msg] = []FalseA: Type
compare: A → A → comparison
msg, a: A
sigma: list A
H: match compare msg a with | Eq => a :: sigma | Lt => msg :: a :: sigma | Gt => a :: add_in_sorted_list_fn compare msg sigma end = []Falseby inversion H.A: Type
compare: A → A → comparison
msg: A
H: [msg] = []Falseby destruct (compare msg a); inversion H. Qed.A: Type
compare: A → A → comparison
msg, a: A
sigma: list A
H: match compare msg a with | Eq => a :: sigma | Lt => msg :: a :: sigma | Gt => a :: add_in_sorted_list_fn compare msg sigma end = []FalseA: Type
compare: A → A → comparison
H: CompareStrictOrder compare∀ (msg msg' : A) (sigma : list A), msg' ∈ add_in_sorted_list_fn compare msg sigma → msg = msg' ∨ msg' ∈ sigmaA: Type
compare: A → A → comparison
H: CompareStrictOrder compare∀ (msg msg' : A) (sigma : list A), msg' ∈ add_in_sorted_list_fn compare msg sigma → msg = msg' ∨ msg' ∈ sigmaA: Type
compare: A → A → comparison
H: CompareStrictOrder compare
msg, msg': A
sigma: list A
H0: msg' ∈ add_in_sorted_list_fn compare msg sigmamsg = msg' ∨ msg' ∈ sigmaA: Type
compare: A → A → comparison
H: CompareStrictOrder compare
msg, msg': A
H0: msg' ∈ [msg]msg = msg' ∨ msg' ∈ []A: Type
compare: A → A → comparison
H: CompareStrictOrder compare
msg, msg', a: A
sigma: list A
H0: msg' ∈ match compare msg a with | Eq => a :: sigma | Lt => msg :: a :: sigma | Gt => a :: add_in_sorted_list_fn compare msg sigma end
IHsigma: msg' ∈ add_in_sorted_list_fn compare msg sigma → msg = msg' ∨ msg' ∈ sigmamsg = msg' ∨ msg' ∈ a :: sigmaA: Type
compare: A → A → comparison
H: CompareStrictOrder compare
msg, msg': A
H0: msg' ∈ [msg]msg = msg' ∨ msg' ∈ []by destruct H0 as [H0 | H0]; subst; try inversion H0; left.A: Type
compare: A → A → comparison
H: CompareStrictOrder compare
msg, msg': A
H0: msg' = msg ∨ msg' ∈ []msg = msg' ∨ msg' ∈ []A: Type
compare: A → A → comparison
H: CompareStrictOrder compare
msg, msg', a: A
sigma: list A
H0: msg' ∈ match compare msg a with | Eq => a :: sigma | Lt => msg :: a :: sigma | Gt => a :: add_in_sorted_list_fn compare msg sigma end
IHsigma: msg' ∈ add_in_sorted_list_fn compare msg sigma → msg = msg' ∨ msg' ∈ sigmamsg = msg' ∨ msg' ∈ a :: sigmaA: Type
compare: A → A → comparison
H: CompareStrictOrder compare
msg, msg', a: A
sigma: list A
Hcmp: compare msg a = Eq
H0: msg' ∈ a :: sigma
IHsigma: msg' ∈ add_in_sorted_list_fn compare msg sigma → msg = msg' ∨ msg' ∈ sigmamsg = msg' ∨ msg' ∈ a :: sigmaA: Type
compare: A → A → comparison
H: CompareStrictOrder compare
msg, msg', a: A
sigma: list A
Hcmp: compare msg a = Lt
H0: msg' ∈ msg :: a :: sigma
IHsigma: msg' ∈ add_in_sorted_list_fn compare msg sigma → msg = msg' ∨ msg' ∈ sigmamsg = msg' ∨ msg' ∈ a :: sigmaA: Type
compare: A → A → comparison
H: CompareStrictOrder compare
msg, msg', a: A
sigma: list A
Hcmp: compare msg a = Gt
H0: msg' ∈ a :: add_in_sorted_list_fn compare msg sigma
IHsigma: msg' ∈ add_in_sorted_list_fn compare msg sigma → msg = msg' ∨ msg' ∈ sigmamsg = msg' ∨ msg' ∈ a :: sigmaby rewrite compare_eq in Hcmp; subst; right.A: Type
compare: A → A → comparison
H: CompareStrictOrder compare
msg, msg', a: A
sigma: list A
Hcmp: compare msg a = Eq
H0: msg' ∈ a :: sigma
IHsigma: msg' ∈ add_in_sorted_list_fn compare msg sigma → msg = msg' ∨ msg' ∈ sigmamsg = msg' ∨ msg' ∈ a :: sigmaA: Type
compare: A → A → comparison
H: CompareStrictOrder compare
msg, msg', a: A
sigma: list A
Hcmp: compare msg a = Lt
H0: msg' ∈ msg :: a :: sigma
IHsigma: msg' ∈ add_in_sorted_list_fn compare msg sigma → msg = msg' ∨ msg' ∈ sigmamsg = msg' ∨ msg' ∈ a :: sigmaby destruct H0 as [Heq | Hin]; subst; [left | right].A: Type
compare: A → A → comparison
H: CompareStrictOrder compare
msg, msg', a: A
sigma: list A
Hcmp: compare msg a = Lt
H0: msg' = msg ∨ msg' ∈ a :: sigma
IHsigma: msg' ∈ add_in_sorted_list_fn compare msg sigma → msg = msg' ∨ msg' ∈ sigmamsg = msg' ∨ msg' ∈ a :: sigmaA: Type
compare: A → A → comparison
H: CompareStrictOrder compare
msg, msg', a: A
sigma: list A
Hcmp: compare msg a = Gt
H0: msg' ∈ a :: add_in_sorted_list_fn compare msg sigma
IHsigma: msg' ∈ add_in_sorted_list_fn compare msg sigma → msg = msg' ∨ msg' ∈ sigmamsg = msg' ∨ msg' ∈ a :: sigmaA: Type
compare: A → A → comparison
H: CompareStrictOrder compare
msg, msg', a: A
sigma: list A
Hcmp: compare msg a = Gt
H0: msg' = a ∨ msg' ∈ add_in_sorted_list_fn compare msg sigma
IHsigma: msg' ∈ add_in_sorted_list_fn compare msg sigma → msg = msg' ∨ msg' ∈ sigmamsg = msg' ∨ msg' ∈ a :: sigmaA: Type
compare: A → A → comparison
H: CompareStrictOrder compare
msg, a: A
sigma: list A
Hcmp: compare msg a = Gt
IHsigma: a ∈ add_in_sorted_list_fn compare msg sigma → msg = a ∨ a ∈ sigmamsg = a ∨ a ∈ a :: sigmaA: Type
compare: A → A → comparison
H: CompareStrictOrder compare
msg, msg', a: A
sigma: list A
Hcmp: compare msg a = Gt
Hin: msg' ∈ add_in_sorted_list_fn compare msg sigma
IHsigma: msg' ∈ add_in_sorted_list_fn compare msg sigma → msg = msg' ∨ msg' ∈ sigmamsg = msg' ∨ msg' ∈ a :: sigmaby right; left.A: Type
compare: A → A → comparison
H: CompareStrictOrder compare
msg, a: A
sigma: list A
Hcmp: compare msg a = Gt
IHsigma: a ∈ add_in_sorted_list_fn compare msg sigma → msg = a ∨ a ∈ sigmamsg = a ∨ a ∈ a :: sigmaA: Type
compare: A → A → comparison
H: CompareStrictOrder compare
msg, msg', a: A
sigma: list A
Hcmp: compare msg a = Gt
Hin: msg' ∈ add_in_sorted_list_fn compare msg sigma
IHsigma: msg' ∈ add_in_sorted_list_fn compare msg sigma → msg = msg' ∨ msg' ∈ sigmamsg = msg' ∨ msg' ∈ a :: sigmaby apply IHsigma in Hin as []; itauto. Qed.A: Type
compare: A → A → comparison
H: CompareStrictOrder compare
msg, msg', a: A
sigma: list A
Hcmp: compare msg a = Gt
Hin: msg' ∈ add_in_sorted_list_fn compare msg sigma
IHsigma: msg' ∈ add_in_sorted_list_fn compare msg sigma → msg = msg' ∨ msg' ∈ sigmamsg = msg' ∨ msg' = a ∨ msg' ∈ sigmaA: Type
compare: A → A → comparison
H: CompareStrictOrder compare∀ (msg msg' : A) (sigma : list A), msg = msg' ∨ msg' ∈ sigma → msg' ∈ add_in_sorted_list_fn compare msg sigmaA: Type
compare: A → A → comparison
H: CompareStrictOrder compare∀ (msg msg' : A) (sigma : list A), msg = msg' ∨ msg' ∈ sigma → msg' ∈ add_in_sorted_list_fn compare msg sigmaA: Type
compare: A → A → comparison
H: CompareStrictOrder compare
msg, msg': A
sigma: list A
H0: msg = msg' ∨ msg' ∈ sigmamsg' ∈ add_in_sorted_list_fn compare msg sigmaA: Type
compare: A → A → comparison
H: CompareStrictOrder compare
msg, msg': A
H0: msg = msg' ∨ msg' ∈ []msg' ∈ add_in_sorted_list_fn compare msg []A: Type
compare: A → A → comparison
H: CompareStrictOrder compare
msg, msg', a: A
sigma: list A
H0: msg = msg' ∨ msg' ∈ a :: sigma
IHsigma: msg = msg' ∨ msg' ∈ sigma → msg' ∈ add_in_sorted_list_fn compare msg sigmamsg' ∈ add_in_sorted_list_fn compare msg (a :: sigma)by destruct H0 as [H0 | H0]; subst; [left | inversion H0].A: Type
compare: A → A → comparison
H: CompareStrictOrder compare
msg, msg': A
H0: msg = msg' ∨ msg' ∈ []msg' ∈ add_in_sorted_list_fn compare msg []A: Type
compare: A → A → comparison
H: CompareStrictOrder compare
msg, msg', a: A
sigma: list A
H0: msg = msg' ∨ msg' ∈ a :: sigma
IHsigma: msg = msg' ∨ msg' ∈ sigma → msg' ∈ add_in_sorted_list_fn compare msg sigmamsg' ∈ add_in_sorted_list_fn compare msg (a :: sigma)by destruct H0 as [Heq | Heq], (compare msg a) eqn: Hcmp ; rewrite !elem_of_cons; rewrite ?compare_eq in Hcmp; subst; itauto. Qed.A: Type
compare: A → A → comparison
H: CompareStrictOrder compare
msg, msg', a: A
sigma: list A
H0: msg = msg' ∨ msg' = a ∨ msg' ∈ sigma
IHsigma: msg = msg' ∨ msg' ∈ sigma → msg' ∈ add_in_sorted_list_fn compare msg sigmamsg' ∈ match compare msg a with | Eq => a :: sigma | Lt => msg :: a :: sigma | Gt => a :: add_in_sorted_list_fn compare msg sigma endA: Type
compare: A → A → comparison
H: CompareStrictOrder compare∀ (msg msg' : A) (sigma : list A), msg' ∈ add_in_sorted_list_fn compare msg sigma ↔ msg = msg' ∨ msg' ∈ sigmaA: Type
compare: A → A → comparison
H: CompareStrictOrder compare∀ (msg msg' : A) (sigma : list A), msg' ∈ add_in_sorted_list_fn compare msg sigma ↔ msg = msg' ∨ msg' ∈ sigmaA: Type
compare: A → A → comparison
H: CompareStrictOrder compare
msg, msg': A
sigma: list Amsg' ∈ add_in_sorted_list_fn compare msg sigma → msg = msg' ∨ msg' ∈ sigmaA: Type
compare: A → A → comparison
H: CompareStrictOrder compare
msg, msg': A
sigma: list Amsg = msg' ∨ msg' ∈ sigma → msg' ∈ add_in_sorted_list_fn compare msg sigmaby apply add_in_sorted_list_in.A: Type
compare: A → A → comparison
H: CompareStrictOrder compare
msg, msg': A
sigma: list Amsg' ∈ add_in_sorted_list_fn compare msg sigma → msg = msg' ∨ msg' ∈ sigmaby apply add_in_sorted_list_in_rev. Qed.A: Type
compare: A → A → comparison
H: CompareStrictOrder compare
msg, msg': A
sigma: list Amsg = msg' ∨ msg' ∈ sigma → msg' ∈ add_in_sorted_list_fn compare msg sigmaA: Type
compare: A → A → comparison
H: CompareStrictOrder compare∀ (msg : A) (sigma : list A), msg ∈ add_in_sorted_list_fn compare msg sigmaby intros; apply add_in_sorted_list_iff; left. Qed.A: Type
compare: A → A → comparison
H: CompareStrictOrder compare∀ (msg : A) (sigma : list A), msg ∈ add_in_sorted_list_fn compare msg sigmaA: Type
compare: A → A → comparison
H: CompareStrictOrder compare∀ (msg : A) (sigma : list A), sigma ⊆ add_in_sorted_list_fn compare msg sigmaA: Type
compare: A → A → comparison
H: CompareStrictOrder compare∀ (msg : A) (sigma : list A), sigma ⊆ add_in_sorted_list_fn compare msg sigmaby apply add_in_sorted_list_iff; right. Qed.A: Type
compare: A → A → comparison
H: CompareStrictOrder compare
msg: A
sigma: list A
x: A
Hin: x ∈ sigmax ∈ add_in_sorted_list_fn compare msg sigmaA: Type
R: A → A → Prop∀ l : list A, LocallySorted R l ↔ ForAllSuffix2 R lA: Type
R: A → A → Prop∀ l : list A, LocallySorted R l ↔ ForAllSuffix2 R lA: Type
R: A → A → Prop
Hl: LocallySorted R []ForAllSuffix2 R []A: Type
R: A → A → Prop
Hl: ForAllSuffix2 R []LocallySorted R []A: Type
R: A → A → Prop
a: A
l: list A
IHl: LocallySorted R l ↔ ForAllSuffix2 R l
Hl: LocallySorted R (a :: l)ForAllSuffix2 R (a :: l)A: Type
R: A → A → Prop
a: A
l: list A
IHl: LocallySorted R l ↔ ForAllSuffix2 R l
Hl: ForAllSuffix2 R (a :: l)LocallySorted R (a :: l)by constructor.A: Type
R: A → A → Prop
Hl: LocallySorted R []ForAllSuffix2 R []by constructor.A: Type
R: A → A → Prop
Hl: ForAllSuffix2 R []LocallySorted R []A: Type
R: A → A → Prop
a: A
l: list A
IHl: LocallySorted R l ↔ ForAllSuffix2 R l
Hl: LocallySorted R (a :: l)ForAllSuffix2 R (a :: l)A: Type
R: A → A → Prop
a: A
Hl: LocallySorted R [a]
IHl: LocallySorted R [] ↔ ForAllSuffix2 R []ForAllSuffix2 R [a]A: Type
R: A → A → Prop
a, b: A
l0: list A
Hl: LocallySorted R (a :: b :: l0)
IHl: LocallySorted R (b :: l0) ↔ ForAllSuffix2 R (b :: l0)
H1: LocallySorted R (b :: l0)
H2: R a bForAllSuffix2 R (a :: b :: l0)by repeat constructor.A: Type
R: A → A → Prop
a: A
Hl: LocallySorted R [a]
IHl: LocallySorted R [] ↔ ForAllSuffix2 R []ForAllSuffix2 R [a]by apply IHl in H1; constructor.A: Type
R: A → A → Prop
a, b: A
l0: list A
Hl: LocallySorted R (a :: b :: l0)
IHl: LocallySorted R (b :: l0) ↔ ForAllSuffix2 R (b :: l0)
H1: LocallySorted R (b :: l0)
H2: R a bForAllSuffix2 R (a :: b :: l0)A: Type
R: A → A → Prop
a: A
l: list A
IHl: LocallySorted R l ↔ ForAllSuffix2 R l
Hl: ForAllSuffix2 R (a :: l)LocallySorted R (a :: l)by destruct l; constructor; auto. Qed.A: Type
R: A → A → Prop
a: A
l: list A
IHl: ForAllSuffix2 R l → LocallySorted R l
Hl: ForAllSuffix2 R (a :: l)
H1: match l with | [] => True | b :: _ => R a b end
H2: ForAllSuffix (λ l : list A, match l with | [] => True | [a] => True | a :: b :: _ => R a b end) lLocallySorted R (a :: l)A: Type
R: A → A → Prop
HT: Transitive R
P: A → Prop
Pdec: ∀ a : A, Decision (P a)∀ l : list A, LocallySorted R l → LocallySorted R (filter P l)A: Type
R: A → A → Prop
HT: Transitive R
P: A → Prop
Pdec: ∀ a : A, Decision (P a)∀ l : list A, LocallySorted R l → LocallySorted R (filter P l)by apply ForAllSuffix2_filter. Qed.A: Type
R: A → A → Prop
HT: Transitive R
P: A → Prop
Pdec: ∀ a : A, Decision (P a)∀ l : list A, ForAllSuffix2 R l → ForAllSuffix2 R (filter P l)A: Type
compare: A → A → comparison
H: CompareStrictOrder compare∀ (msg : A) (sigma : list A), LocallySorted (compare_lt compare) (msg :: sigma) → LocallySorted (compare_lt compare) sigmaA: Type
compare: A → A → comparison
H: CompareStrictOrder compare∀ (msg : A) (sigma : list A), LocallySorted (compare_lt compare) (msg :: sigma) → LocallySorted (compare_lt compare) sigmaA: Type
compare: A → A → comparison
H: CompareStrictOrder compare
msg: A
sigma: list A
H0: LocallySorted (compare_lt compare) (msg :: sigma)LocallySorted (compare_lt compare) sigmaA: Type
compare: A → A → comparison
H: CompareStrictOrder compare
msg: A
sigma: list A
H0: Sorted (compare_lt compare) (msg :: sigma)LocallySorted (compare_lt compare) sigmaby apply Sorted_LocallySorted_iff. Qed.A: Type
compare: A → A → comparison
H: CompareStrictOrder compare
msg: A
sigma: list A
H3: Sorted (compare_lt compare) sigma
H4: HdRel (compare_lt compare) msg sigmaLocallySorted (compare_lt compare) sigmaA: Type
compare: A → A → comparison
H: CompareStrictOrder compare∀ (msg : A) (sigma : list A), LocallySorted (compare_lt compare) sigma → LocallySorted (compare_lt compare) (add_in_sorted_list_fn compare msg sigma)A: Type
compare: A → A → comparison
H: CompareStrictOrder compare∀ (msg : A) (sigma : list A), LocallySorted (compare_lt compare) sigma → LocallySorted (compare_lt compare) (add_in_sorted_list_fn compare msg sigma)A: Type
compare: A → A → comparison
H: CompareStrictOrder compare
msg, a: A
Hcmpa: compare msg a = EqLocallySorted (compare_lt compare) [a]A: Type
compare: A → A → comparison
H: CompareStrictOrder compare
msg, a: A
Hcmpa: compare msg a = LtLocallySorted (compare_lt compare) [msg; a]A: Type
compare: A → A → comparison
H: CompareStrictOrder compare
msg, a: A
Hcmpa: compare msg a = GtLocallySorted (compare_lt compare) [a; msg]A: Type
compare: A → A → comparison
H: CompareStrictOrder compare
msg, a, b: A
l: list A
H0: LocallySorted (compare_lt compare) (b :: l)
H1: compare_lt compare a b
IHLocallySorted: LocallySorted (compare_lt compare) (add_in_sorted_list_fn compare msg (b :: l))
Hcmpa: compare msg a = EqLocallySorted (compare_lt compare) (a :: b :: l)A: Type
compare: A → A → comparison
H: CompareStrictOrder compare
msg, a, b: A
l: list A
H0: LocallySorted (compare_lt compare) (b :: l)
H1: compare_lt compare a b
IHLocallySorted: LocallySorted (compare_lt compare) (add_in_sorted_list_fn compare msg (b :: l))
Hcmpa: compare msg a = LtLocallySorted (compare_lt compare) (msg :: a :: b :: l)A: Type
compare: A → A → comparison
H: CompareStrictOrder compare
msg, a, b: A
l: list A
H0: LocallySorted (compare_lt compare) (b :: l)
H1: compare_lt compare a b
IHLocallySorted: LocallySorted (compare_lt compare) (add_in_sorted_list_fn compare msg (b :: l))
Hcmpa: compare msg a = GtLocallySorted (compare_lt compare) (a :: match compare msg b with | Eq => b :: l | Lt => msg :: b :: l | Gt => b :: add_in_sorted_list_fn compare msg l end)by constructor.A: Type
compare: A → A → comparison
H: CompareStrictOrder compare
msg, a: A
Hcmpa: compare msg a = EqLocallySorted (compare_lt compare) [a]by constructor; [constructor |].A: Type
compare: A → A → comparison
H: CompareStrictOrder compare
msg, a: A
Hcmpa: compare msg a = LtLocallySorted (compare_lt compare) [msg; a]A: Type
compare: A → A → comparison
H: CompareStrictOrder compare
msg, a: A
Hcmpa: compare msg a = GtLocallySorted (compare_lt compare) [a; msg]by red; rewrite compare_asymmetric, Hcmpa.A: Type
compare: A → A → comparison
H: CompareStrictOrder compare
msg, a: A
Hcmpa: compare msg a = Gtcompare_lt compare a msgby constructor.A: Type
compare: A → A → comparison
H: CompareStrictOrder compare
msg, a, b: A
l: list A
H0: LocallySorted (compare_lt compare) (b :: l)
H1: compare_lt compare a b
IHLocallySorted: LocallySorted (compare_lt compare) (add_in_sorted_list_fn compare msg (b :: l))
Hcmpa: compare msg a = EqLocallySorted (compare_lt compare) (a :: b :: l)by constructor; [constructor |].A: Type
compare: A → A → comparison
H: CompareStrictOrder compare
msg, a, b: A
l: list A
H0: LocallySorted (compare_lt compare) (b :: l)
H1: compare_lt compare a b
IHLocallySorted: LocallySorted (compare_lt compare) (add_in_sorted_list_fn compare msg (b :: l))
Hcmpa: compare msg a = LtLocallySorted (compare_lt compare) (msg :: a :: b :: l)A: Type
compare: A → A → comparison
H: CompareStrictOrder compare
msg, a, b: A
l: list A
H0: LocallySorted (compare_lt compare) (b :: l)
H1: compare_lt compare a b
IHLocallySorted: LocallySorted (compare_lt compare) (add_in_sorted_list_fn compare msg (b :: l))
Hcmpa: compare msg a = GtLocallySorted (compare_lt compare) (a :: match compare msg b with | Eq => b :: l | Lt => msg :: b :: l | Gt => b :: add_in_sorted_list_fn compare msg l end)A: Type
compare: A → A → comparison
H: CompareStrictOrder compare
msg, a, b: A
l: list A
H0: LocallySorted (compare_lt compare) (b :: l)
H1: compare_lt compare a b
IHLocallySorted: LocallySorted (compare_lt compare) match compare msg b with | Eq => b :: l | Lt => msg :: b :: l | Gt => b :: add_in_sorted_list_fn compare msg l end
Hcmpa: compare msg a = GtLocallySorted (compare_lt compare) (a :: match compare msg b with | Eq => b :: l | Lt => msg :: b :: l | Gt => b :: add_in_sorted_list_fn compare msg l end)A: Type
compare: A → A → comparison
H: CompareStrictOrder compare
msg, a, b: A
l: list A
H0: LocallySorted (compare_lt compare) (b :: l)
H1: compare_lt compare a b
Hcmpb: compare msg b = Eq
IHLocallySorted: LocallySorted (compare_lt compare) (b :: l)
Hcmpa: compare msg a = GtLocallySorted (compare_lt compare) (a :: b :: l)A: Type
compare: A → A → comparison
H: CompareStrictOrder compare
msg, a, b: A
l: list A
H0: LocallySorted (compare_lt compare) (b :: l)
H1: compare_lt compare a b
Hcmpb: compare msg b = Lt
IHLocallySorted: LocallySorted (compare_lt compare) (msg :: b :: l)
Hcmpa: compare msg a = GtLocallySorted (compare_lt compare) (a :: msg :: b :: l)A: Type
compare: A → A → comparison
H: CompareStrictOrder compare
msg, a, b: A
l: list A
H0: LocallySorted (compare_lt compare) (b :: l)
H1: compare_lt compare a b
Hcmpb: compare msg b = Gt
IHLocallySorted: LocallySorted (compare_lt compare) (b :: add_in_sorted_list_fn compare msg l)
Hcmpa: compare msg a = GtLocallySorted (compare_lt compare) (a :: b :: add_in_sorted_list_fn compare msg l)by rewrite compare_eq in Hcmpb; constructor.A: Type
compare: A → A → comparison
H: CompareStrictOrder compare
msg, a, b: A
l: list A
H0: LocallySorted (compare_lt compare) (b :: l)
H1: compare_lt compare a b
Hcmpb: compare msg b = Eq
IHLocallySorted: LocallySorted (compare_lt compare) (b :: l)
Hcmpa: compare msg a = GtLocallySorted (compare_lt compare) (a :: b :: l)A: Type
compare: A → A → comparison
H: CompareStrictOrder compare
msg, a, b: A
l: list A
H0: LocallySorted (compare_lt compare) (b :: l)
H1: compare_lt compare a b
Hcmpb: compare msg b = Lt
IHLocallySorted: LocallySorted (compare_lt compare) (msg :: b :: l)
Hcmpa: compare msg a = GtLocallySorted (compare_lt compare) (a :: msg :: b :: l)by red; rewrite compare_asymmetric, Hcmpa.A: Type
compare: A → A → comparison
H: CompareStrictOrder compare
msg, a, b: A
l: list A
H0: LocallySorted (compare_lt compare) (b :: l)
H1: compare_lt compare a b
Hcmpb: compare msg b = Lt
IHLocallySorted: LocallySorted (compare_lt compare) (msg :: b :: l)
Hcmpa: compare msg a = Gtcompare_lt compare a msgby constructor. Qed.A: Type
compare: A → A → comparison
H: CompareStrictOrder compare
msg, a, b: A
l: list A
H0: LocallySorted (compare_lt compare) (b :: l)
H1: compare_lt compare a b
Hcmpb: compare msg b = Gt
IHLocallySorted: LocallySorted (compare_lt compare) (b :: add_in_sorted_list_fn compare msg l)
Hcmpa: compare msg a = GtLocallySorted (compare_lt compare) (a :: b :: add_in_sorted_list_fn compare msg l)
A: Type
lt: relation A
H: StrictOrder lt∀ (x y : A) (s : list A), LocallySorted lt (y :: s) → x ∈ s → lt y xA: Type
lt: relation A
H: StrictOrder lt∀ (x y : A) (s : list A), LocallySorted lt (y :: s) → x ∈ s → lt y xA: Type
lt: relation A
H: StrictOrder lt
x, y: A
s: list A
LS: LocallySorted lt (y :: s)
IN: x ∈ slt y xA: Type
lt: relation A
H: StrictOrder lt
s: list A∀ y x : A, LocallySorted lt (y :: s) → x ∈ s → lt y xA: Type
lt: relation A
H: StrictOrder lt∀ y x : A, LocallySorted lt [y] → x ∈ [] → lt y xA: Type
lt: relation A
H: StrictOrder lt
a: A
s: list A
IHs: ∀ y x : A, LocallySorted lt (y :: s) → x ∈ s → lt y x∀ y x : A, LocallySorted lt (y :: a :: s) → x ∈ a :: s → lt y xby inversion 2.A: Type
lt: relation A
H: StrictOrder lt∀ y x : A, LocallySorted lt [y] → x ∈ [] → lt y xby do 2 inversion 1; subst; firstorder. Qed.A: Type
lt: relation A
H: StrictOrder lt
a: A
s: list A
IHs: ∀ y x : A, LocallySorted lt (y :: s) → x ∈ s → lt y x∀ y x : A, LocallySorted lt (y :: a :: s) → x ∈ a :: s → lt y xA: Type
compare: A → A → comparison
H: CompareStrictOrder compare∀ (msg : A) (sigma : list A), LocallySorted (compare_lt compare) sigma → msg ∈ sigma → add_in_sorted_list_fn compare msg sigma = sigmaA: Type
compare: A → A → comparison
H: CompareStrictOrder compare∀ (msg : A) (sigma : list A), LocallySorted (compare_lt compare) sigma → msg ∈ sigma → add_in_sorted_list_fn compare msg sigma = sigmaA: Type
compare: A → A → comparison
H: CompareStrictOrder compare
msg, a: A
sigma: list A
IHsigma: LocallySorted (compare_lt compare) sigma → msg ∈ sigma → add_in_sorted_list_fn compare msg sigma = sigma
H0: LocallySorted (compare_lt compare) (a :: sigma)
H1: msg ∈ a :: sigmaadd_in_sorted_list_fn compare msg (a :: sigma) = a :: sigmaA: Type
compare: A → A → comparison
H: CompareStrictOrder compare
msg, a: A
sigma: list A
IHsigma: LocallySorted (compare_lt compare) sigma → msg ∈ sigma → add_in_sorted_list_fn compare msg sigma = sigma
H0: LocallySorted (compare_lt compare) (a :: sigma)
H1: msg = a ∨ msg ∈ sigmaadd_in_sorted_list_fn compare msg (a :: sigma) = a :: sigmaA: Type
compare: A → A → comparison
H: CompareStrictOrder compare
msg, a: A
sigma: list A
IHsigma: LocallySorted (compare_lt compare) sigma → msg ∈ sigma → add_in_sorted_list_fn compare msg sigma = sigma
H0: LocallySorted (compare_lt compare) (a :: sigma)
Heq: msg = aadd_in_sorted_list_fn compare msg (a :: sigma) = a :: sigmaA: Type
compare: A → A → comparison
H: CompareStrictOrder compare
msg, a: A
sigma: list A
IHsigma: LocallySorted (compare_lt compare) sigma → msg ∈ sigma → add_in_sorted_list_fn compare msg sigma = sigma
H0: LocallySorted (compare_lt compare) (a :: sigma)
Hin: msg ∈ sigmaadd_in_sorted_list_fn compare msg (a :: sigma) = a :: sigmaby subst; simpl; rewrite compare_eq_refl.A: Type
compare: A → A → comparison
H: CompareStrictOrder compare
msg, a: A
sigma: list A
IHsigma: LocallySorted (compare_lt compare) sigma → msg ∈ sigma → add_in_sorted_list_fn compare msg sigma = sigma
H0: LocallySorted (compare_lt compare) (a :: sigma)
Heq: msg = aadd_in_sorted_list_fn compare msg (a :: sigma) = a :: sigmaA: Type
compare: A → A → comparison
H: CompareStrictOrder compare
msg, a: A
sigma: list A
IHsigma: LocallySorted (compare_lt compare) sigma → msg ∈ sigma → add_in_sorted_list_fn compare msg sigma = sigma
H0: LocallySorted (compare_lt compare) (a :: sigma)
Hin: msg ∈ sigmaadd_in_sorted_list_fn compare msg (a :: sigma) = a :: sigmaA: Type
compare: A → A → comparison
H: CompareStrictOrder compare
msg, a: A
sigma: list A
IHsigma: LocallySorted (compare_lt compare) sigma → msg ∈ sigma → add_in_sorted_list_fn compare msg sigma = sigma
H0: LocallySorted (compare_lt compare) (a :: sigma)
Hin: msg ∈ sigma
LS: LocallySorted (compare_lt compare) sigmaadd_in_sorted_list_fn compare msg (a :: sigma) = a :: sigmaA: Type
compare: A → A → comparison
H: CompareStrictOrder compare
msg, a: A
sigma: list A
IHsigma: add_in_sorted_list_fn compare msg sigma = sigma
H0: LocallySorted (compare_lt compare) (a :: sigma)
Hin: msg ∈ sigma
LS: LocallySorted (compare_lt compare) sigmaadd_in_sorted_list_fn compare msg (a :: sigma) = a :: sigmaA: Type
compare: A → A → comparison
H: CompareStrictOrder compare
msg, a: A
sigma: list A
IHsigma: add_in_sorted_list_fn compare msg sigma = sigma
H0: LocallySorted (compare_lt compare) (a :: sigma)
Hin: msg ∈ sigma
LS: LocallySorted (compare_lt compare) sigmamatch compare msg a with | Eq => a :: sigma | Lt => msg :: a :: sigma | Gt => a :: add_in_sorted_list_fn compare msg sigma end = a :: sigmaA: Type
compare: A → A → comparison
H: CompareStrictOrder compare
msg, a: A
sigma: list A
IHsigma: add_in_sorted_list_fn compare msg sigma = sigma
H0: LocallySorted (compare_lt compare) (a :: sigma)
Hin: msg ∈ sigma
LS: LocallySorted (compare_lt compare) sigma
Hcmp: compare msg a = Ltmsg :: a :: sigma = a :: sigmaA: Type
compare: A → A → comparison
H: CompareStrictOrder compare
msg, a: A
sigma: list A
IHsigma: add_in_sorted_list_fn compare msg sigma = sigma
H0: LocallySorted (compare_lt compare) (a :: sigma)
Hin: compare_lt compare a msg
LS: LocallySorted (compare_lt compare) sigma
Hcmp: compare msg a = Ltmsg :: a :: sigma = a :: sigmaby rewrite compare_asymmetric, Hcmp in Hin; inversion Hin. Qed.A: Type
compare: A → A → comparison
H: CompareStrictOrder compare
msg, a: A
sigma: list A
IHsigma: add_in_sorted_list_fn compare msg sigma = sigma
H0: LocallySorted (compare_lt compare) (a :: sigma)
Hin: compare a msg = Lt
LS: LocallySorted (compare_lt compare) sigma
Hcmp: compare msg a = Ltmsg :: a :: sigma = a :: sigmaA: Type
lt: relation A
H: StrictOrder lt∀ (x1 x2 : A) (s1 s2 : list A), LocallySorted lt (x1 :: s1) → LocallySorted lt (x2 :: s2) → set_eq (x1 :: s1) (x2 :: s2) → x1 = x2 ∧ set_eq s1 s2A: Type
lt: relation A
H: StrictOrder lt∀ (x1 x2 : A) (s1 s2 : list A), LocallySorted lt (x1 :: s1) → LocallySorted lt (x2 :: s2) → set_eq (x1 :: s1) (x2 :: s2) → x1 = x2 ∧ set_eq s1 s2A: Type
lt: relation A
H: StrictOrder lt
x1, x2: A
s1, s2: list A
LS1: LocallySorted lt (x1 :: s1)
LS2: LocallySorted lt (x2 :: s2)
IN1: x1 :: s1 ⊆ x2 :: s2
IN2: x2 :: s2 ⊆ x1 :: s1x1 = x2 ∧ set_eq s1 s2A: Type
lt: relation A
H: StrictOrder lt
x1, x2: A
s1, s2: list A
LS1: LocallySorted lt (x1 :: s1)
LS2: LocallySorted lt (x2 :: s2)
IN1: x1 :: s1 ⊆ x2 :: s2
IN2: x2 :: s2 ⊆ x1 :: s1x1 = x2A: Type
lt: relation A
H: StrictOrder lt
x1, x2: A
s1, s2: list A
LS1: LocallySorted lt (x1 :: s1)
LS2: LocallySorted lt (x2 :: s2)
IN1: x1 :: s1 ⊆ x2 :: s2
IN2: x2 :: s2 ⊆ x1 :: s1
x12: x1 = x2x1 = x2 ∧ set_eq s1 s2A: Type
lt: relation A
H: StrictOrder lt
x1, x2: A
s1, s2: list A
LS1: LocallySorted lt (x1 :: s1)
LS2: LocallySorted lt (x2 :: s2)
IN1: x1 :: s1 ⊆ x2 :: s2
IN2: x2 :: s2 ⊆ x1 :: s1x1 = x2A: Type
lt: relation A
H: StrictOrder lt
x1, x2: A
s1, s2: list A
LS1: LocallySorted lt (x1 :: s1)
LS2: LocallySorted lt (x2 :: s2)
IN1: x1 ∈ x1 :: s1 → x1 ∈ x2 :: s2
IN2: x2 :: s2 ⊆ x1 :: s1x1 = x2A: Type
lt: relation A
H: StrictOrder lt
x1, x2: A
s1, s2: list A
LS1: LocallySorted lt (x1 :: s1)
LS2: LocallySorted lt (x2 :: s2)
IN1: x1 = x1 ∨ x1 ∈ s1 → x1 = x2 ∨ x1 ∈ s2
IN2: x2 :: s2 ⊆ x1 :: s1x1 = x2A: Type
lt: relation A
H: StrictOrder lt
x1, x2: A
s1, s2: list A
LS1: LocallySorted lt (x1 :: s1)
LS2: LocallySorted lt (x2 :: s2)
IN1: x1 = x2 ∨ x1 ∈ s2
IN2: x2 :: s2 ⊆ x1 :: s1x1 = x2A: Type
lt: relation A
H: StrictOrder lt
x1, x2: A
s1, s2: list A
LS1: LocallySorted lt (x1 :: s1)
LS2: LocallySorted lt (x2 :: s2)
H0: x1 ∈ s2
IN2: x2 :: s2 ⊆ x1 :: s1x1 = x2A: Type
lt: relation A
H: StrictOrder lt
x1, x2: A
s1, s2: list A
LS1: LocallySorted lt (x1 :: s1)
LS2: LocallySorted lt (x2 :: s2)
H0: x1 ∈ s2
IN2: x2 ∈ x2 :: s2 → x2 ∈ x1 :: s1x1 = x2A: Type
lt: relation A
H: StrictOrder lt
x1, x2: A
s1, s2: list A
LS1: LocallySorted lt (x1 :: s1)
LS2: LocallySorted lt (x2 :: s2)
H0: x1 ∈ s2
IN2: x2 = x2 ∨ x2 ∈ s2 → x2 = x1 ∨ x2 ∈ s1x1 = x2A: Type
lt: relation A
H: StrictOrder lt
x1, x2: A
s1, s2: list A
LS1: LocallySorted lt (x1 :: s1)
LS2: LocallySorted lt (x2 :: s2)
H0: x1 ∈ s2
IN2: x2 = x1 ∨ x2 ∈ s1x1 = x2A: Type
lt: relation A
H: StrictOrder lt
x1, x2: A
s1, s2: list A
LS1: LocallySorted lt (x1 :: s1)
LS2: LocallySorted lt (x2 :: s2)
H0: x1 ∈ s2
H1: x2 ∈ s1x1 = x2A: Type
lt: relation A
H: StrictOrder lt
x1, x2: A
s1, s2: list A
LS1: LocallySorted lt (x1 :: s1)
LS2: LocallySorted lt (x2 :: s2)
H0: x1 ∈ s2
H1: x2 ∈ s1
H2: lt x1 x2x1 = x2A: Type
lt: relation A
H: StrictOrder lt
x1, x2: A
s1, s2: list A
LS1: LocallySorted lt (x1 :: s1)
LS2: LocallySorted lt (x2 :: s2)
H0: x1 ∈ s2
H1: x2 ∈ s1
H2: lt x1 x2
H3: lt x2 x1x1 = x2A: Type
lt: relation A
H: StrictOrder lt
x1, x2: A
s1, s2: list A
LS1: LocallySorted lt (x1 :: s1)
LS2: LocallySorted lt (x2 :: s2)
H0: x1 ∈ s2
H1: x2 ∈ s1
H2: lt x1 x2
H3: lt x2 x1
ltIrr: complement lt x1 x1x1 = x2by pose proof (Htr x1 x2 x1 H2 H3) as Hlt.A: Type
lt: relation A
Hirr: Irreflexive lt
Htr: Transitive lt
x1, x2: A
s1, s2: list A
LS1: LocallySorted lt (x1 :: s1)
LS2: LocallySorted lt (x2 :: s2)
H0: x1 ∈ s2
H1: x2 ∈ s1
H2: lt x1 x2
H3: lt x2 x1
ltIrr: complement lt x1 x1x1 = x2A: Type
lt: relation A
H: StrictOrder lt
x1, x2: A
s1, s2: list A
LS1: LocallySorted lt (x1 :: s1)
LS2: LocallySorted lt (x2 :: s2)
IN1: x1 :: s1 ⊆ x2 :: s2
IN2: x2 :: s2 ⊆ x1 :: s1
x12: x1 = x2x1 = x2 ∧ set_eq s1 s2A: Type
lt: relation A
H: StrictOrder lt
x2: A
s1, s2: list A
LS1: LocallySorted lt (x2 :: s1)
LS2: LocallySorted lt (x2 :: s2)
IN2: x2 :: s2 ⊆ x2 :: s1
IN1: x2 :: s1 ⊆ x2 :: s2x2 = x2 ∧ set_eq s1 s2A: Type
lt: relation A
H: StrictOrder lt
x2: A
s1, s2: list A
LS1: LocallySorted lt (x2 :: s1)
LS2: LocallySorted lt (x2 :: s2)
IN2: x2 :: s2 ⊆ x2 :: s1
IN1: x2 :: s1 ⊆ x2 :: s2set_eq s1 s2A: Type
lt: relation A
H: StrictOrder lt
x2: A
s1, s2: list A
LS1: LocallySorted lt (x2 :: s1)
LS2: LocallySorted lt (x2 :: s2)
IN2: x2 :: s2 ⊆ x2 :: s1
IN1: x2 :: s1 ⊆ x2 :: s2s1 ⊆ s2A: Type
lt: relation A
H: StrictOrder lt
x2: A
s1, s2: list A
LS1: LocallySorted lt (x2 :: s1)
LS2: LocallySorted lt (x2 :: s2)
IN2: x2 :: s2 ⊆ x2 :: s1
IN1: x2 :: s1 ⊆ x2 :: s2s2 ⊆ s1A: Type
lt: relation A
H: StrictOrder lt
x2: A
s1, s2: list A
LS1: LocallySorted lt (x2 :: s1)
LS2: LocallySorted lt (x2 :: s2)
IN2: x2 :: s2 ⊆ x2 :: s1
IN1: x2 :: s1 ⊆ x2 :: s2s1 ⊆ s2A: Type
lt: relation A
H: StrictOrder lt
x2: A
s1, s2: list A
LS1: LocallySorted lt (x2 :: s1)
LS2: LocallySorted lt (x2 :: s2)
IN2: x2 :: s2 ⊆ x2 :: s1
IN1: x2 :: s1 ⊆ x2 :: s2
x: A
Hx: x ∈ s1x ∈ s2A: Type
lt: relation A
H: StrictOrder lt
x2: A
s1, s2: list A
LS1: LocallySorted lt (x2 :: s1)
LS2: LocallySorted lt (x2 :: s2)
IN2: x2 :: s2 ⊆ x2 :: s1
IN1: x2 :: s1 ⊆ x2 :: s2
x: A
Hx: x ∈ s1
H0: lt x2 xx ∈ s2A: Type
lt: relation A
H: StrictOrder lt
x2: A
s1, s2: list A
LS1: LocallySorted lt (x2 :: s1)
LS2: LocallySorted lt (x2 :: s2)
IN2: x2 :: s2 ⊆ x2 :: s1
x: A
IN1: x ∈ x2 :: s1 → x ∈ x2 :: s2
Hx: x ∈ s1
H0: lt x2 xx ∈ s2A: Type
lt: relation A
H: StrictOrder lt
x2: A
s1, s2: list A
LS1: LocallySorted lt (x2 :: s1)
LS2: LocallySorted lt (x2 :: s2)
IN2: x2 :: s2 ⊆ x2 :: s1
x: A
IN1: x = x2 ∨ x ∈ s1 → x ∈ x2 :: s2
Hx: x ∈ s1
H0: lt x2 xx ∈ s2A: Type
lt: relation A
H: StrictOrder lt
x2: A
s1, s2: list A
LS1: LocallySorted lt (x2 :: s1)
LS2: LocallySorted lt (x2 :: s2)
IN2: x2 :: s2 ⊆ x2 :: s1
x: A
IN1: x ∈ x2 :: s2
Hx: x ∈ s1
H0: lt x2 xx ∈ s2A: Type
lt: relation A
H: StrictOrder lt
x2: A
s1, s2: list A
LS1: LocallySorted lt (x2 :: s1)
LS2: LocallySorted lt (x2 :: s2)
IN2: x2 :: s2 ⊆ x2 :: s1
x: A
IN1: x = x2 ∨ x ∈ s2
Hx: x ∈ s1
H0: lt x2 xx ∈ s2A: Type
lt: relation A
H: StrictOrder lt
x2: A
s1, s2: list A
LS1: LocallySorted lt (x2 :: s1)
LS2: LocallySorted lt (x2 :: s2)
IN2: x2 :: s2 ⊆ x2 :: s1
x: A
H1: x = x2
Hx: x ∈ s1
H0: lt x2 xx ∈ s2by apply StrictOrder_Irreflexive in H0.A: Type
lt: relation A
H: StrictOrder lt
x2: A
s1, s2: list A
LS1: LocallySorted lt (x2 :: s1)
LS2: LocallySorted lt (x2 :: s2)
IN2: x2 :: s2 ⊆ x2 :: s1
H0: lt x2 x2
Hx: x2 ∈ s1x2 ∈ s2A: Type
lt: relation A
H: StrictOrder lt
x2: A
s1, s2: list A
LS1: LocallySorted lt (x2 :: s1)
LS2: LocallySorted lt (x2 :: s2)
IN2: x2 :: s2 ⊆ x2 :: s1
IN1: x2 :: s1 ⊆ x2 :: s2s2 ⊆ s1A: Type
lt: relation A
H: StrictOrder lt
x2: A
s1, s2: list A
LS1: LocallySorted lt (x2 :: s1)
LS2: LocallySorted lt (x2 :: s2)
IN2: x2 :: s2 ⊆ x2 :: s1
IN1: x2 :: s1 ⊆ x2 :: s2
x: A
Hx: x ∈ s2x ∈ s1A: Type
lt: relation A
H: StrictOrder lt
x2: A
s1, s2: list A
LS1: LocallySorted lt (x2 :: s1)
LS2: LocallySorted lt (x2 :: s2)
IN2: x2 :: s2 ⊆ x2 :: s1
IN1: x2 :: s1 ⊆ x2 :: s2
x: A
Hx: x ∈ s2
H0: lt x2 xx ∈ s1A: Type
lt: relation A
H: StrictOrder lt
x2: A
s1, s2: list A
LS1: LocallySorted lt (x2 :: s1)
LS2: LocallySorted lt (x2 :: s2)
x: A
IN2: x ∈ x2 :: s2 → x ∈ x2 :: s1
IN1: x2 :: s1 ⊆ x2 :: s2
Hx: x ∈ s2
H0: lt x2 xx ∈ s1A: Type
lt: relation A
H: StrictOrder lt
x2: A
s1, s2: list A
LS1: LocallySorted lt (x2 :: s1)
LS2: LocallySorted lt (x2 :: s2)
x: A
IN2: x = x2 ∨ x ∈ s2 → x ∈ x2 :: s1
IN1: x2 :: s1 ⊆ x2 :: s2
Hx: x ∈ s2
H0: lt x2 xx ∈ s1A: Type
lt: relation A
H: StrictOrder lt
x2: A
s1, s2: list A
LS1: LocallySorted lt (x2 :: s1)
LS2: LocallySorted lt (x2 :: s2)
x: A
IN2: x ∈ x2 :: s1
IN1: x2 :: s1 ⊆ x2 :: s2
Hx: x ∈ s2
H0: lt x2 xx ∈ s1A: Type
lt: relation A
H: StrictOrder lt
x2: A
s1, s2: list A
LS1: LocallySorted lt (x2 :: s1)
LS2: LocallySorted lt (x2 :: s2)
x: A
IN2: x = x2 ∨ x ∈ s1
IN1: x2 :: s1 ⊆ x2 :: s2
Hx: x ∈ s2
H0: lt x2 xx ∈ s1A: Type
lt: relation A
H: StrictOrder lt
x2: A
s1, s2: list A
LS1: LocallySorted lt (x2 :: s1)
LS2: LocallySorted lt (x2 :: s2)
x: A
H1: x = x2
IN1: x2 :: s1 ⊆ x2 :: s2
Hx: x ∈ s2
H0: lt x2 xx ∈ s1by apply StrictOrder_Irreflexive in H0. Qed.A: Type
lt: relation A
H: StrictOrder lt
x2: A
s1, s2: list A
LS1: LocallySorted lt (x2 :: s1)
LS2: LocallySorted lt (x2 :: s2)
IN1: x2 :: s1 ⊆ x2 :: s2
H0: lt x2 x2
Hx: x2 ∈ s2x2 ∈ s1A: Type
lt: relation A
H: StrictOrder lt∀ s1 s2 : list A, LocallySorted lt s1 → LocallySorted lt s2 → set_eq s1 s2 ↔ s1 = s2A: Type
lt: relation A
H: StrictOrder lt∀ s1 s2 : list A, LocallySorted lt s1 → LocallySorted lt s2 → set_eq s1 s2 ↔ s1 = s2A: Type
lt: relation A
H: StrictOrder lt
s1, s2: list A
LS1: LocallySorted lt s1
LS2: LocallySorted lt s2set_eq s1 s2 ↔ s1 = s2A: Type
lt: relation A
SO: StrictOrder lt
s1, s2: list A
LS1: LocallySorted lt s1
LS2: LocallySorted lt s2set_eq s1 s2 ↔ s1 = s2A: Type
lt: relation A
SO: StrictOrder lt
s1, s2: list A
LS1: LocallySorted lt s1
LS2: LocallySorted lt s2
SO': StrictOrder ltset_eq s1 s2 ↔ s1 = s2A: Type
lt: relation A
SO: StrictOrder lt
s1, s2: list A
LS1: LocallySorted lt s1
LS2: LocallySorted lt s2
IR: Irreflexive lt
TR: Transitive ltset_eq s1 s2 ↔ s1 = s2A: Type
lt: relation A
SO: StrictOrder lt
s1, s2: list A
LS1: LocallySorted lt s1
LS2: LocallySorted lt s2
IR: Irreflexive lt
TR: Transitive ltset_eq s1 s2 → s1 = s2A: Type
lt: relation A
SO: StrictOrder lt
s1: list A
LS1: LocallySorted lt s1
IR: Irreflexive lt
TR: Transitive lt∀ s2 : list A, LocallySorted lt s2 → set_eq s1 s2 → s1 = s2A: Type
lt: relation A
SO: StrictOrder lt
LS1: LocallySorted lt []
IR: Irreflexive lt
TR: Transitive lt
a: A
s2: list A
LS2: LocallySorted lt (a :: s2)
H: set_eq [] (a :: s2)[] = a :: s2A: Type
lt: relation A
SO: StrictOrder lt
a: A
s1: list A
LS1: LocallySorted lt (a :: s1)
IR: Irreflexive lt
TR: Transitive lt
IHs1: LocallySorted lt s1 → ∀ s2 : list A, LocallySorted lt s2 → set_eq s1 s2 → s1 = s2
LS2: LocallySorted lt []
H: set_eq (a :: s1) []a :: s1 = []A: Type
lt: relation A
SO: StrictOrder lt
a: A
s1: list A
LS1: LocallySorted lt (a :: s1)
IR: Irreflexive lt
TR: Transitive lt
IHs1: LocallySorted lt s1 → ∀ s2 : list A, LocallySorted lt s2 → set_eq s1 s2 → s1 = s2
a0: A
s2: list A
LS2: LocallySorted lt (a0 :: s2)
H: set_eq (a :: s1) (a0 :: s2)a :: s1 = a0 :: s2by destruct H as [_ H]; apply list_nil_subseteq in H.A: Type
lt: relation A
SO: StrictOrder lt
LS1: LocallySorted lt []
IR: Irreflexive lt
TR: Transitive lt
a: A
s2: list A
LS2: LocallySorted lt (a :: s2)
H: set_eq [] (a :: s2)[] = a :: s2by destruct H as [H _]; apply list_nil_subseteq in H.A: Type
lt: relation A
SO: StrictOrder lt
a: A
s1: list A
LS1: LocallySorted lt (a :: s1)
IR: Irreflexive lt
TR: Transitive lt
IHs1: LocallySorted lt s1 → ∀ s2 : list A, LocallySorted lt s2 → set_eq s1 s2 → s1 = s2
LS2: LocallySorted lt []
H: set_eq (a :: s1) []a :: s1 = []A: Type
lt: relation A
SO: StrictOrder lt
a: A
s1: list A
LS1: LocallySorted lt (a :: s1)
IR: Irreflexive lt
TR: Transitive lt
IHs1: LocallySorted lt s1 → ∀ s2 : list A, LocallySorted lt s2 → set_eq s1 s2 → s1 = s2
a0: A
s2: list A
LS2: LocallySorted lt (a0 :: s2)
H: set_eq (a :: s1) (a0 :: s2)a :: s1 = a0 :: s2A: Type
lt: relation A
SO: StrictOrder lt
a: A
s1: list A
LS1: LocallySorted lt (a :: s1)
IR: Irreflexive lt
TR: Transitive lt
IHs1: LocallySorted lt s1 → ∀ s2 : list A, LocallySorted lt s2 → set_eq s1 s2 → s1 = s2
a0: A
s2: list A
LS2: LocallySorted lt (a0 :: s2)
H: a = a0 ∧ set_eq s1 s2a :: s1 = a0 :: s2A: Type
lt: relation A
SO: StrictOrder lt
s1: list A
a0: A
LS1: LocallySorted lt (a0 :: s1)
IR: Irreflexive lt
TR: Transitive lt
IHs1: LocallySorted lt s1 → ∀ s2 : list A, LocallySorted lt s2 → set_eq s1 s2 → s1 = s2
s2: list A
LS2: LocallySorted lt (a0 :: s2)
H0: set_eq s1 s2a0 :: s1 = a0 :: s2A: Type
lt: relation A
SO: StrictOrder lt
s1: list A
a0: A
LS1: Sorted lt s1
IR: Irreflexive lt
TR: Transitive lt
IHs1: LocallySorted lt s1 → ∀ s2 : list A, LocallySorted lt s2 → set_eq s1 s2 → s1 = s2
s2: list A
LS2: LocallySorted lt (a0 :: s2)
H0: set_eq s1 s2a0 :: s1 = a0 :: s2A: Type
lt: relation A
SO: StrictOrder lt
s1: list A
a0: A
LS1: LocallySorted lt s1
IR: Irreflexive lt
TR: Transitive lt
IHs1: LocallySorted lt s1 → ∀ s2 : list A, LocallySorted lt s2 → set_eq s1 s2 → s1 = s2
s2: list A
LS2: LocallySorted lt (a0 :: s2)
H0: set_eq s1 s2a0 :: s1 = a0 :: s2A: Type
lt: relation A
SO: StrictOrder lt
s1: list A
a0: A
LS1: LocallySorted lt s1
IR: Irreflexive lt
TR: Transitive lt
IHs1: LocallySorted lt s1 → ∀ s2 : list A, LocallySorted lt s2 → set_eq s1 s2 → s1 = s2
s2: list A
LS2: Sorted lt s2
H0: set_eq s1 s2a0 :: s1 = a0 :: s2by apply (IHs1 LS1 s2 LS2) in H0; subst. Qed. (* [Transitive] isn't necessary but makes the proof simpler. *)A: Type
lt: relation A
SO: StrictOrder lt
s1: list A
a0: A
LS1: LocallySorted lt s1
IR: Irreflexive lt
TR: Transitive lt
IHs1: LocallySorted lt s1 → ∀ s2 : list A, LocallySorted lt s2 → set_eq s1 s2 → s1 = s2
s2: list A
LS2: LocallySorted lt s2
H0: set_eq s1 s2a0 :: s1 = a0 :: s2A: Type
l: list A
R: A → A → Prop
Hsorted: LocallySorted R l
Htransitive: Transitive R
alfa, beta: list A
Hconcat: l = alfa ++ betaLocallySorted R alfa ∧ LocallySorted R betaA: Type
l: list A
R: A → A → Prop
Hsorted: LocallySorted R l
Htransitive: Transitive R
alfa, beta: list A
Hconcat: l = alfa ++ betaLocallySorted R alfa ∧ LocallySorted R betaA: Type
R: A → A → Prop
Htransitive: Transitive R
alfa, beta: list A∀ l : list A, LocallySorted R l → l = alfa ++ beta → LocallySorted R alfa ∧ LocallySorted R betaA: Type
R: A → A → Prop
Htransitive: Transitive R
alfa: list A∀ beta l : list A, LocallySorted R l → l = alfa ++ beta → LocallySorted R alfa ∧ LocallySorted R betaA: Type
R: A → A → Prop
Htransitive: Transitive R∀ beta l : list A, LocallySorted R l → l = [] ++ beta → LocallySorted R [] ∧ LocallySorted R betaA: Type
R: A → A → Prop
Htransitive: Transitive R
a: A
alfa: list A
IHalfa: ∀ beta l : list A, LocallySorted R l → l = alfa ++ beta → LocallySorted R alfa ∧ LocallySorted R beta∀ beta l : list A, LocallySorted R l → l = (a :: alfa) ++ beta → LocallySorted R (a :: alfa) ∧ LocallySorted R betaA: Type
R: A → A → Prop
Htransitive: Transitive R∀ beta l : list A, LocallySorted R l → l = [] ++ beta → LocallySorted R [] ∧ LocallySorted R betaA: Type
R: A → A → Prop
Htransitive: Transitive R
beta, l: list A
Hsorted: LocallySorted R l
Hconcat: l = [] ++ betaLocallySorted R [] ∧ LocallySorted R betaA: Type
R: A → A → Prop
Htransitive: Transitive R
beta, l: list A
Hsorted: LocallySorted R l
Hconcat: l = [] ++ betaLocallySorted R []A: Type
R: A → A → Prop
Htransitive: Transitive R
beta, l: list A
Hsorted: LocallySorted R l
Hconcat: l = [] ++ betaLocallySorted R betaby apply LSorted_nil.A: Type
R: A → A → Prop
Htransitive: Transitive R
beta, l: list A
Hsorted: LocallySorted R l
Hconcat: l = [] ++ betaLocallySorted R []by simpl in *; rewrite Hconcat in Hsorted.A: Type
R: A → A → Prop
Htransitive: Transitive R
beta, l: list A
Hsorted: LocallySorted R l
Hconcat: l = [] ++ betaLocallySorted R betaA: Type
R: A → A → Prop
Htransitive: Transitive R
a: A
alfa: list A
IHalfa: ∀ beta l : list A, LocallySorted R l → l = alfa ++ beta → LocallySorted R alfa ∧ LocallySorted R beta∀ beta l : list A, LocallySorted R l → l = (a :: alfa) ++ beta → LocallySorted R (a :: alfa) ∧ LocallySorted R betaA: Type
R: A → A → Prop
Htransitive: Transitive R
a: A
alfa: list A
IHalfa: ∀ beta l : list A, LocallySorted R l → l = alfa ++ beta → LocallySorted R alfa ∧ LocallySorted R beta
beta, l: list A
Hsorted: LocallySorted R l
Hconcat: l = (a :: alfa) ++ betaLocallySorted R (a :: alfa) ∧ LocallySorted R betaA: Type
R: A → A → Prop
Htransitive: Transitive R
a: A
alfa: list A
IHalfa: ∀ beta l : list A, LocallySorted R l → l = alfa ++ beta → LocallySorted R alfa ∧ LocallySorted R beta
beta, l: list A
Hsorted: Sorted R l
Hconcat: l = (a :: alfa) ++ betaLocallySorted R (a :: alfa) ∧ LocallySorted R betaA: Type
R: A → A → Prop
Htransitive: Transitive R
a: A
alfa: list A
IHalfa: ∀ beta l : list A, LocallySorted R l → l = alfa ++ beta → LocallySorted R alfa ∧ LocallySorted R beta
beta, l: list A
Hsorted: StronglySorted R l
Hconcat: l = (a :: alfa) ++ betaLocallySorted R (a :: alfa) ∧ LocallySorted R betaA: Type
R: A → A → Prop
Htransitive: Transitive R
a: A
alfa: list A
IHalfa: ∀ beta l : list A, LocallySorted R l → l = alfa ++ beta → LocallySorted R alfa ∧ LocallySorted R beta
beta, l: list A
Hsorted: StronglySorted R ((a :: alfa) ++ beta)
Hconcat: l = (a :: alfa) ++ betaLocallySorted R (a :: alfa) ∧ LocallySorted R betaA: Type
R: A → A → Prop
Htransitive: Transitive R
a: A
alfa: list A
IHalfa: ∀ beta l : list A, LocallySorted R l → l = alfa ++ beta → LocallySorted R alfa ∧ LocallySorted R beta
beta, l: list A
Hsorted: StronglySorted R (a :: alfa ++ beta)
Hconcat: l = (a :: alfa) ++ betaLocallySorted R (a :: alfa) ∧ LocallySorted R betaA: Type
R: A → A → Prop
Htransitive: Transitive R
a: A
alfa: list A
IHalfa: ∀ beta l : list A, LocallySorted R l → l = alfa ++ beta → LocallySorted R alfa ∧ LocallySorted R beta
beta, l: list A
Hsorted: StronglySorted R (alfa ++ beta) ∧ Forall (R a) (alfa ++ beta)
Hconcat: l = (a :: alfa) ++ betaLocallySorted R (a :: alfa) ∧ LocallySorted R betaA: Type
R: A → A → Prop
Htransitive: Transitive R
a: A
alfa: list A
IHalfa: ∀ beta l : list A, LocallySorted R l → l = alfa ++ beta → LocallySorted R alfa ∧ LocallySorted R beta
beta, l: list A
H: StronglySorted R (alfa ++ beta)
H0: Forall (R a) (alfa ++ beta)
Hconcat: l = (a :: alfa) ++ betaLocallySorted R (a :: alfa) ∧ LocallySorted R betaA: Type
R: A → A → Prop
Htransitive: Transitive R
a: A
alfa, beta: list A
IHalfa: LocallySorted R (alfa ++ beta) → alfa ++ beta = alfa ++ beta → LocallySorted R alfa ∧ LocallySorted R beta
l: list A
H: StronglySorted R (alfa ++ beta)
H0: Forall (R a) (alfa ++ beta)
Hconcat: l = (a :: alfa) ++ betaLocallySorted R (a :: alfa) ∧ LocallySorted R betaA: Type
R: A → A → Prop
Htransitive: Transitive R
a: A
alfa, beta, l: list A
H: StronglySorted R (alfa ++ beta)
H0: Forall (R a) (alfa ++ beta)
Hconcat: l = (a :: alfa) ++ beta
IHalfa: alfa ++ beta = alfa ++ beta → LocallySorted R alfa ∧ LocallySorted R betaLocallySorted R (a :: alfa) ∧ LocallySorted R betaA: Type
R: A → A → Prop
Htransitive: Transitive R
a: A
alfa, beta, l: list A
H: StronglySorted R (alfa ++ beta)
H0: Forall (R a) (alfa ++ beta)
Hconcat: l = (a :: alfa) ++ beta
IHalfa: alfa ++ beta = alfa ++ beta → LocallySorted R alfa ∧ LocallySorted R beta
H1: LocallySorted R alfa
H2: LocallySorted R betaLocallySorted R (a :: alfa) ∧ LocallySorted R betaA: Type
R: A → A → Prop
Htransitive: Transitive R
a: A
alfa, beta, l: list A
H: StronglySorted R (alfa ++ beta)
H0: Forall (R a) (alfa ++ beta)
Hconcat: l = (a :: alfa) ++ beta
IHalfa: alfa ++ beta = alfa ++ beta → LocallySorted R alfa ∧ LocallySorted R beta
H1: LocallySorted R alfa
H2: LocallySorted R betaLocallySorted R (a :: alfa)A: Type
R: A → A → Prop
Htransitive: Transitive R
a, a0: A
alfa, beta, l: list A
H: StronglySorted R ((a0 :: alfa) ++ beta)
H0: Forall (R a) ((a0 :: alfa) ++ beta)
Hconcat: l = (a :: a0 :: alfa) ++ beta
IHalfa: (a0 :: alfa) ++ beta = (a0 :: alfa) ++ beta → LocallySorted R (a0 :: alfa) ∧ LocallySorted R beta
H1: LocallySorted R (a0 :: alfa)
H2: LocallySorted R betaR a a0apply H0; left. Qed.A: Type
R: A → A → Prop
Htransitive: Transitive R
a, a0: A
alfa, beta, l: list A
H: StronglySorted R ((a0 :: alfa) ++ beta)
H0: ∀ x : A, x ∈ (a0 :: alfa) ++ beta → R a x
Hconcat: l = (a :: a0 :: alfa) ++ beta
IHalfa: (a0 :: alfa) ++ beta = (a0 :: alfa) ++ beta → LocallySorted R (a0 :: alfa) ∧ LocallySorted R beta
H1: LocallySorted R (a0 :: alfa)
H2: LocallySorted R betaR a a0A: Type
l: list A
R: A → A → Prop
Hsorted: LocallySorted R l
Htransitive: Transitive R
x, y: A
alfa, beta, gamma: list A
Hconcat: l = alfa ++ [x] ++ beta ++ [y] ++ gammaR x yA: Type
l: list A
R: A → A → Prop
Hsorted: LocallySorted R l
Htransitive: Transitive R
x, y: A
alfa, beta, gamma: list A
Hconcat: l = alfa ++ [x] ++ beta ++ [y] ++ gammaR x yA: Type
l: list A
R: A → A → Prop
Hsorted: LocallySorted R l
Htransitive: Transitive R
x, y: A
alfa, beta, gamma: list A
Hconcat: LocallySorted R alfa ∧ LocallySorted R ([x] ++ beta ++ [y] ++ gamma)R x yA: Type
l: list A
R: A → A → Prop
Hsorted: LocallySorted R l
Htransitive: Transitive R
x, y: A
alfa, beta, gamma: list A
Hneed: LocallySorted R ([x] ++ beta ++ [y] ++ gamma)R x yA: Type
l: list A
R: A → A → Prop
Hsorted: LocallySorted R l
Htransitive: Transitive R
x, y: A
alfa, beta, gamma: list A
Hneed: LocallySorted R (x :: beta ++ y :: gamma)R x yA: Type
l: list A
R: A → A → Prop
Hsorted: LocallySorted R l
Htransitive: Transitive R
x, y: A
alfa, beta, gamma: list A
Hneed: Sorted R (x :: beta ++ y :: gamma)R x yA: Type
l: list A
R: A → A → Prop
Hsorted: LocallySorted R l
Htransitive: Transitive R
x, y: A
alfa, beta, gamma: list A
Hneed: Forall (R x) (beta ++ y :: gamma)R x yA: Type
l: list A
R: A → A → Prop
Hsorted: LocallySorted R l
Htransitive: Transitive R
x, y: A
alfa, beta, gamma: list A
Hneed: ∀ x0 : A, x0 ∈ beta ++ y :: gamma → R x x0R x yA: Type
l: list A
R: A → A → Prop
Hsorted: LocallySorted R l
Htransitive: Transitive R
x, y: A
alfa, beta, gamma: list A
Hneed: y ∈ beta ++ y :: gamma → R x yR x yby apply elem_of_app; right; left. Qed.A: Type
l: list A
R: A → A → Prop
Hsorted: LocallySorted R l
Htransitive: Transitive R
x, y: A
alfa, beta, gamma: list A
Hneed: y ∈ beta ++ y :: gamma → R x yy ∈ beta ++ y :: gammaA: Type
l: list A
R: A → A → Prop
Hsorted: LocallySorted R l
Htransitive: Transitive R
x, y: A
Hin_x: x ∈ l
Hin_y: y ∈ lx = y ∨ R x y ∨ R y xA: Type
l: list A
R: A → A → Prop
Hsorted: LocallySorted R l
Htransitive: Transitive R
x, y: A
Hin_x: x ∈ l
Hin_y: y ∈ lx = y ∨ R x y ∨ R y xA: Type
l: list A
R: A → A → Prop
Hsorted: LocallySorted R l
Htransitive: Transitive R
x, y: A
Hin_x: ∃ l1 l2 : list A, l = l1 ++ x :: l2
Hin_y: y ∈ lx = y ∨ R x y ∨ R y xA: Type
l: list A
R: A → A → Prop
Hsorted: LocallySorted R l
Htransitive: Transitive R
x, y: A
pref1, suf1: list A
Hconcat1: l = pref1 ++ x :: suf1
Hin_y: y ∈ lx = y ∨ R x y ∨ R y xA: Type
l: list A
R: A → A → Prop
Hsorted: LocallySorted R l
Htransitive: Transitive R
x, y: A
pref1, suf1: list A
Hconcat1: l = pref1 ++ x :: suf1
Hin_y: y ∈ pref1 ++ x :: suf1x = y ∨ R x y ∨ R y xA: Type
l: list A
R: A → A → Prop
Hsorted: LocallySorted R l
Htransitive: Transitive R
x, y: A
pref1, suf1: list A
Hconcat1: l = pref1 ++ x :: suf1
Hin_y: y ∈ pref1 ∨ y ∈ x :: suf1x = y ∨ R x y ∨ R y xA: Type
l: list A
R: A → A → Prop
Hsorted: LocallySorted R l
Htransitive: Transitive R
x, y: A
pref1, suf1: list A
Hconcat1: l = pref1 ++ x :: suf1
Hin_y: y ∈ pref1 ∨ y = x ∨ y ∈ suf1x = y ∨ R x y ∨ R y xA: Type
l: list A
R: A → A → Prop
Hsorted: LocallySorted R l
Htransitive: Transitive R
x, y: A
pref1, suf1: list A
Hconcat1: l = pref1 ++ x :: suf1
Hin_y: y ∈ pref1 ∨ y = x ∨ y ∈ suf1y = x ∨ y ∈ pref1 ++ suf1A: Type
l: list A
R: A → A → Prop
Hsorted: LocallySorted R l
Htransitive: Transitive R
x, y: A
pref1, suf1: list A
Hconcat1: l = pref1 ++ x :: suf1
Hin_y: y ∈ pref1 ∨ y = x ∨ y ∈ suf1
H: y = x ∨ y ∈ pref1 ++ suf1x = y ∨ R x y ∨ R y xA: Type
l: list A
R: A → A → Prop
Hsorted: LocallySorted R l
Htransitive: Transitive R
x, y: A
pref1, suf1: list A
Hconcat1: l = pref1 ++ x :: suf1
Hin_y: y ∈ pref1 ∨ y = x ∨ y ∈ suf1y = x ∨ y ∈ pref1 ++ suf1A: Type
l: list A
R: A → A → Prop
Hsorted: LocallySorted R l
Htransitive: Transitive R
x, y: A
pref1, suf1: list A
Hconcat1: l = pref1 ++ x :: suf1
Hin_y: y ∈ pref1y = x ∨ y ∈ pref1 ++ suf1A: Type
l: list A
R: A → A → Prop
Hsorted: LocallySorted R l
Htransitive: Transitive R
x, y: A
pref1, suf1: list A
Hconcat1: l = pref1 ++ x :: suf1
H: y = xy = x ∨ y ∈ pref1 ++ suf1A: Type
l: list A
R: A → A → Prop
Hsorted: LocallySorted R l
Htransitive: Transitive R
x, y: A
pref1, suf1: list A
Hconcat1: l = pref1 ++ x :: suf1
H: y ∈ suf1y = x ∨ y ∈ pref1 ++ suf1by right; apply elem_of_app; left.A: Type
l: list A
R: A → A → Prop
Hsorted: LocallySorted R l
Htransitive: Transitive R
x, y: A
pref1, suf1: list A
Hconcat1: l = pref1 ++ x :: suf1
Hin_y: y ∈ pref1y = x ∨ y ∈ pref1 ++ suf1by left.A: Type
l: list A
R: A → A → Prop
Hsorted: LocallySorted R l
Htransitive: Transitive R
x, y: A
pref1, suf1: list A
Hconcat1: l = pref1 ++ x :: suf1
H: y = xy = x ∨ y ∈ pref1 ++ suf1by right; apply elem_of_app; right.A: Type
l: list A
R: A → A → Prop
Hsorted: LocallySorted R l
Htransitive: Transitive R
x, y: A
pref1, suf1: list A
Hconcat1: l = pref1 ++ x :: suf1
H: y ∈ suf1y = x ∨ y ∈ pref1 ++ suf1A: Type
l: list A
R: A → A → Prop
Hsorted: LocallySorted R l
Htransitive: Transitive R
x, y: A
pref1, suf1: list A
Hconcat1: l = pref1 ++ x :: suf1
Hin_y: y ∈ pref1 ∨ y = x ∨ y ∈ suf1
H: y = x ∨ y ∈ pref1 ++ suf1x = y ∨ R x y ∨ R y xA: Type
l: list A
R: A → A → Prop
Hsorted: LocallySorted R l
Htransitive: Transitive R
x, y: A
pref1, suf1: list A
Hconcat1: l = pref1 ++ x :: suf1
H: y = x ∨ y ∈ pref1 ++ suf1x = y ∨ R x y ∨ R y xA: Type
l: list A
R: A → A → Prop
Hsorted: LocallySorted R l
Htransitive: Transitive R
x, y: A
pref1, suf1: list A
Hconcat1: l = pref1 ++ x :: suf1
Hin_y: y = x ∨ y ∈ pref1 ++ suf1x = y ∨ R x y ∨ R y xA: Type
l: list A
R: A → A → Prop
Hsorted: LocallySorted R l
Htransitive: Transitive R
x, y: A
pref1, suf1: list A
Hconcat1: l = pref1 ++ x :: suf1
Hin_y: y ∈ pref1 ++ suf1x = y ∨ R x y ∨ R y xA: Type
l: list A
R: A → A → Prop
Hsorted: LocallySorted R l
Htransitive: Transitive R
x, y: A
pref1, suf1: list A
Hconcat1: l = pref1 ++ x :: suf1
H: y ∈ pref1x = y ∨ R x y ∨ R y xA: Type
l: list A
R: A → A → Prop
Hsorted: LocallySorted R l
Htransitive: Transitive R
x, y: A
pref1, suf1: list A
Hconcat1: l = pref1 ++ x :: suf1
H: y ∈ suf1x = y ∨ R x y ∨ R y xA: Type
l: list A
R: A → A → Prop
Hsorted: LocallySorted R l
Htransitive: Transitive R
x, y: A
pref1, suf1: list A
Hconcat1: l = pref1 ++ x :: suf1
H: y ∈ pref1x = y ∨ R x y ∨ R y xA: Type
l: list A
R: A → A → Prop
Hsorted: LocallySorted R l
Htransitive: Transitive R
x, y: A
pref1, suf1: list A
Hconcat1: l = pref1 ++ x :: suf1
H: ∃ l1 l2 : list A, pref1 = l1 ++ y :: l2x = y ∨ R x y ∨ R y xA: Type
l: list A
R: A → A → Prop
Hsorted: LocallySorted R l
Htransitive: Transitive R
x, y: A
pref1, suf1: list A
Hconcat1: l = pref1 ++ x :: suf1
pref2, suf2: list A
Hconcat2: pref1 = pref2 ++ y :: suf2x = y ∨ R x y ∨ R y xA: Type
l: list A
R: A → A → Prop
Hsorted: LocallySorted R l
Htransitive: Transitive R
x, y: A
pref1, suf1, pref2, suf2: list A
Hconcat1: l = (pref2 ++ y :: suf2) ++ x :: suf1
Hconcat2: pref1 = pref2 ++ y :: suf2x = y ∨ R x y ∨ R y xA: Type
l: list A
R: A → A → Prop
Hsorted: LocallySorted R l
Htransitive: Transitive R
x, y: A
pref1, suf1, pref2, suf2: list A
Hconcat1: l = pref2 ++ (y :: suf2) ++ x :: suf1
Hconcat2: pref1 = pref2 ++ y :: suf2x = y ∨ R x y ∨ R y xby intros; right; right.A: Type
l: list A
R: A → A → Prop
Hsorted: LocallySorted R l
Htransitive: Transitive R
x, y: A
pref1, suf1, pref2, suf2: list A
Hconcat1: l = pref2 ++ (y :: suf2) ++ x :: suf1
Hconcat2: pref1 = pref2 ++ y :: suf2R y x → x = y ∨ R x y ∨ R y xA: Type
l: list A
R: A → A → Prop
Hsorted: LocallySorted R l
Htransitive: Transitive R
x, y: A
pref1, suf1: list A
Hconcat1: l = pref1 ++ x :: suf1
H: y ∈ suf1x = y ∨ R x y ∨ R y xA: Type
l: list A
R: A → A → Prop
Hsorted: LocallySorted R l
Htransitive: Transitive R
x, y: A
pref1, suf1: list A
Hconcat1: l = pref1 ++ x :: suf1
H: ∃ l1 l2 : list A, suf1 = l1 ++ y :: l2x = y ∨ R x y ∨ R y xA: Type
l: list A
R: A → A → Prop
Hsorted: LocallySorted R l
Htransitive: Transitive R
x, y: A
pref1, suf1: list A
Hconcat1: l = pref1 ++ x :: suf1
pref2, suf2: list A
Hconcat2: suf1 = pref2 ++ y :: suf2x = y ∨ R x y ∨ R y xA: Type
l: list A
R: A → A → Prop
Hsorted: LocallySorted R l
Htransitive: Transitive R
x, y: A
pref1, suf1, pref2, suf2: list A
Hconcat1: l = pref1 ++ x :: pref2 ++ y :: suf2
Hconcat2: suf1 = pref2 ++ y :: suf2x = y ∨ R x y ∨ R y xby intros; right; left. Qed.A: Type
l: list A
R: A → A → Prop
Hsorted: LocallySorted R l
Htransitive: Transitive R
x, y: A
pref1, suf1, pref2, suf2: list A
Hconcat1: l = pref1 ++ x :: pref2 ++ y :: suf2
Hconcat2: suf1 = pref2 ++ y :: suf2R x y → x = y ∨ R x y ∨ R y x