Built with Alectryon, running Coq+SerAPI v8.19.0+0.19.3. 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.
Require Import List.Import ListNotations.Ltacsimpeq := repeatmatch goal with
| _ => congruence || (progresssubst)
| H : ?x = ?x |- _ => clear H
| H : _ = _ |- _ => progressinjection H as H
end.Ltacsimp tac :=
repeatmatch goal with
| |- _ => progresssimplin *
| |- _ => progresssubst
| |- _ => congruence
| |- ?x = ?x => reflexivity
| H : ?x = ?x |- _ => clear H
| |- forall_, _ => intro
| |- _ => intro
| H : False |- _ => destruct H
| H : True |- _ => destruct H
| H : exists_, _ |- _ => destruct H
| H : _ /\ _ |- _ => destruct H
| H : _ <-> _ |- _ => destruct H
| x : _ * _ |- _ => destruct x
| H1 : ?P -> ?Q, H2 : ?P |- _ => specialize (H1 H2)
| H1 : (?x = ?x) -> ?Q |- _ => specialize (H1 eq_refl)
| H : True -> ?Q |- _ => specialize (H I)
| |- _ => progressunfold orb, andb in *
| |- _ => progress (simpeq; auto)
(* Do tactics that create multiple subgoals last *)
| |- _ /\ _ => split
| |- _ <-> _ => split
| H : _ \/ _ |- _ => destruct H
| [ H: ?x ++ ?y = [] |- _ ] => destruct x, y
| [ H: [] = ?x ++ ?y |- _ ] => destruct x, y
| [ H: context[match?Xwith _ => _ end] |- _ ] => destruct X eqn:?
| [ |- context[match?Xwith _ => _ end] ] => destruct X eqn:?
| [ H: context[if?bthen _ else _] |- _ ] => destruct b eqn:?
| [ |- context[if?bthen _ else _] ] => destruct b eqn:?
| |- _ \/ _ => solve [left; simp tac | right; simp tac]
| |- _ => progress tac
end.ParameterT : Type.Parametereq_dec : forallxy : T, {x = y} + {x <> y}.ParameterABC : T.(* Regular expressions *)Inductivere : Type :=
| Empty : re
| Epsilon : re
| Atom : T -> re
| Union : re -> re -> re
| Concat : re -> re -> re
| Star : re -> re.(* Matching relation *)Inductivematches : re -> list T -> Prop :=
| matches_epsilon : matches Epsilon []
| matches_atom a : matches (Atom a) [a]
| matches_union_l r1 r2 s : matches r1 s -> matches (Union r1 r2) s
| matches_union_r r1 r2 s : matches r2 s -> matches (Union r1 r2) s
| matches_concat r1 r2 s1 s2 s3 : matches r1 s1 -> matches r2 s2 -> s3 = s1 ++ s2 -> matches (Concat r1 r2) s3
| matches_star_empty r : matches (Star r) []
| matches_star_step r s1 s2 s3 : matches r s1 -> matches (Star r) s2 -> s3 = s1 ++ s2 -> matches (Star r) s3.
A: Type a: A x, y, z: list A
a :: x = y ++ z ->
y = [] /\ z = a :: x \/
(existsy' : list A, y = a :: y' /\ x = y' ++ z)
A: Type a: A x, y, z: list A
a :: x = y ++ z ->
y = [] /\ z = a :: x \/
(existsy' : list A, y = a :: y' /\ x = y' ++ z)
A: Type a: A x, y, z: list A H: a :: x = y ++ z
y = [] /\ z = a :: x \/
(existsy' : list A, y = a :: y' /\ x = y' ++ z)
A: Type a: A x, y, z: list A H: [a] ++ x = y ++ z
y = [] /\ z = a :: x \/
(existsy' : list A, y = a :: y' /\ x = y' ++ z)
A: Type a: A x, y, z: list A H: existsl : list A,
[a] = y ++ l /\ z = l ++ x \/
y = [a] ++ l /\ x = l ++ z
y = [] /\ z = a :: x \/
(existsy' : list A, y = a :: y' /\ x = y' ++ z)
A: Type a: A x, y, x0: list A H: [a] = y ++ x0
y = [] /\ x0 ++ x = a :: x \/
(existsy' : list A, y = a :: y' /\ x = y' ++ x0 ++ x)
destruct y; simp eauto.Qed.
r: re s: list T
s <> [] ->
matches (Star r) s ->
existss1s2 : list T,
s1 <> [] /\
s = s1 ++ s2 /\ matches r s1 /\ matches (Star r) s2
r: re s: list T
s <> [] ->
matches (Star r) s ->
existss1s2 : list T,
s1 <> [] /\
s = s1 ++ s2 /\ matches r s1 /\ matches (Star r) s2
r: re s: list T Hs: s <> [] Hr: matches (Star r) s
existss1s2 : list T,
s1 <> [] /\
s = s1 ++ s2 /\ matches r s1 /\ matches (Star r) s2
r: re s: list T Hs: s <> [] r0: re Heqr0: r0 = Star r Hr: matches r0 s
existss1s2 : list T,
s1 <> [] /\
s = s1 ++ s2 /\ matches r s1 /\ matches r0 s2
s: list T Hs: s <> [] r0: re Hr: matches r0 s
forallr : re,
r0 = Star r ->
existss1s2 : list T,
s1 <> [] /\
s = s1 ++ s2 /\ matches r s1 /\ matches r0 s2
s1, s2: list T Hs: s1 ++ s2 <> [] r0: re IHHr2: s2 <> [] ->
forallr : re,
Star r0 = Star r ->
existss1s3 : list T,
s1 <> [] /\
s2 = s1 ++ s3 /\
matches r s1 /\ matches (Star r0) s3 IHHr1: s1 <> [] ->
forallr : re,
r0 = Star r ->
existss2s3 : list T,
s2 <> [] /\
s1 = s2 ++ s3 /\
matches r s2 /\ matches r0 s3 Hr2: matches (Star r0) s2 Hr1: matches r0 s1
t: T s1, s2: list T Hs: t :: s1 ++ s2 <> [] r0: re IHHr2: s2 <> [] ->
forallr : re,
Star r0 = Star r ->
existss1s3 : list T,
s1 <> [] /\
s2 = s1 ++ s3 /\
matches r s1 /\ matches (Star r0) s3 IHHr1: t :: s1 <> [] ->
forallr : re,
r0 = Star r ->
existss2s3 : list T,
s2 <> [] /\
t :: s1 = s2 ++ s3 /\
matches r s2 /\ matches r0 s3 Hr2: matches (Star r0) s2 Hr1: matches r0 (t :: s1)
existss3 : list T,
t :: s1 <> [] /\
t :: s1 ++ s2 = t :: s1 ++ s3 /\
matches r0 (t :: s1) /\ matches (Star r0) s3
t: T s1, s2: list T Hs: t :: s1 ++ s2 <> [] r0: re IHHr2: s2 <> [] ->
forallr : re,
Star r0 = Star r ->
existss1s3 : list T,
s1 <> [] /\
s2 = s1 ++ s3 /\
matches r s1 /\ matches (Star r0) s3 IHHr1: t :: s1 <> [] ->
forallr : re,
r0 = Star r ->
existss2s3 : list T,
s2 <> [] /\
t :: s1 = s2 ++ s3 /\
matches r s2 /\ matches r0 s3 Hr2: matches (Star r0) s2 Hr1: matches r0 (t :: s1)
t :: s1 <> [] /\
t :: s1 ++ s2 = t :: s1 ++ ?s2 /\
matches r0 (t :: s1) /\ matches (Star r0) ?s2
simp eauto.Qed.Ltacinv H := inversion H; clear H; simpeq.Ltacauto_inv :=
trymatch goal with
| [ H : matches Empty _ |- _ ] => inv H
| [ H : matches (Epsilon) _ |- _ ] => inv H
| [ H : matches (Atom _) _ |- _ ] => inv H
| [ H : matches (Union _ _) _ |- _ ] => inv H
| [ H : matches (Concat _ _) _ |- _ ] => inv H
| [ H : matches (Star _) (_ :: _) |- _ ] => apply star_inv in H
| [ H : _ :: _ = ?x ++ ?y |- _ ] => apply cons_eq_app in H
end; eauto.LtacX := simp auto_inv.(* Add constructors of matches to the core auto database *)Hint Constructors matches : core.(* Regular expression matching with derivatives *)(* True if the regular expression matches the empty string *)Fixpointeps (r : re) : bool :=
match r with
| Empty => false
| Epsilon => true
| Atom _ => false
| Union r1 r2 => eps r1 || eps r2
| Concat r1 r2 => eps r1 && eps r2
| Star _ => true
end.
r: re
eps r = true -> matches r []
r: re
eps r = true -> matches r []
induction r; X.Qed.
r: re
matches r [] -> eps r = true
r: re
matches r [] -> eps r = true
r: re l: list T Heql: l = []
matches r l -> eps r = true
induction1; X.Qed.Hint Resolve eps_matches_1 eps_matches_2 : core.(* Derivative of a regular expression with respect to a character *)Fixpointder (r : re) (a : T) : re :=
match r with
| Empty => Empty
| Epsilon => Empty
| Atom b => if eq_dec a b then Epsilon else Empty
| Union r1 r2 => Union (der r1 a) (der r2 a)
| Concat r1 r2 => if eps r1 then Union (Concat (der r1 a) r2) (der r2 a) else Concat (der r1 a) r2
| Star r => Concat (der r a) (Star r)
end.
a: T r: re s: list T
matches (der r a) s -> matches r (a :: s)
a: T r: re s: list T
matches (der r a) s -> matches r (a :: s)
a: T r: re
foralls : list T,
matches (der r a) s -> matches r (a :: s)
induction r; X.Qed.
a: T r: re s: list T
matches r (a :: s) -> matches (der r a) s
a: T r: re s: list T
matches r (a :: s) -> matches (der r a) s
a: T r: re
foralls : list T,
matches r (a :: s) -> matches (der r a) s
a: T r1, r2: re IHr1: foralls : list T,
matches r1 (a :: s) -> matches (der r1 a) s IHr2: foralls : list T,
matches r2 (a :: s) -> matches (der r2 a) s s: list T Heqb: eps r1 = false H2: matches r1 [] H3: matches r2 (a :: s)
matches (Concat (der r1 a) r2) s
a: T r1, r2: re IHr1: foralls : list T,
matches r1 (a :: s) -> matches (der r1 a) s IHr2: foralls : list T,
matches r2 (a :: s) -> matches (der r2 a) s s: list T Heqb: eps r1 = false H2: eps r1 = true H3: matches r2 (a :: s)
matches (Concat (der r1 a) r2) s
X.Qed.Hint Resolve der_matches_1 der_matches_2 : core.Definitionmatches' (r : re) (s : list T) : bool :=
eps (fold_left der s r).
r: re s: list T
matches' r s = true <-> matches r s
r: re s: list T
matches' r s = true <-> matches r s
r: re s: list T
eps (fold_left der s r) = true <-> matches r s
split; revert r; induction s; X.Qed.(* Bisimulation *)Definitionset (A : Type) := A -> Prop.Definitioncap {A} (X : set (set A)) : set A := funx => forallY, X Y -> Y x.Definitionle {A} (XY : set A) := forallx, X x -> Y x.Definitionf_equiv (bisim : set (re * re)) : set (re * re) :=
fun '(r1, r2) => eps r1 = eps r2 /\ foralla, bisim (der r1 a, der r2 a).
x, y: set (re * re)
le x y -> le (f_equiv x) (f_equiv y)
x, y: set (re * re)
le x y -> le (f_equiv x) (f_equiv y)
x, y: set (re * re)
(forallx0 : re * re, x x0 -> y x0) ->
forallx0 : re * re,
(let
'(r1, r2) := x0 in
eps r1 = eps r2 /\
(foralla : T, x (der r1 a, der r2 a))) ->
let
'(r1, r2) := x0 in
eps r1 = eps r2 /\
(foralla : T, y (der r1 a, der r2 a))
simp eauto.Qed.InductiveOmega : set (set (re * re)) :=
| Omega_lim (X : set (set (re * re))) : (forallx, X x -> Omega x) -> Omega (cap X)
| Omega_suc x : Omega x -> Omega (f_equiv x).Definitionequiv (r1r2 : re) : Prop := cap Omega (r1, r2).
x: set (re * re)
Omega x -> le (f_equiv x) x
x: set (re * re)
Omega x -> le (f_equiv x) x
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re), X x -> le (f_equiv x) x
le (f_equiv (cap X)) (cap X)
x: set (re * re) H: Omega x IHOmega: le (f_equiv x) x
le (f_equiv (f_equiv x)) (f_equiv x)
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re), X x -> le (f_equiv x) x
le (f_equiv (cap X)) (cap X)
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x -> forallx0 : re * re, f_equiv x x0 -> x x0
forallx : re * re,
f_equiv
(funx0 : re * re =>
forallY : set (re * re), X Y -> Y x0) x ->
forallY : set (re * re), X Y -> Y x
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x -> forallx0 : re * re, f_equiv x x0 -> x x0 x: (re * re)%type H1: f_equiv
(funx : re * re =>
forallY : set (re * re), X Y -> Y x) x Y: set (re * re) H2: X Y
Y x
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x -> forallx0 : re * re, f_equiv x x0 -> x x0 x: (re * re)%type H1: f_equiv
(funx : re * re =>
forallY : set (re * re), X Y -> Y x) x Y: set (re * re) H2: X Y
f_equiv Y x
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x -> forallx0 : re * re, f_equiv x x0 -> x x0 x: (re * re)%type H1: f_equiv
(funx : re * re =>
forallY : set (re * re), X Y -> Y x) x Y: set (re * re) H2: X Y
le
(funx : re * re =>
forallY : set (re * re), X Y -> Y x) Y
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x -> forallx0 : re * re, f_equiv x x0 -> x x0 x: (re * re)%type H1: f_equiv
(funx : re * re =>
forallY : set (re * re), X Y -> Y x) x Y: set (re * re) H2: X Y x0: (re * re)%type H3: forallY : set (re * re), X Y -> Y x0
Y x0
eapply H3; eauto.
x: set (re * re) H: Omega x IHOmega: le (f_equiv x) x
le (f_equiv (f_equiv x)) (f_equiv x)
eapply f_equiv_mono; eauto.Qed.
X: set (re * re) -> Prop y: set (re * re)
X y -> le (cap X) y
X: set (re * re) -> Prop y: set (re * re)
X y -> le (cap X) y
X: set (re * re) -> Prop y: set (re * re) H: X y
le (cap X) y
X: set (re * re) -> Prop y: set (re * re) H: X y
forallx : re * re,
(forallY : set (re * re), X Y -> Y x) -> y x
X: set (re * re) -> Prop y: set (re * re) H: X y x: (re * re)%type H0: forallY : set (re * re), X Y -> Y x
y x
X: set (re * re) -> Prop y: set (re * re) H: X y x: (re * re)%type H0: forallY : set (re * re), X Y -> Y x
r1, r2: re H': eps r1 = eps r2 /\
(foralla : T, cap Omega (der r1 a, der r2 a))
eps r1 = eps r2
simp eauto.Qed.
a: T r1, r2: re
equiv r1 r2 -> equiv (der r1 a) (der r2 a)
a: T r1, r2: re
equiv r1 r2 -> equiv (der r1 a) (der r2 a)
a: T r1, r2: re H: equiv r1 r2
equiv (der r1 a) (der r2 a)
a: T r1, r2: re H: equiv r1 r2
f_equiv (cap Omega) (r1, r2)
a: T r1, r2: re H: equiv r1 r2 H': f_equiv (cap Omega) (r1, r2)
equiv (der r1 a) (der r2 a)
a: T r1, r2: re H: equiv r1 r2
f_equiv (cap Omega) (r1, r2)
a: T r1, r2: re H: equiv r1 r2
cap Omega (r1, r2)
eauto.
a: T r1, r2: re H: equiv r1 r2 H': f_equiv (cap Omega) (r1, r2)
equiv (der r1 a) (der r2 a)
a: T r1, r2: re H': f_equiv (cap Omega) (r1, r2)
equiv (der r1 a) (der r2 a)
a: T r1, r2: re H': eps r1 = eps r2 /\
(foralla : T, cap Omega (der r1 a, der r2 a))
equiv (der r1 a) (der r2 a)
a: T r1, r2: re H0: eps r1 = eps r2 H1: foralla : T, cap Omega (der r1 a, der r2 a) Y: set (re * re) H: Omega Y
Y (der r1 a, der r2 a)
a: T r1, r2: re H0: eps r1 = eps r2 H1: foralla : T, cap Omega (der r1 a, der r2 a) Y: set (re * re) H: Omega Y
Omega (funp : re * re => Y p)
eauto.Qed.
r1, r2: re s: list T
equiv r1 r2 -> matches' r1 s = matches' r2 s
r1, r2: re s: list T
equiv r1 r2 -> matches' r1 s = matches' r2 s
r1, r2: re s: list T H: equiv r1 r2
matches' r1 s = matches' r2 s
s: list T
forallr1r2 : re,
equiv r1 r2 -> matches' r1 s = matches' r2 s
r1, r2: re H: equiv r1 r2
eps r1 = eps r2
a: T s: list T IHs: forallr1r2 : re, equiv r1 r2 -> matches' r1 s = matches' r2 s r1, r2: re H: equiv r1 r2
eps (fold_left der s (der r1 a)) =
eps (fold_left der s (der r2 a))
r1, r2: re H: equiv r1 r2
eps r1 = eps r2
r1, r2: re H: equiv r1 r2
equiv r1 r2
eauto.
a: T s: list T IHs: forallr1r2 : re, equiv r1 r2 -> matches' r1 s = matches' r2 s r1, r2: re H: equiv r1 r2
eps (fold_left der s (der r1 a)) =
eps (fold_left der s (der r2 a))
a: T s: list T IHs: forallr1r2 : re, equiv r1 r2 -> matches' r1 s = matches' r2 s r1, r2: re H: equiv r1 r2
equiv (der r1 a) (der r2 a)
a: T s: list T IHs: forallr1r2 : re, equiv r1 r2 -> matches' r1 s = matches' r2 s r1, r2: re H: equiv r1 r2
equiv r1 r2
eauto.Qed.
r1, r2: re
(foralls : list T, matches' r1 s = matches' r2 s) ->
equiv r1 r2
r1, r2: re
(foralls : list T, matches' r1 s = matches' r2 s) ->
equiv r1 r2
r1, r2: re
(foralls : list T, matches' r1 s = matches' r2 s) ->
forallY : set (re * re), Omega Y -> Y (r1, r2)
r1, r2: re H: foralls : list T, matches' r1 s = matches' r2 s Y: set (re * re) HY: Omega Y
Y (r1, r2)
Y: set (re * re) HY: Omega Y
forallr1r2 : re,
(foralls : list T, matches' r1 s = matches' r2 s) ->
Y (r1, r2)
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x ->
forallr1r2 : re,
(foralls : list T, matches' r1 s = matches' r2 s) ->
x (r1, r2) r1, r2: re H1: foralls : list T, matches' r1 s = matches' r2 s
cap X (r1, r2)
x: set (re * re) HY: Omega x IHHY: forallr1r2 : re,
(foralls : list T,
matches' r1 s = matches' r2 s) ->
x (r1, r2) r1, r2: re H: foralls : list T, matches' r1 s = matches' r2 s
f_equiv x (r1, r2)
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x ->
forallr1r2 : re,
(foralls : list T, matches' r1 s = matches' r2 s) ->
x (r1, r2) r1, r2: re H1: foralls : list T, matches' r1 s = matches' r2 s
cap X (r1, r2)
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x ->
forallr1r2 : re,
(foralls : list T, matches' r1 s = matches' r2 s) ->
x (r1, r2) r1, r2: re H1: foralls : list T, matches' r1 s = matches' r2 s Y: set (re * re) H2: X Y
Y (r1, r2)
eapply H0; eauto.
x: set (re * re) HY: Omega x IHHY: forallr1r2 : re,
(foralls : list T,
matches' r1 s = matches' r2 s) ->
x (r1, r2) r1, r2: re H: foralls : list T, matches' r1 s = matches' r2 s
f_equiv x (r1, r2)
x: set (re * re) HY: Omega x IHHY: forallr1r2 : re,
(foralls : list T,
matches' r1 s = matches' r2 s) ->
x (r1, r2) r1, r2: re H: foralls : list T, matches' r1 s = matches' r2 s
eps r1 = eps r2 /\
(foralla : T, x (der r1 a, der r2 a))
x: set (re * re) HY: Omega x IHHY: forallr1r2 : re,
(foralls : list T,
matches' r1 s = matches' r2 s) ->
x (r1, r2) r1, r2: re H: foralls : list T, matches' r1 s = matches' r2 s
eps r1 = eps r2
x: set (re * re) HY: Omega x IHHY: forallr1r2 : re,
(foralls : list T,
matches' r1 s = matches' r2 s) ->
x (r1, r2) r1, r2: re H: foralls : list T, matches' r1 s = matches' r2 s
foralla : T, x (der r1 a, der r2 a)
x: set (re * re) HY: Omega x IHHY: forallr1r2 : re,
(foralls : list T,
matches' r1 s = matches' r2 s) ->
x (r1, r2) r1, r2: re H: foralls : list T, matches' r1 s = matches' r2 s
eps r1 = eps r2
x: set (re * re) HY: Omega x IHHY: forallr1r2 : re,
(foralls : list T,
matches' r1 s = matches' r2 s) ->
x (r1, r2) r1, r2: re H: matches' r1 [] = matches' r2 []
eps r1 = eps r2
x: set (re * re) HY: Omega x IHHY: forallr1r2 : re,
(foralls : list T,
matches' r1 s = matches' r2 s) ->
x (r1, r2) r1, r2: re H: eps (fold_left der [] r1) =
eps (fold_left der [] r2)
eps r1 = eps r2
x: set (re * re) HY: Omega x IHHY: forallr1r2 : re,
(foralls : list T,
matches' r1 s = matches' r2 s) ->
x (r1, r2) r1, r2: re H: eps r1 = eps r2
eps r1 = eps r2
eauto.
x: set (re * re) HY: Omega x IHHY: forallr1r2 : re,
(foralls : list T,
matches' r1 s = matches' r2 s) ->
x (r1, r2) r1, r2: re H: foralls : list T, matches' r1 s = matches' r2 s
foralla : T, x (der r1 a, der r2 a)
x: set (re * re) HY: Omega x IHHY: forallr1r2 : re,
(foralls : list T,
matches' r1 s = matches' r2 s) ->
x (r1, r2) r1, r2: re H: foralls : list T, matches' r1 s = matches' r2 s a: T
x (der r1 a, der r2 a)
x: set (re * re) HY: Omega x IHHY: forallr1r2 : re,
(foralls : list T,
matches' r1 s = matches' r2 s) ->
x (r1, r2) r1, r2: re H: foralls : list T, matches' r1 s = matches' r2 s a: T
foralls : list T,
matches' (der r1 a) s = matches' (der r2 a) s
x: set (re * re) HY: Omega x IHHY: forallr1r2 : re,
(foralls : list T,
matches' r1 s = matches' r2 s) ->
x (r1, r2) r1, r2: re H: foralls : list T, matches' r1 s = matches' r2 s a: T s: list T
matches' (der r1 a) s = matches' (der r2 a) s
x: set (re * re) HY: Omega x IHHY: forallr1r2 : re,
(foralls : list T,
matches' r1 s = matches' r2 s) ->
x (r1, r2) r1, r2: re a: T s: list T H: matches' r1 (a :: s) = matches' r2 (a :: s)
matches' (der r1 a) s = matches' (der r2 a) s
x: set (re * re) HY: Omega x IHHY: forallr1r2 : re,
(foralls : list T,
eps (fold_left der s r1) =
eps (fold_left der s r2)) ->
x (r1, r2) r1, r2: re a: T s: list T H: eps (fold_left der (a :: s) r1) =
eps (fold_left der (a :: s) r2)
eps (fold_left der s (der r1 a)) =
eps (fold_left der s (der r2 a))
x: set (re * re) HY: Omega x IHHY: forallr1r2 : re,
(foralls : list T,
eps (fold_left der s r1) =
eps (fold_left der s r2)) ->
x (r1, r2) r1, r2: re a: T s: list T H: eps (fold_left der s (der r1 a)) =
eps (fold_left der s (der r2 a))
eps (fold_left der s (der r1 a)) =
eps (fold_left der s (der r2 a))
eauto.Qed.
r: re
equiv r r
r: re
equiv r r
r: re
cap Omega (r, r)
r: re Y: set (re * re) HY: Omega Y
Y (r, r)
Y: set (re * re) HY: Omega Y
forallr : re, Y (r, r)
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x -> forallr : re, x (r, r)
forallr : re, cap X (r, r)
x: set (re * re) HY: Omega x IHHY: forallr : re, x (r, r)
forallr : re, f_equiv x (r, r)
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x -> forallr : re, x (r, r)
forallr : re, cap X (r, r)
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x -> forallr : re, x (r, r)
forall (r : re) (Y : set (re * re)), X Y -> Y (r, r)
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x -> forallr : re, x (r, r) r: re Y: set (re * re) H1: X Y
Y (r, r)
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x -> forallr : re, x (r, r) r: re Y: set (re * re) H1: X Y
X (funp : re * re => Y p)
eauto.
x: set (re * re) HY: Omega x IHHY: forallr : re, x (r, r)
forallr : re, f_equiv x (r, r)
x: set (re * re) HY: Omega x IHHY: forallr : re, x (r, r) r: re
f_equiv x (r, r)
x: set (re * re) HY: Omega x IHHY: forallr : re, x (r, r) r: re
eps r = eps r /\ (foralla : T, x (der r a, der r a))
eauto.Qed.
r1, r2: re
equiv r1 r2 -> equiv r2 r1
r1, r2: re
equiv r1 r2 -> equiv r2 r1
r1, r2: re
cap Omega (r1, r2) -> cap Omega (r2, r1)
r1, r2: re H: cap Omega (r1, r2) Y: set (re * re) HY: Omega Y
Y (r2, r1)
r1, r2: re Y: set (re * re) H: Y (r1, r2) HY: Omega Y
Y (r2, r1)
Y: set (re * re) HY: Omega Y
forallr1r2 : re, Y (r1, r2) -> Y (r2, r1)
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x ->
forallr1r2 : re, x (r1, r2) -> x (r2, r1)
forallr1r2 : re, cap X (r1, r2) -> cap X (r2, r1)
x: set (re * re) HY: Omega x IHHY: forallr1r2 : re, x (r1, r2) -> x (r2, r1)
forallr1r2 : re,
f_equiv x (r1, r2) -> f_equiv x (r2, r1)
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x ->
forallr1r2 : re, x (r1, r2) -> x (r2, r1)
forallr1r2 : re, cap X (r1, r2) -> cap X (r2, r1)
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x ->
forallr1r2 : re, x (r1, r2) -> x (r2, r1)
forallr1r2 : re,
(forallY : set (re * re), X Y -> Y (r1, r2)) ->
forallY : set (re * re), X Y -> Y (r2, r1)
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x ->
forallr1r2 : re, x (r1, r2) -> x (r2, r1) r1, r2: re H1: forallY : set (re * re), X Y -> Y (r1, r2) Y: set (re * re) H2: X Y
Y (r2, r1)
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x ->
forallr1r2 : re, x (r1, r2) -> x (r2, r1) r1, r2: re H1: forallY : set (re * re), X Y -> Y (r1, r2) Y: set (re * re) H2: X Y
Y (r1, r2)
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x ->
forallr1r2 : re, x (r1, r2) -> x (r2, r1) r1, r2: re H1: forallY : set (re * re), X Y -> Y (r1, r2) Y: set (re * re) H2: X Y
X (funp : re * re => Y p)
eauto.
x: set (re * re) HY: Omega x IHHY: forallr1r2 : re, x (r1, r2) -> x (r2, r1)
forallr1r2 : re,
f_equiv x (r1, r2) -> f_equiv x (r2, r1)
x: set (re * re) HY: Omega x IHHY: forallr1r2 : re, x (r1, r2) -> x (r2, r1)
forallr1r2 : re,
eps r1 = eps r2 /\
(foralla : T, x (der r1 a, der r2 a)) ->
eps r2 = eps r1 /\
(foralla : T, x (der r2 a, der r1 a))
simp eauto.Qed.
r1, r2, r3: re
equiv r1 r2 -> equiv r2 r3 -> equiv r1 r3
r1, r2, r3: re
equiv r1 r2 -> equiv r2 r3 -> equiv r1 r3
r1, r2, r3: re
cap Omega (r1, r2) ->
cap Omega (r2, r3) -> cap Omega (r1, r3)
r1, r2, r3: re H12: cap Omega (r1, r2) H23: cap Omega (r2, r3) Y: set (re * re) HY: Omega Y
Y (r1, r3)
r1, r2, r3: re Y: set (re * re) H12: Y (r1, r2) H23: cap Omega (r2, r3) HY: Omega Y
Y (r1, r3)
r1, r2, r3: re Y: set (re * re) H12: Y (r1, r2) H23: Y (r2, r3) HY: Omega Y
Y (r1, r3)
Y: set (re * re) HY: Omega Y
forallr1r2r3 : re,
Y (r1, r2) -> Y (r2, r3) -> Y (r1, r3)
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x ->
forallr1r2r3 : re,
x (r1, r2) -> x (r2, r3) -> x (r1, r3)
forallr1r2r3 : re,
cap X (r1, r2) -> cap X (r2, r3) -> cap X (r1, r3)
x: set (re * re) HY: Omega x IHHY: forallr1r2r3 : re,
x (r1, r2) -> x (r2, r3) -> x (r1, r3)
forallr1r2r3 : re,
f_equiv x (r1, r2) ->
f_equiv x (r2, r3) -> f_equiv x (r1, r3)
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x ->
forallr1r2r3 : re,
x (r1, r2) -> x (r2, r3) -> x (r1, r3)
forallr1r2r3 : re,
cap X (r1, r2) -> cap X (r2, r3) -> cap X (r1, r3)
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x ->
forallr1r2r3 : re,
x (r1, r2) -> x (r2, r3) -> x (r1, r3)
forallr1r2r3 : re,
(forallY : set (re * re), X Y -> Y (r1, r2)) ->
(forallY : set (re * re), X Y -> Y (r2, r3)) ->
forallY : set (re * re), X Y -> Y (r1, r3)
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x ->
forallr1r2r3 : re,
x (r1, r2) -> x (r2, r3) -> x (r1, r3) r1, r2, r3: re H12: forallY : set (re * re), X Y -> Y (r1, r2) H23: forallY : set (re * re), X Y -> Y (r2, r3) Y: set (re * re) H1: X Y
Y (r1, r3)
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x ->
forallr1r2r3 : re,
x (r1, r2) -> x (r2, r3) -> x (r1, r3) r1, r2, r3: re H12: forallY : set (re * re), X Y -> Y (r1, r2) H23: forallY : set (re * re), X Y -> Y (r2, r3) Y: set (re * re) H1: X Y
Y (r1, ?r2)
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x ->
forallr1r2r3 : re,
x (r1, r2) -> x (r2, r3) -> x (r1, r3) r1, r2, r3: re H12: forallY : set (re * re), X Y -> Y (r1, r2) H23: forallY : set (re * re), X Y -> Y (r2, r3) Y: set (re * re) H1: X Y
Y (?r2, r3)
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x ->
forallr1r2r3 : re,
x (r1, r2) -> x (r2, r3) -> x (r1, r3) r1, r2, r3: re H12: forallY : set (re * re), X Y -> Y (r1, r2) H23: forallY : set (re * re), X Y -> Y (r2, r3) Y: set (re * re) H1: X Y
Y (r1, ?r2)
eapply H12; eauto.
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x ->
forallr1r2r3 : re,
x (r1, r2) -> x (r2, r3) -> x (r1, r3) r1, r2, r3: re H12: forallY : set (re * re), X Y -> Y (r1, r2) H23: forallY : set (re * re), X Y -> Y (r2, r3) Y: set (re * re) H1: X Y
Y (r2, r3)
eapply H23; eauto.
x: set (re * re) HY: Omega x IHHY: forallr1r2r3 : re,
x (r1, r2) -> x (r2, r3) -> x (r1, r3)
forallr1r2r3 : re,
f_equiv x (r1, r2) ->
f_equiv x (r2, r3) -> f_equiv x (r1, r3)
x: set (re * re) HY: Omega x IHHY: forallr1r2r3 : re,
x (r1, r2) -> x (r2, r3) -> x (r1, r3)
forallr1r2r3 : re,
eps r1 = eps r2 /\
(foralla : T, x (der r1 a, der r2 a)) ->
eps r2 = eps r3 /\
(foralla : T, x (der r2 a, der r3 a)) ->
eps r1 = eps r3 /\
(foralla : T, x (der r1 a, der r3 a))
simp eauto.Qed.
r1, r2: re
equiv (Union r1 r2) (Union r2 r1)
r1, r2: re
equiv (Union r1 r2) (Union r2 r1)
r1, r2: re
cap Omega (Union r1 r2, Union r2 r1)
r1, r2: re Y: set (re * re) HY: Omega Y
Y (Union r1 r2, Union r2 r1)
Y: set (re * re) HY: Omega Y
forallr1r2 : re, Y (Union r1 r2, Union r2 r1)
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x ->
forallr1r2 : re, x (Union r1 r2, Union r2 r1) r1, r2: re
cap X (Union r1 r2, Union r2 r1)
x: set (re * re) HY: Omega x IHHY: forallr1r2 : re, x (Union r1 r2, Union r2 r1) r1, r2: re
f_equiv x (Union r1 r2, Union r2 r1)
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x ->
forallr1r2 : re, x (Union r1 r2, Union r2 r1) r1, r2: re
cap X (Union r1 r2, Union r2 r1)
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x ->
forallr1r2 : re, x (Union r1 r2, Union r2 r1) r1, r2: re
forallY : set (re * re),
X Y -> Y (Union r1 r2, Union r2 r1)
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x ->
forallr1r2 : re, x (Union r1 r2, Union r2 r1) r1, r2: re Y: set (re * re) H1: X Y
Y (Union r1 r2, Union r2 r1)
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x ->
forallr1r2 : re, x (Union r1 r2, Union r2 r1) r1, r2: re Y: set (re * re) H1: X Y
X (funp : re * re => Y p)
eauto.
x: set (re * re) HY: Omega x IHHY: forallr1r2 : re, x (Union r1 r2, Union r2 r1) r1, r2: re
f_equiv x (Union r1 r2, Union r2 r1)
x: set (re * re) HY: Omega x IHHY: forallr1r2 : re, x (Union r1 r2, Union r2 r1) r1, r2: re
eps (Union r1 r2) = eps (Union r2 r1) /\
(foralla : T,
x (der (Union r1 r2) a, der (Union r2 r1) a))
cap Omega
(Union r1 (Union r2 r3), Union (Union r1 r2) r3)
r1, r2, r3: re Y: set (re * re) HY: Omega Y
Y (Union r1 (Union r2 r3), Union (Union r1 r2) r3)
Y: set (re * re) HY: Omega Y
forallr1r2r3 : re,
Y (Union r1 (Union r2 r3), Union (Union r1 r2) r3)
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x ->
forallr1r2r3 : re,
x
(Union r1 (Union r2 r3), Union (Union r1 r2) r3) r1, r2, r3: re
cap X (Union r1 (Union r2 r3), Union (Union r1 r2) r3)
x: set (re * re) HY: Omega x IHHY: forallr1r2r3 : re,
x
(Union r1 (Union r2 r3),
Union (Union r1 r2) r3) r1, r2, r3: re
f_equiv x
(Union r1 (Union r2 r3), Union (Union r1 r2) r3)
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x ->
forallr1r2r3 : re,
x
(Union r1 (Union r2 r3), Union (Union r1 r2) r3) r1, r2, r3: re
cap X (Union r1 (Union r2 r3), Union (Union r1 r2) r3)
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x ->
forallr1r2r3 : re,
x
(Union r1 (Union r2 r3), Union (Union r1 r2) r3) r1, r2, r3: re
forallY : set (re * re),
X Y ->
Y (Union r1 (Union r2 r3), Union (Union r1 r2) r3)
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x ->
forallr1r2r3 : re,
x
(Union r1 (Union r2 r3), Union (Union r1 r2) r3) r1, r2, r3: re Y: set (re * re) H1: X Y
Y (Union r1 (Union r2 r3), Union (Union r1 r2) r3)
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x ->
forallr1r2r3 : re,
x
(Union r1 (Union r2 r3), Union (Union r1 r2) r3) r1, r2, r3: re Y: set (re * re) H1: X Y
X (funp : re * re => Y p)
eauto.
x: set (re * re) HY: Omega x IHHY: forallr1r2r3 : re,
x
(Union r1 (Union r2 r3),
Union (Union r1 r2) r3) r1, r2, r3: re
f_equiv x
(Union r1 (Union r2 r3), Union (Union r1 r2) r3)
x: set (re * re) HY: Omega x IHHY: forallr1r2r3 : re,
x
(Union r1 (Union r2 r3),
Union (Union r1 r2) r3) r1, r2, r3: re
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x -> forallr : re, x (Union r r, r) r: re
cap X (Union r r, r)
x: set (re * re) HY: Omega x IHHY: forallr : re, x (Union r r, r) r: re
f_equiv x (Union r r, r)
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x -> forallr : re, x (Union r r, r) r: re
cap X (Union r r, r)
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x -> forallr : re, x (Union r r, r) r: re
forallY : set (re * re), X Y -> Y (Union r r, r)
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x -> forallr : re, x (Union r r, r) r: re Y: set (re * re) H1: X Y
Y (Union r r, r)
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x -> forallr : re, x (Union r r, r) r: re Y: set (re * re) H1: X Y
X (funp : re * re => Y p)
eauto.
x: set (re * re) HY: Omega x IHHY: forallr : re, x (Union r r, r) r: re
f_equiv x (Union r r, r)
x: set (re * re) HY: Omega x IHHY: forallr : re, x (Union r r, r) r: re
eps (Union r r) = eps r /\
(foralla : T, x (der (Union r r) a, der r a))
cap Omega (r1, r1') ->
cap Omega (r2, r2') ->
cap Omega (Union r1 r2, Union r1' r2')
r1, r2, r1', r2': re H1: cap Omega (r1, r1') H2: cap Omega (r2, r2') Y: set (re * re) HY: Omega Y
Y (Union r1 r2, Union r1' r2')
r1, r2, r1', r2': re Y: set (re * re) H1: Y (r1, r1') H2: cap Omega (r2, r2') HY: Omega Y
Y (Union r1 r2, Union r1' r2')
r1, r2, r1', r2': re Y: set (re * re) H1: Y (r1, r1') H2: Y (r2, r2') HY: Omega Y
Y (Union r1 r2, Union r1' r2')
Y: set (re * re) HY: Omega Y
forallr1r2r1'r2' : re,
Y (r1, r1') ->
Y (r2, r2') -> Y (Union r1 r2, Union r1' r2')
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x ->
forallr1r2r1'r2' : re,
x (r1, r1') ->
x (r2, r2') -> x (Union r1 r2, Union r1' r2') r1, r2, r1', r2': re H1: cap X (r1, r1') H2: cap X (r2, r2')
cap X (Union r1 r2, Union r1' r2')
x: set (re * re) HY: Omega x IHHY: forallr1r2r1'r2' : re,
x (r1, r1') ->
x (r2, r2') -> x (Union r1 r2, Union r1' r2') r1, r2, r1', r2': re H1: f_equiv x (r1, r1') H2: f_equiv x (r2, r2')
f_equiv x (Union r1 r2, Union r1' r2')
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x ->
forallr1r2r1'r2' : re,
x (r1, r1') ->
x (r2, r2') -> x (Union r1 r2, Union r1' r2') r1, r2, r1', r2': re H1: cap X (r1, r1') H2: cap X (r2, r2')
cap X (Union r1 r2, Union r1' r2')
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x ->
forallr1r2r1'r2' : re,
x (r1, r1') ->
x (r2, r2') -> x (Union r1 r2, Union r1' r2') r1, r2, r1', r2': re H1: cap X (r1, r1') H2: cap X (r2, r2')
forallY : set (re * re),
X Y -> Y (Union r1 r2, Union r1' r2')
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x ->
forallr1r2r1'r2' : re,
x (r1, r1') ->
x (r2, r2') -> x (Union r1 r2, Union r1' r2') r1, r2, r1', r2': re H1: cap X (r1, r1') H2: cap X (r2, r2') Y: set (re * re) H3: X Y
Y (Union r1 r2, Union r1' r2')
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x ->
forallr1r2r1'r2' : re,
x (r1, r1') ->
x (r2, r2') -> x (Union r1 r2, Union r1' r2') r1, r2, r1', r2': re H1: cap X (r1, r1') H2: cap X (r2, r2') Y: set (re * re) H3: X Y
Y (r1, r1')
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x ->
forallr1r2r1'r2' : re,
x (r1, r1') ->
x (r2, r2') -> x (Union r1 r2, Union r1' r2') r1, r2, r1', r2': re H1: cap X (r1, r1') H2: cap X (r2, r2') Y: set (re * re) H3: X Y
Y (r2, r2')
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x ->
forallr1r2r1'r2' : re,
x (r1, r1') ->
x (r2, r2') -> x (Union r1 r2, Union r1' r2') r1, r2, r1', r2': re H1: cap X (r1, r1') H2: cap X (r2, r2') Y: set (re * re) H3: X Y
Y (r1, r1')
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x ->
forallr1r2r1'r2' : re,
x (r1, r1') ->
x (r2, r2') -> x (Union r1 r2, Union r1' r2') r1, r2, r1', r2': re H1: cap X (r1, r1') H2: cap X (r2, r2') Y: set (re * re) H3: X Y
X (funp : re * re => Y p)
eauto.
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x ->
forallr1r2r1'r2' : re,
x (r1, r1') ->
x (r2, r2') -> x (Union r1 r2, Union r1' r2') r1, r2, r1', r2': re H1: cap X (r1, r1') H2: cap X (r2, r2') Y: set (re * re) H3: X Y
Y (r2, r2')
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x ->
forallr1r2r1'r2' : re,
x (r1, r1') ->
x (r2, r2') -> x (Union r1 r2, Union r1' r2') r1, r2, r1', r2': re H1: cap X (r1, r1') H2: cap X (r2, r2') Y: set (re * re) H3: X Y
X (funp : re * re => Y p)
eauto.
x: set (re * re) HY: Omega x IHHY: forallr1r2r1'r2' : re,
x (r1, r1') ->
x (r2, r2') -> x (Union r1 r2, Union r1' r2') r1, r2, r1', r2': re H1: f_equiv x (r1, r1') H2: f_equiv x (r2, r2')
f_equiv x (Union r1 r2, Union r1' r2')
x: set (re * re) HY: Omega x IHHY: forallr1r2r1'r2' : re,
x (r1, r1') ->
x (r2, r2') -> x (Union r1 r2, Union r1' r2') r1, r2, r1', r2': re H1: eps r1 = eps r1' /\
(foralla : T, x (der r1 a, der r1' a)) H2: eps r2 = eps r2' /\
(foralla : T, x (der r2 a, der r2' a))
eps (Union r1 r2) = eps (Union r1' r2') /\
(foralla : T,
x (der (Union r1 r2) a, der (Union r1' r2') a))
simp eauto.Qed.Definitionthm (hyps : list (re * re)) (goal : (re * re)) : Prop :=
forally, Omega y -> (forallh, In h hyps -> y h) -> y goal.
x: set (re * re)
Omega x -> forallh : re * re, f_equiv x h -> x h
x: set (re * re)
Omega x -> forallh : re * re, f_equiv x h -> x h
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x -> forallh : re * re, f_equiv x h -> x h h: (re * re)%type H1: f_equiv (cap X) h
cap X h
x: set (re * re) H: Omega x IHOmega: forallh : re * re, f_equiv x h -> x h h: (re * re)%type H0: f_equiv (f_equiv x) h
f_equiv x h
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x -> forallh : re * re, f_equiv x h -> x h h: (re * re)%type H1: f_equiv (cap X) h
cap X h
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x -> forallh : re * re, f_equiv x h -> x h h: (re * re)%type H1: f_equiv
(funx : re * re =>
forallY : set (re * re), X Y -> Y x) h
forallY : set (re * re), X Y -> Y h
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x -> forallh : re * re, f_equiv x h -> x h h: (re * re)%type H1: f_equiv
(funx : re * re =>
forallY : set (re * re), X Y -> Y x) h Y: set (re * re) H2: X Y
Y h
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x -> forallh : re * re, f_equiv x h -> x h h: (re * re)%type H1: f_equiv
(funx : re * re =>
forallY : set (re * re), X Y -> Y x) h Y: set (re * re) H2: X Y
f_equiv Y h
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x -> forallh : re * re, f_equiv x h -> x h h: (re * re)%type H1: f_equiv
(funx : re * re =>
forallY : set (re * re), X Y -> Y x) h Y: set (re * re) H2: X Y
let
'(r1, r2) := h in
eps r1 = eps r2 /\
(foralla : T, Y (der r1 a, der r2 a))
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x -> forallh : re * re, f_equiv x h -> x h r, r0: re H1: eps r = eps r0 H3: forall (a : T) (Y : set (re * re)),
X Y -> Y (der r a, der r0 a) Y: set (re * re) H2: X Y a: T
Y (der r a, der r0 a)
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x -> forallh : re * re, f_equiv x h -> x h r, r0: re H1: eps r = eps r0 H3: forall (a : T) (Y : set (re * re)),
X Y -> Y (der r a, der r0 a) Y: set (re * re) H2: X Y a: T
X (funp : re * re => Y p)
eauto.
x: set (re * re) H: Omega x IHOmega: forallh : re * re, f_equiv x h -> x h h: (re * re)%type H0: f_equiv (f_equiv x) h
f_equiv x h
x: set (re * re) H: Omega x IHOmega: forallh : re * re,
(let
'(r1, r2) := h in
eps r1 = eps r2 /\
(foralla : T, x (der r1 a, der r2 a))) ->
x h h: (re * re)%type H0: let
'(r1, r2) := h in
eps r1 = eps r2 /\
(foralla : T,
eps (der r1 a) = eps (der r2 a) /\
(foralla0 : T,
x (der (der r1 a) a0, der (der r2 a) a0)))
let
'(r1, r2) := h in
eps r1 = eps r2 /\
(foralla : T, x (der r1 a, der r2 a))
simp eauto.Qed.
hyps: list (re * re) r1, r2: re
thm hyps (r1, r2) -> thm hyps (r2, r1)
hyps: list (re * re) r1, r2: re
thm hyps (r1, r2) -> thm hyps (r2, r1)
hyps: list (re * re) r1, r2: re H: thm hyps (r1, r2)
thm hyps (r2, r1)
hyps: list (re * re) r1, r2: re H: forally : set (re * re),
Omega y ->
(forallh : re * re, In h hyps -> y h) ->
y (r1, r2)
forally : set (re * re),
Omega y ->
(forallh : re * re, In h hyps -> y h) -> y (r2, r1)
hyps: list (re * re) r1, r2: re H: forally : set (re * re),
Omega y ->
(forallh : re * re, In h hyps -> y h) ->
y (r1, r2) y: set (re * re) HY: Omega y
(forallh : re * re, In h hyps -> y h) -> y (r2, r1)
hyps: list (re * re) r1, r2: re y: set (re * re) H: (forallh : re * re, In h hyps -> y h) ->
y (r1, r2) HY: Omega y
(forallh : re * re, In h hyps -> y h) -> y (r2, r1)
hyps: list (re * re) r1, r2: re y: set (re * re) H: y (r1, r2) HY: Omega y H0: forallh : re * re, In h hyps -> y h
y (r2, r1)
y: set (re * re) HY: Omega y
forallr1r2 : re,
y (r1, r2) ->
forallhyps : list (re * re),
(forallh : re * re, In h hyps -> y h) -> y (r2, r1)
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x ->
forallr1r2 : re,
x (r1, r2) ->
forallhyps : list (re * re),
(forallh : re * re, In h hyps -> x h) ->
x (r2, r1) r1, r2: re H1: cap X (r1, r2) hyps: list (re * re) H2: forallh : re * re, In h hyps -> cap X h
cap X (r2, r1)
x: set (re * re) HY: Omega x IHHY: forallr1r2 : re,
x (r1, r2) ->
forallhyps : list (re * re),
(forallh : re * re, In h hyps -> x h) ->
x (r2, r1) r1, r2: re H: f_equiv x (r1, r2) hyps: list (re * re) H0: forallh : re * re, In h hyps -> f_equiv x h
f_equiv x (r2, r1)
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x ->
forallr1r2 : re,
x (r1, r2) ->
forallhyps : list (re * re),
(forallh : re * re, In h hyps -> x h) ->
x (r2, r1) r1, r2: re H1: cap X (r1, r2) hyps: list (re * re) H2: forallh : re * re, In h hyps -> cap X h
cap X (r2, r1)
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x ->
forallr1r2 : re,
x (r1, r2) ->
forallhyps : list (re * re),
(forallh : re * re, In h hyps -> x h) ->
x (r2, r1) r1, r2: re H1: forallY : set (re * re), X Y -> Y (r1, r2) hyps: list (re * re) H2: forallh : re * re,
In h hyps -> forallY : set (re * re), X Y -> Y h
forallY : set (re * re), X Y -> Y (r2, r1)
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x ->
forallr1r2 : re,
x (r1, r2) ->
forallhyps : list (re * re),
(forallh : re * re, In h hyps -> x h) ->
x (r2, r1) r1, r2: re H1: forallY : set (re * re), X Y -> Y (r1, r2) hyps: list (re * re) H2: forallh : re * re,
In h hyps -> forallY : set (re * re), X Y -> Y h Y: set (re * re) H3: X Y
Y (r2, r1)
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x ->
forallr1r2 : re,
x (r1, r2) ->
forallhyps : list (re * re),
(forallh : re * re, In h hyps -> x h) ->
x (r2, r1) r1, r2: re H1: forallY : set (re * re), X Y -> Y (r1, r2) hyps: list (re * re) H2: forallh : re * re,
In h hyps -> forallY : set (re * re), X Y -> Y h Y: set (re * re) H3: X Y
Y (r1, r2)
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x ->
forallr1r2 : re,
x (r1, r2) ->
forallhyps : list (re * re),
(forallh : re * re, In h hyps -> x h) ->
x (r2, r1) r1, r2: re H1: forallY : set (re * re), X Y -> Y (r1, r2) hyps: list (re * re) H2: forallh : re * re,
In h hyps -> forallY : set (re * re), X Y -> Y h Y: set (re * re) H3: X Y
forallh : re * re, In h ?hyps -> Y h
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x ->
forallr1r2 : re,
x (r1, r2) ->
forallhyps : list (re * re),
(forallh : re * re, In h hyps -> x h) ->
x (r2, r1) r1, r2: re H1: forallY : set (re * re), X Y -> Y (r1, r2) hyps: list (re * re) H2: forallh : re * re,
In h hyps -> forallY : set (re * re), X Y -> Y h Y: set (re * re) H3: X Y
Y (r1, r2)
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x ->
forallr1r2 : re,
x (r1, r2) ->
forallhyps : list (re * re),
(forallh : re * re, In h hyps -> x h) ->
x (r2, r1) r1, r2: re H1: forallY : set (re * re), X Y -> Y (r1, r2) hyps: list (re * re) H2: forallh : re * re,
In h hyps -> forallY : set (re * re), X Y -> Y h Y: set (re * re) H3: X Y
Y (r1, r2)
eapply H1; eauto.
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x ->
forallr1r2 : re,
x (r1, r2) ->
forallhyps : list (re * re),
(forallh : re * re, In h hyps -> x h) ->
x (r2, r1) r1, r2: re H1: forallY : set (re * re), X Y -> Y (r1, r2) hyps: list (re * re) H2: forallh : re * re,
In h hyps -> forallY : set (re * re), X Y -> Y h Y: set (re * re) H3: X Y
forallh : re * re, In h ?hyps -> Y h
X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x ->
forallr1r2 : re,
x (r1, r2) ->
forallhyps : list (re * re),
(forallh : re * re, In h hyps -> x h) ->
x (r2, r1) r1, r2: re H1: forallY : set (re * re), X Y -> Y (r1, r2) hyps: list (re * re) H2: forallh : re * re,
In h hyps -> forallY : set (re * re), X Y -> Y h Y: set (re * re) H3: X Y h: (re * re)%type H4: In h ?hyps
Y h
eapply H2; eauto.
x: set (re * re) HY: Omega x IHHY: forallr1r2 : re,
x (r1, r2) ->
forallhyps : list (re * re),
(forallh : re * re, In h hyps -> x h) ->
x (r2, r1) r1, r2: re H: f_equiv x (r1, r2) hyps: list (re * re) H0: forallh : re * re, In h hyps -> f_equiv x h
f_equiv x (r2, r1)
x: set (re * re) HY: Omega x IHHY: forallr1r2 : re,
x (r1, r2) ->
forallhyps : list (re * re),
(forallh : re * re, In h hyps -> x h) ->
x (r2, r1) r1, r2: re H: eps r1 = eps r2 /\
(foralla : T, x (der r1 a, der r2 a)) hyps: list (re * re) H0: forallh : re * re,
In h hyps ->
let
'(r1, r2) := h in
eps r1 = eps r2 /\
(foralla : T, x (der r1 a, der r2 a))
eps r2 = eps r1 /\
(foralla : T, x (der r2 a, der r1 a))
x: set (re * re) HY: Omega x IHHY: forallr1r2 : re,
x (r1, r2) ->
forallhyps : list (re * re),
(forallh : re * re, In h hyps -> x h) ->
x (r2, r1) r1, r2: re H: eps r1 = eps r2 H1: foralla : T, x (der r1 a, der r2 a) hyps: list (re * re) H0: forallh : re * re,
In h hyps ->
let
'(r1, r2) := h in
eps r1 = eps r2 /\
(foralla : T, x (der r1 a, der r2 a)) a: T
x (der r2 a, der r1 a)
x: set (re * re) HY: Omega x IHHY: forallr1r2 : re,
x (r1, r2) ->
forallhyps : list (re * re),
(forallh : re * re, In h hyps -> x h) ->
x (r2, r1) r1, r2: re H: eps r1 = eps r2 H1: foralla : T, x (der r1 a, der r2 a) hyps: list (re * re) H0: forallh : re * re,
In h hyps ->
let
'(r1, r2) := h in
eps r1 = eps r2 /\
(foralla : T, x (der r1 a, der r2 a)) a: T
forallh : re * re, In h ?hyps -> x h
x: set (re * re) HY: Omega x IHHY: forallr1r2 : re,
x (r1, r2) ->
forallhyps : list (re * re),
(forallh : re * re, In h hyps -> x h) ->
x (r2, r1) r1, r2: re H: eps r1 = eps r2 H1: foralla : T, x (der r1 a, der r2 a) hyps: list (re * re) H0: forallh : re * re,
In h hyps ->
let
'(r1, r2) := h in
eps r1 = eps r2 /\
(foralla : T, x (der r1 a, der r2 a)) a: T h: (re * re)%type H2: In h ?hyps
x h
x: set (re * re) HY: Omega x IHHY: forallr1r2 : re,
x (r1, r2) ->
forallhyps : list (re * re),
(forallh : re * re, In h hyps -> x h) ->
x (r2, r1) r1, r2: re H: eps r1 = eps r2 H1: foralla : T, x (der r1 a, der r2 a) hyps: list (re * re) H0: forallh : re * re,
In h hyps ->
let
'(r1, r2) := h in
eps r1 = eps r2 /\
(foralla : T, x (der r1 a, der r2 a)) a: T h: (re * re)%type H2: In h ?hyps
f_equiv x h
x: set (re * re) HY: Omega x IHHY: forallr1r2 : re,
x (r1, r2) ->
forallhyps : list (re * re),
(forallh : re * re, In h hyps -> x h) ->
x (r2, r1) r1, r2: re H: eps r1 = eps r2 H1: foralla : T, x (der r1 a, der r2 a) hyps: list (re * re) H0: forallh : re * re,
In h hyps ->
let
'(r1, r2) := h in
eps r1 = eps r2 /\
(foralla : T, x (der r1 a, der r2 a)) a: T h: (re * re)%type H2: In h ?hyps
hyps: list (re * re) r1, r2: re Heq: eps r1 = eps r2 H: foralla : T,
thm ((r1, r2) :: hyps) (der r1 a, der r2 a)
thm hyps (r1, r2)
hyps: list (re * re) r1, r2: re Heq: eps r1 = eps r2 H: foralla : T,
thm ((r1, r2) :: hyps) (der r1 a, der r2 a)
forally : set (re * re),
Omega y ->
(forallh : re * re, In h hyps -> y h) -> y (r1, r2)
hyps: list (re * re) r1, r2: re Heq: eps r1 = eps r2 H: foralla : T,
thm ((r1, r2) :: hyps) (der r1 a, der r2 a) y: set (re * re) HY: Omega y
(forallh : re * re, In h hyps -> y h) -> y (r1, r2)
hyps: list (re * re) r1, r2: re Heq: eps r1 = eps r2 H: foralla : T,
thm ((r1, r2) :: hyps) (der r1 a, der r2 a) X: set (set (re * re)) H0: forallx : set (re * re), X x -> Omega x H1: forallx : set (re * re),
X x ->
(forallh : re * re, In h hyps -> x h) ->
x (r1, r2)
(forallh : re * re, In h hyps -> cap X h) ->
cap X (r1, r2)
hyps: list (re * re) r1, r2: re Heq: eps r1 = eps r2 H: foralla : T,
thm ((r1, r2) :: hyps) (der r1 a, der r2 a) x: set (re * re) HY: Omega x IHHY: (forallh : re * re, In h hyps -> x h) ->
x (r1, r2)
(forallh : re * re, In h hyps -> f_equiv x h) ->
f_equiv x (r1, r2)
hyps: list (re * re) r1, r2: re Heq: eps r1 = eps r2 H: foralla : T,
thm ((r1, r2) :: hyps) (der r1 a, der r2 a) X: set (set (re * re)) H0: forallx : set (re * re), X x -> Omega x H1: forallx : set (re * re),
X x ->
(forallh : re * re, In h hyps -> x h) ->
x (r1, r2)
(forallh : re * re, In h hyps -> cap X h) ->
cap X (r1, r2)
hyps: list (re * re) r1, r2: re Heq: eps r1 = eps r2 H: foralla : T,
thm ((r1, r2) :: hyps) (der r1 a, der r2 a) X: set (set (re * re)) H0: forallx : set (re * re), X x -> Omega x H1: forallx : set (re * re),
X x ->
(forallh : re * re, In h hyps -> x h) ->
x (r1, r2)
(forallh : re * re,
In h hyps -> forallY : set (re * re), X Y -> Y h) ->
forallY : set (re * re), X Y -> Y (r1, r2)
hyps: list (re * re) r1, r2: re Heq: eps r1 = eps r2 H: foralla : T,
thm ((r1, r2) :: hyps) (der r1 a, der r2 a) X: set (set (re * re)) H0: forallx : set (re * re), X x -> Omega x H1: forallx : set (re * re),
X x ->
(forallh : re * re, In h hyps -> x h) ->
x (r1, r2) H2: forallh : re * re,
In h hyps -> forallY : set (re * re), X Y -> Y h Y: set (re * re) H3: X Y
Y (r1, r2)
hyps: list (re * re) r1, r2: re Heq: eps r1 = eps r2 H: foralla : T,
thm ((r1, r2) :: hyps) (der r1 a, der r2 a) X: set (set (re * re)) H0: forallx : set (re * re), X x -> Omega x H1: forallx : set (re * re),
X x ->
(forallh : re * re, In h hyps -> x h) ->
x (r1, r2) H2: forallh : re * re,
In h hyps -> forallY : set (re * re), X Y -> Y h Y: set (re * re) H3: X Y
forallh : re * re, In h hyps -> Y h
hyps: list (re * re) r1, r2: re Heq: eps r1 = eps r2 H: foralla : T,
thm ((r1, r2) :: hyps) (der r1 a, der r2 a) X: set (set (re * re)) H0: forallx : set (re * re), X x -> Omega x H1: forallx : set (re * re),
X x ->
(forallh : re * re, In h hyps -> x h) ->
x (r1, r2) H2: forallh : re * re,
In h hyps -> forallY : set (re * re), X Y -> Y h Y: set (re * re) H3: X Y h: (re * re)%type H4: In h hyps
Y h
eapply H2; eauto.
hyps: list (re * re) r1, r2: re Heq: eps r1 = eps r2 H: foralla : T,
thm ((r1, r2) :: hyps) (der r1 a, der r2 a) x: set (re * re) HY: Omega x IHHY: (forallh : re * re, In h hyps -> x h) ->
x (r1, r2)
(forallh : re * re, In h hyps -> f_equiv x h) ->
f_equiv x (r1, r2)
hyps: list (re * re) r1, r2: re Heq: eps r1 = eps r2 H: foralla : T,
thm ((r1, r2) :: hyps) (der r1 a, der r2 a) x: set (re * re) HY: Omega x IHHY: (forallh : re * re, In h hyps -> x h) ->
x (r1, r2) H0: forallh : re * re, In h hyps -> f_equiv x h
f_equiv x (r1, r2)
hyps: list (re * re) r1, r2: re Heq: eps r1 = eps r2 H: foralla : T,
thm ((r1, r2) :: hyps) (der r1 a, der r2 a) x: set (re * re) HY: Omega x IHHY: (forallh : re * re, In h hyps -> x h) ->
x (r1, r2) H0: forallh : re * re, In h hyps -> f_equiv x h
eps r1 = eps r2 /\
(foralla : T, x (der r1 a, der r2 a))
hyps: list (re * re) r1, r2: re Heq: eps r1 = eps r2 H: foralla : T,
thm ((r1, r2) :: hyps) (der r1 a, der r2 a) x: set (re * re) HY: Omega x IHHY: (forallh : re * re, In h hyps -> x h) ->
x (r1, r2) H0: forallh : re * re, In h hyps -> f_equiv x h a: T
x (der r1 a, der r2 a)
hyps: list (re * re) r1, r2: re Heq: eps r1 = eps r2 H: foralla : T,
thm ((r1, r2) :: hyps) (der r1 a, der r2 a) x: set (re * re) HY: Omega x IHHY: (forallh : re * re, In h hyps -> x h) ->
x (r1, r2) H0: forallh : re * re, In h hyps -> f_equiv x h a: T
forallh : re * re, In h ((r1, r2) :: hyps) -> x h
hyps: list (re * re) r1, r2: re Heq: eps r1 = eps r2 H: foralla : T,
thm ((r1, r2) :: hyps) (der r1 a, der r2 a) x: set (re * re) HY: Omega x IHHY: (forallh : re * re, In h hyps -> x h) ->
x (r1, r2) H0: forallh : re * re, In h hyps -> f_equiv x h a: T h: (re * re)%type H1: In h ((r1, r2) :: hyps)
x h
hyps: list (re * re) r1, r2: re Heq: eps r1 = eps r2 H: foralla : T,
thm ((r1, r2) :: hyps) (der r1 a, der r2 a) x: set (re * re) HY: Omega x IHHY: (forallh : re * re, In h hyps -> x h) ->
x (r1, r2) H0: forallh : re * re, In h hyps -> f_equiv x h a: T h: (re * re)%type H1: (r1, r2) = h \/ In h hyps
x h
hyps: list (re * re) r, r0: re Heq: eps r = eps r0 H: foralla : T,
thm ((r, r0) :: hyps) (der r a, der r0 a) x: set (re * re) HY: Omega x IHHY: (forallh : re * re, In h hyps -> x h) ->
x (r, r0) H0: forallh : re * re, In h hyps -> f_equiv x h a: T
x (r, r0)
hyps: list (re * re) r1, r2: re Heq: eps r1 = eps r2 H: foralla : T,
thm ((r1, r2) :: hyps) (der r1 a, der r2 a) x: set (re * re) HY: Omega x IHHY: (forallh : re * re, In h hyps -> x h) ->
x (r1, r2) H0: forallh : re * re, In h hyps -> f_equiv x h a: T r, r0: re H1: In (r, r0) hyps
x (r, r0)
hyps: list (re * re) r, r0: re Heq: eps r = eps r0 H: foralla : T,
thm ((r, r0) :: hyps) (der r a, der r0 a) x: set (re * re) HY: Omega x IHHY: (forallh : re * re, In h hyps -> x h) ->
x (r, r0) H0: forallh : re * re, In h hyps -> f_equiv x h a: T
x (r, r0)
hyps: list (re * re) r, r0: re Heq: eps r = eps r0 H: foralla : T,
thm ((r, r0) :: hyps) (der r a, der r0 a) x: set (re * re) HY: Omega x IHHY: (forallh : re * re, In h hyps -> x h) ->
x (r, r0) H0: forallh : re * re, In h hyps -> f_equiv x h a: T
forallh : re * re, In h hyps -> x h
hyps: list (re * re) r, r0: re Heq: eps r = eps r0 H: foralla : T,
thm ((r, r0) :: hyps) (der r a, der r0 a) x: set (re * re) HY: Omega x IHHY: (forallh : re * re, In h hyps -> x h) ->
x (r, r0) H0: forallh : re * re, In h hyps -> f_equiv x h a: T h: (re * re)%type H1: In h hyps
x h
eapply f_equiv_weaken; eauto.
hyps: list (re * re) r1, r2: re Heq: eps r1 = eps r2 H: foralla : T,
thm ((r1, r2) :: hyps) (der r1 a, der r2 a) x: set (re * re) HY: Omega x IHHY: (forallh : re * re, In h hyps -> x h) ->
x (r1, r2) H0: forallh : re * re, In h hyps -> f_equiv x h a: T r, r0: re H1: In (r, r0) hyps
x (r, r0)
eapply f_equiv_weaken; eauto.Qed.
hyps: list (re * re) h: (re * re)%type
In h hyps -> thm hyps h
hyps: list (re * re) h: (re * re)%type
In h hyps -> thm hyps h
hyps: list (re * re) h: (re * re)%type H: In h hyps y: set (re * re) H0: Omega y H1: forallh : re * re, In h hyps -> y h
hyps: list (re * re) r1, r1', r2, r2': re H1: equiv r1 r1' H2: equiv r2 r2' H: forally : set (re * re),
Omega y ->
(forallh : re * re, In h hyps -> y h) ->
y (r1, r2)
forally : set (re * re),
Omega y ->
(forallh : re * re, In h hyps -> y h) -> y (r1', r2')
hyps: list (re * re) r1, r1', r2, r2': re H1: equiv r1 r1' H2: equiv r2 r2' H: forally : set (re * re),
Omega y ->
(forallh : re * re, In h hyps -> y h) ->
y (r1, r2) y: set (re * re) HY: Omega y
(forallh : re * re, In h hyps -> y h) -> y (r1', r2')
hyps: list (re * re) r1, r1', r2, r2': re y: set (re * re) H1: y (r1, r1') H2: equiv r2 r2' H: forally : set (re * re),
Omega y ->
(forallh : re * re, In h hyps -> y h) ->
y (r1, r2) HY: Omega y
(forallh : re * re, In h hyps -> y h) -> y (r1', r2')
hyps: list (re * re) r1, r1', r2, r2': re y: set (re * re) H1: y (r1, r1') H2: y (r2, r2') H: forally : set (re * re),
Omega y ->
(forallh : re * re, In h hyps -> y h) ->
y (r1, r2) HY: Omega y
(forallh : re * re, In h hyps -> y h) -> y (r1', r2')
hyps: list (re * re) r1, r1', r2, r2': re y: set (re * re) H1: y (r1, r1') H2: y (r2, r2') H: (forallh : re * re, In h hyps -> y h) ->
y (r1, r2) HY: Omega y
(forallh : re * re, In h hyps -> y h) -> y (r1', r2')
hyps: list (re * re) y: set (re * re) HY: Omega y
forallr1r1'r2r2' : re,
y (r1, r1') ->
y (r2, r2') ->
((forallh : re * re, In h hyps -> y h) -> y (r1, r2)) ->
(forallh : re * re, In h hyps -> y h) -> y (r1', r2')
hyps: list (re * re) X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x ->
forallr1r1'r2r2' : re,
x (r1, r1') ->
x (r2, r2') ->
((forallh : re * re, In h hyps -> x h) ->
x (r1, r2)) ->
(forallh : re * re, In h hyps -> x h) ->
x (r1', r2') r1, r1', r2, r2': re H1: cap X (r1, r1') H2: cap X (r2, r2') H3: (forallh : re * re, In h hyps -> cap X h) ->
cap X (r1, r2) H4: forallh : re * re, In h hyps -> cap X h
cap X (r1', r2')
hyps: list (re * re) x: set (re * re) HY: Omega x IHHY: forallr1r1'r2r2' : re,
x (r1, r1') ->
x (r2, r2') ->
((forallh : re * re, In h hyps -> x h) ->
x (r1, r2)) ->
(forallh : re * re, In h hyps -> x h) ->
x (r1', r2') r1, r1', r2, r2': re H1: f_equiv x (r1, r1') H2: f_equiv x (r2, r2') H: (forallh : re * re, In h hyps -> f_equiv x h) ->
f_equiv x (r1, r2) H0: forallh : re * re, In h hyps -> f_equiv x h
f_equiv x (r1', r2')
hyps: list (re * re) X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x ->
forallr1r1'r2r2' : re,
x (r1, r1') ->
x (r2, r2') ->
((forallh : re * re, In h hyps -> x h) ->
x (r1, r2)) ->
(forallh : re * re, In h hyps -> x h) ->
x (r1', r2') r1, r1', r2, r2': re H1: cap X (r1, r1') H2: cap X (r2, r2') H3: (forallh : re * re, In h hyps -> cap X h) ->
cap X (r1, r2) H4: forallh : re * re, In h hyps -> cap X h
cap X (r1', r2')
hyps: list (re * re) X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x ->
forallr1r1'r2r2' : re,
x (r1, r1') ->
x (r2, r2') ->
((forallh : re * re, In h hyps -> x h) ->
x (r1, r2)) ->
(forallh : re * re, In h hyps -> x h) ->
x (r1', r2') r1, r1', r2, r2': re H1: forallY : set (re * re), X Y -> Y (r1, r1') H2: forallY : set (re * re), X Y -> Y (r2, r2') H3: (forallh : re * re,
In h hyps ->
forallY : set (re * re), X Y -> Y h) ->
forallY : set (re * re), X Y -> Y (r1, r2) H4: forallh : re * re,
In h hyps -> forallY : set (re * re), X Y -> Y h
forallY : set (re * re), X Y -> Y (r1', r2')
hyps: list (re * re) X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x ->
forallr1r1'r2r2' : re,
x (r1, r1') ->
x (r2, r2') ->
((forallh : re * re, In h hyps -> x h) ->
x (r1, r2)) ->
(forallh : re * re, In h hyps -> x h) ->
x (r1', r2') r1, r1', r2, r2': re H1: forallY : set (re * re), X Y -> Y (r1, r1') H2: forallY : set (re * re), X Y -> Y (r2, r2') H3: (forallh : re * re,
In h hyps ->
forallY : set (re * re), X Y -> Y h) ->
forallY : set (re * re), X Y -> Y (r1, r2) H4: forallh : re * re,
In h hyps -> forallY : set (re * re), X Y -> Y h Y: set (re * re) H5: X Y
Y (r1', r2')
hyps: list (re * re) X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x ->
forallr1r1'r2r2' : re,
x (r1, r1') ->
x (r2, r2') ->
((forallh : re * re, In h hyps -> x h) ->
x (r1, r2)) ->
(forallh : re * re, In h hyps -> x h) ->
x (r1', r2') r1, r1', r2, r2': re H1: forallY : set (re * re), X Y -> Y (r1, r1') H2: forallY : set (re * re), X Y -> Y (r2, r2') H3: (forallh : re * re,
In h hyps ->
forallY : set (re * re), X Y -> Y h) ->
forallY : set (re * re), X Y -> Y (r1, r2) H4: forallh : re * re,
In h hyps -> forallY : set (re * re), X Y -> Y h Y: set (re * re) H5: X Y
Y (?r1, r1')
hyps: list (re * re) X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x ->
forallr1r1'r2r2' : re,
x (r1, r1') ->
x (r2, r2') ->
((forallh : re * re, In h hyps -> x h) ->
x (r1, r2)) ->
(forallh : re * re, In h hyps -> x h) ->
x (r1', r2') r1, r1', r2, r2': re H1: forallY : set (re * re), X Y -> Y (r1, r1') H2: forallY : set (re * re), X Y -> Y (r2, r2') H3: (forallh : re * re,
In h hyps ->
forallY : set (re * re), X Y -> Y h) ->
forallY : set (re * re), X Y -> Y (r1, r2) H4: forallh : re * re,
In h hyps -> forallY : set (re * re), X Y -> Y h Y: set (re * re) H5: X Y
Y (?r2, r2')
hyps: list (re * re) X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x ->
forallr1r1'r2r2' : re,
x (r1, r1') ->
x (r2, r2') ->
((forallh : re * re, In h hyps -> x h) ->
x (r1, r2)) ->
(forallh : re * re, In h hyps -> x h) ->
x (r1', r2') r1, r1', r2, r2': re H1: forallY : set (re * re), X Y -> Y (r1, r1') H2: forallY : set (re * re), X Y -> Y (r2, r2') H3: (forallh : re * re,
In h hyps ->
forallY : set (re * re), X Y -> Y h) ->
forallY : set (re * re), X Y -> Y (r1, r2) H4: forallh : re * re,
In h hyps -> forallY : set (re * re), X Y -> Y h Y: set (re * re) H5: X Y
(forallh : re * re, In h hyps -> Y h) -> Y (?r1, ?r2)
hyps: list (re * re) X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x ->
forallr1r1'r2r2' : re,
x (r1, r1') ->
x (r2, r2') ->
((forallh : re * re, In h hyps -> x h) ->
x (r1, r2)) ->
(forallh : re * re, In h hyps -> x h) ->
x (r1', r2') r1, r1', r2, r2': re H1: forallY : set (re * re), X Y -> Y (r1, r1') H2: forallY : set (re * re), X Y -> Y (r2, r2') H3: (forallh : re * re,
In h hyps ->
forallY : set (re * re), X Y -> Y h) ->
forallY : set (re * re), X Y -> Y (r1, r2) H4: forallh : re * re,
In h hyps -> forallY : set (re * re), X Y -> Y h Y: set (re * re) H5: X Y
forallh : re * re, In h hyps -> Y h
hyps: list (re * re) X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x ->
forallr1r1'r2r2' : re,
x (r1, r1') ->
x (r2, r2') ->
((forallh : re * re, In h hyps -> x h) ->
x (r1, r2)) ->
(forallh : re * re, In h hyps -> x h) ->
x (r1', r2') r1, r1', r2, r2': re H1: forallY : set (re * re), X Y -> Y (r1, r1') H2: forallY : set (re * re), X Y -> Y (r2, r2') H3: (forallh : re * re,
In h hyps ->
forallY : set (re * re), X Y -> Y h) ->
forallY : set (re * re), X Y -> Y (r1, r2) H4: forallh : re * re,
In h hyps -> forallY : set (re * re), X Y -> Y h Y: set (re * re) H5: X Y
Y (?r1, r1')
eapply H1; eauto.
hyps: list (re * re) X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x ->
forallr1r1'r2r2' : re,
x (r1, r1') ->
x (r2, r2') ->
((forallh : re * re, In h hyps -> x h) ->
x (r1, r2)) ->
(forallh : re * re, In h hyps -> x h) ->
x (r1', r2') r1, r1', r2, r2': re H1: forallY : set (re * re), X Y -> Y (r1, r1') H2: forallY : set (re * re), X Y -> Y (r2, r2') H3: (forallh : re * re,
In h hyps ->
forallY : set (re * re), X Y -> Y h) ->
forallY : set (re * re), X Y -> Y (r1, r2) H4: forallh : re * re,
In h hyps -> forallY : set (re * re), X Y -> Y h Y: set (re * re) H5: X Y
Y (?r2, r2')
hyps: list (re * re) X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x ->
forallr1r1'r2r2' : re,
x (r1, r1') ->
x (r2, r2') ->
((forallh : re * re, In h hyps -> x h) ->
x (r1, r2)) ->
(forallh : re * re, In h hyps -> x h) ->
x (r1', r2') r1, r1', r2, r2': re H1: forallY : set (re * re), X Y -> Y (r1, r1') H2: forallY : set (re * re), X Y -> Y (r2, r2') H3: (forallh : re * re,
In h hyps ->
forallY : set (re * re), X Y -> Y h) ->
forallY : set (re * re), X Y -> Y (r1, r2) H4: forallh : re * re,
In h hyps -> forallY : set (re * re), X Y -> Y h Y: set (re * re) H5: X Y
X (funp : re * re => Y p)
eauto.
hyps: list (re * re) X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x ->
forallr1r1'r2r2' : re,
x (r1, r1') ->
x (r2, r2') ->
((forallh : re * re, In h hyps -> x h) ->
x (r1, r2)) ->
(forallh : re * re, In h hyps -> x h) ->
x (r1', r2') r1, r1', r2, r2': re H1: forallY : set (re * re), X Y -> Y (r1, r1') H2: forallY : set (re * re), X Y -> Y (r2, r2') H3: (forallh : re * re,
In h hyps ->
forallY : set (re * re), X Y -> Y h) ->
forallY : set (re * re), X Y -> Y (r1, r2) H4: forallh : re * re,
In h hyps -> forallY : set (re * re), X Y -> Y h Y: set (re * re) H5: X Y
(forallh : re * re, In h hyps -> Y h) -> Y (r1, r2)
hyps: list (re * re) X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x ->
forallr1r1'r2r2' : re,
x (r1, r1') ->
x (r2, r2') ->
((forallh : re * re, In h hyps -> x h) ->
x (r1, r2)) ->
(forallh : re * re, In h hyps -> x h) ->
x (r1', r2') r1, r1', r2, r2': re H1: forallY : set (re * re), X Y -> Y (r1, r1') H2: forallY : set (re * re), X Y -> Y (r2, r2') H3: (forallh : re * re,
In h hyps ->
forallY : set (re * re), X Y -> Y h) ->
forallY : set (re * re), X Y -> Y (r1, r2) H4: forallh : re * re,
In h hyps -> forallY : set (re * re), X Y -> Y h Y: set (re * re) H5: X Y H6: forallh : re * re, In h hyps -> Y h
Y (r1, r2)
eapply H3; eauto.
hyps: list (re * re) X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x ->
forallr1r1'r2r2' : re,
x (r1, r1') ->
x (r2, r2') ->
((forallh : re * re, In h hyps -> x h) ->
x (r1, r2)) ->
(forallh : re * re, In h hyps -> x h) ->
x (r1', r2') r1, r1', r2, r2': re H1: forallY : set (re * re), X Y -> Y (r1, r1') H2: forallY : set (re * re), X Y -> Y (r2, r2') H3: (forallh : re * re,
In h hyps ->
forallY : set (re * re), X Y -> Y h) ->
forallY : set (re * re), X Y -> Y (r1, r2) H4: forallh : re * re,
In h hyps -> forallY : set (re * re), X Y -> Y h Y: set (re * re) H5: X Y
forallh : re * re, In h hyps -> Y h
hyps: list (re * re) X: set (set (re * re)) H: forallx : set (re * re), X x -> Omega x H0: forallx : set (re * re),
X x ->
forallr1r1'r2r2' : re,
x (r1, r1') ->
x (r2, r2') ->
((forallh : re * re, In h hyps -> x h) ->
x (r1, r2)) ->
(forallh : re * re, In h hyps -> x h) ->
x (r1', r2') r1, r1', r2, r2': re H1: forallY : set (re * re), X Y -> Y (r1, r1') H2: forallY : set (re * re), X Y -> Y (r2, r2') H3: (forallh : re * re,
In h hyps ->
forallY : set (re * re), X Y -> Y h) ->
forallY : set (re * re), X Y -> Y (r1, r2) H4: forallh : re * re,
In h hyps -> forallY : set (re * re), X Y -> Y h Y: set (re * re) H5: X Y h: (re * re)%type H6: In h hyps
Y h
eapply H4; eauto.
hyps: list (re * re) x: set (re * re) HY: Omega x IHHY: forallr1r1'r2r2' : re,
x (r1, r1') ->
x (r2, r2') ->
((forallh : re * re, In h hyps -> x h) ->
x (r1, r2)) ->
(forallh : re * re, In h hyps -> x h) ->
x (r1', r2') r1, r1', r2, r2': re H1: f_equiv x (r1, r1') H2: f_equiv x (r2, r2') H: (forallh : re * re, In h hyps -> f_equiv x h) ->
f_equiv x (r1, r2) H0: forallh : re * re, In h hyps -> f_equiv x h
f_equiv x (r1', r2')
hyps: list (re * re) x: set (re * re) HY: Omega x IHHY: forallr1r1'r2r2' : re,
x (r1, r1') ->
x (r2, r2') ->
((forallh : re * re, In h hyps -> x h) ->
x (r1, r2)) ->
(forallh : re * re, In h hyps -> x h) ->
x (r1', r2') r1, r1', r2, r2': re H1: eps r1 = eps r1' /\
(foralla : T, x (der r1 a, der r1' a)) H2: eps r2 = eps r2' /\
(foralla : T, x (der r2 a, der r2' a)) H: (forallh : re * re,
In h hyps ->
let
'(r1, r2) := h in
eps r1 = eps r2 /\
(foralla : T, x (der r1 a, der r2 a))) ->
eps r1 = eps r2 /\
(foralla : T, x (der r1 a, der r2 a)) H0: forallh : re * re,
In h hyps ->
let
'(r1, r2) := h in
eps r1 = eps r2 /\
(foralla : T, x (der r1 a, der r2 a))
eps r1' = eps r2' /\
(foralla : T, x (der r1' a, der r2' a))
hyps: list (re * re) x: set (re * re) HY: Omega x IHHY: forallr1r1'r2r2' : re,
x (r1, r1') ->
x (r2, r2') ->
((forallh : re * re, In h hyps -> x h) ->
x (r1, r2)) ->
(forallh : re * re, In h hyps -> x h) ->
x (r1', r2') r1, r1', r2, r2': re H1: eps r1 = eps r1' H4: foralla : T, x (der r1 a, der r1' a) H2: eps r2 = eps r2' H3: foralla : T, x (der r2 a, der r2' a) H: eps r1 = eps r2 H5: foralla : T, x (der r1 a, der r2 a) H0: forallh : re * re,
In h hyps ->
let
'(r1, r2) := h in
eps r1 = eps r2 /\
(foralla : T, x (der r1 a, der r2 a)) a: T
x (der r1' a, der r2' a)
hyps: list (re * re) x: set (re * re) HY: Omega x IHHY: forallr1r1'r2r2' : re,
x (r1, r1') ->
x (r2, r2') ->
((forallh : re * re, In h hyps -> x h) ->
x (r1, r2)) ->
(forallh : re * re, In h hyps -> x h) ->
x (r1', r2') r1, r1', r2, r2': re H1: eps r1 = eps r1' H4: foralla : T, x (der r1 a, der r1' a) H2: eps r2 = eps r2' H3: foralla : T, x (der r2 a, der r2' a) H: eps r1 = eps r2 H5: foralla : T, x (der r1 a, der r2 a) H0: forallh : re * re,
In h hyps ->
let
'(r1, r2) := h in
eps r1 = eps r2 /\
(foralla : T, x (der r1 a, der r2 a)) a: T
forallh : re * re, In h hyps -> x h
hyps: list (re * re) x: set (re * re) HY: Omega x IHHY: forallr1r1'r2r2' : re,
x (r1, r1') ->
x (r2, r2') ->
((forallh : re * re, In h hyps -> x h) ->
x (r1, r2)) ->
(forallh : re * re, In h hyps -> x h) ->
x (r1', r2') r1, r1', r2, r2': re H1: eps r1 = eps r1' H4: foralla : T, x (der r1 a, der r1' a) H2: eps r2 = eps r2' H3: foralla : T, x (der r2 a, der r2' a) H: eps r1 = eps r2 H5: foralla : T, x (der r1 a, der r2 a) H0: forallh : re * re,
In h hyps ->
let
'(r1, r2) := h in
eps r1 = eps r2 /\
(foralla : T, x (der r1 a, der r2 a)) a: T h: (re * re)%type H6: In h hyps
x h
hyps: list (re * re) x: set (re * re) HY: Omega x IHHY: forallr1r1'r2r2' : re,
x (r1, r1') ->
x (r2, r2') ->
((forallh : re * re, In h hyps -> x h) ->
x (r1, r2)) ->
(forallh : re * re, In h hyps -> x h) ->
x (r1', r2') r1, r1', r2, r2': re H1: eps r1 = eps r1' H4: foralla : T, x (der r1 a, der r1' a) H2: eps r2 = eps r2' H3: foralla : T, x (der r2 a, der r2' a) H: eps r1 = eps r2 H5: foralla : T, x (der r1 a, der r2 a) H0: forallh : re * re,
In h hyps ->
let
'(r1, r2) := h in
eps r1 = eps r2 /\
(foralla : T, x (der r1 a, der r2 a)) a: T h: (re * re)%type H6: In h hyps
f_equiv x h
hyps: list (re * re) x: set (re * re) HY: Omega x IHHY: forallr1r1'r2r2' : re,
x (r1, r1') ->
x (r2, r2') ->
((forallh : re * re, In h hyps -> x h) ->
x (r1, r2)) ->
(forallh : re * re, In h hyps -> x h) ->
x (r1', r2') r1, r1', r2, r2': re H1: eps r1 = eps r1' H4: foralla : T, x (der r1 a, der r1' a) H2: eps r2 = eps r2' H3: foralla : T, x (der r2 a, der r2' a) H: eps r1 = eps r2 H5: foralla : T, x (der r1 a, der r2 a) H0: forallh : re * re,
In h hyps ->
let
'(r1, r2) := h in
eps r1 = eps r2 /\
(foralla : T, x (der r1 a, der r2 a)) a: T h: (re * re)%type H6: In h hyps
In h hyps
eauto.Qed.
r1, r2: re
thm [] (r1, r2) <-> equiv r1 r2
r1, r2: re
thm [] (r1, r2) <-> equiv r1 r2
r1, r2: re
(forally : set (re * re),
Omega y ->
(forallh : re * re, In h [] -> y h) -> y (r1, r2)) <->
equiv r1 r2
r1, r2: re
(forally : set (re * re),
Omega y ->
(forallh : re * re, In h [] -> y h) -> y (r1, r2)) ->
equiv r1 r2
r1, r2: re
equiv r1 r2 ->
forally : set (re * re),
Omega y ->
(forallh : re * re, In h [] -> y h) -> y (r1, r2)
r1, r2: re
(forally : set (re * re),
Omega y ->
(forallh : re * re, In h [] -> y h) -> y (r1, r2)) ->
equiv r1 r2
r1, r2: re H: forally : set (re * re),
Omega y ->
(forallh : re * re, In h [] -> y h) -> y (r1, r2)
equiv r1 r2
r1, r2: re H: forally : set (re * re),
Omega y ->
(forallh : re * re, In h [] -> y h) -> y (r1, r2)
cap Omega (r1, r2)
r1, r2: re H: forally : set (re * re),
Omega y ->
(forallh : re * re, In h [] -> y h) -> y (r1, r2) Y: set (re * re) HY: Omega Y
Y (r1, r2)
r1, r2: re H: forally : set (re * re),
Omega y ->
(forallh : re * re, In h [] -> y h) -> y (r1, r2) Y: set (re * re) HY: Omega Y
forallh : re * re, In h [] -> Y h
simp eauto.
r1, r2: re
equiv r1 r2 ->
forally : set (re * re),
Omega y ->
(forallh : re * re, In h [] -> y h) -> y (r1, r2)
r1, r2: re H: equiv r1 r2 y: set (re * re) H0: Omega y H1: forallh : re * re, In h [] -> y h
y (r1, r2)
r1, r2: re H: equiv r1 r2 y: set (re * re) H0: Omega y H1: forallh : re * re, In h [] -> y h