Built with Alectryon, running Coq+SerAPI v8.18.0+0.18.1. 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.
Load tactics.

(*
3.20 (page 86)
*)
Object: Type
P, Q: Object * Object -> Prop

(forall x y : Object, P (x, y) -> Q (y, x)) /\ (forall x : Object, P (x, x)) -> forall y : Object, Q (y, y)
Object: Type
P, Q: Object * Object -> Prop

(forall x y : Object, P (x, y) -> Q (y, x)) /\ (forall x : Object, P (x, x)) -> forall y : Object, Q (y, y)
Object: Type
P, Q: Object * Object -> Prop
H0: (forall x y : Object, P (x, y) -> Q (y, x)) /\ (forall x : Object, P (x, x))

forall y : Object, Q (y, y)
Object: Type
P, Q: Object * Object -> Prop
H0: (forall x y : Object, P (x, y) -> Q (y, x)) /\ (forall x : Object, P (x, x))
H1: forall x y : Object, P (x, y) -> Q (y, x)
H2: forall x : Object, P (x, x)

forall y : Object, Q (y, y)
Object: Type
P, Q: Object * Object -> Prop
H0: (forall x y : Object, P (x, y) -> Q (y, x)) /\ (forall x : Object, P (x, x))
H1: forall x y : Object, P (x, y) -> Q (y, x)
H2: forall x : Object, P (x, x)
z: Object

Q (z, z)
Object: Type
P, Q: Object * Object -> Prop
H0: (forall x y : Object, P (x, y) -> Q (y, x)) /\ (forall x : Object, P (x, x))
H1: forall x y : Object, P (x, y) -> Q (y, x)
H2: forall x : Object, P (x, x)
z: Object
H3: forall y : Object, P (z, y) -> Q (y, z)

Q (z, z)
Object: Type
P, Q: Object * Object -> Prop
H0: (forall x y : Object, P (x, y) -> Q (y, x)) /\ (forall x : Object, P (x, x))
H1: forall x y : Object, P (x, y) -> Q (y, x)
H2: forall x : Object, P (x, x)
z: Object
H3: forall y : Object, P (z, y) -> Q (y, z)
H4: P (z, z) -> Q (z, z)

Q (z, z)
Object: Type
P, Q: Object * Object -> Prop
H0: (forall x y : Object, P (x, y) -> Q (y, x)) /\ (forall x : Object, P (x, x))
H1: forall x y : Object, P (x, y) -> Q (y, x)
H2: forall x : Object, P (x, x)
z: Object
H3: forall y : Object, P (z, y) -> Q (y, z)
H4: P (z, z) -> Q (z, z)

P (z, z)
Object: Type
P, Q: Object * Object -> Prop
H0: (forall x y : Object, P (x, y) -> Q (y, x)) /\ (forall x : Object, P (x, x))
H1: forall x y : Object, P (x, y) -> Q (y, x)
H2: forall x : Object, P (x, x)
z: Object
H3: forall y : Object, P (z, y) -> Q (y, z)
H4: P (z, z) -> Q (z, z)
H5: P (z, z)

P (z, z)
assumption H5.
Object: Type
P, Q: Object * Object -> Prop

(forall x y : Object, P (x, y) -> Q (y, x)) /\ (forall x : Object, P (x, x)) -> forall y : Object, Q (y, y)
Object: Type
P, Q: Object * Object -> Prop
H1: forall x y : Object, P (x, y) -> Q (y, x)
H2: forall x : Object, P (x, x)
y: Object

Q (y, y)
Object: Type
P, Q: Object * Object -> Prop
H1: forall x y : Object, P (x, y) -> Q (y, x)
H2: forall x : Object, P (x, x)
y: Object

P (y, y)
apply H2. Qed. (* 3.30 (page 92) *)

forall x : nat, x <= x

forall x : nat, x <= x
x: nat

x <= x
x: nat

x + 0 = x
x: nat
A0: forall n : nat, n + 0 = n

x + 0 = x
x: nat
A0: forall n : nat, n + 0 = n
H0: x + 0 = x

x + 0 = x
x: nat
A0: forall n : nat, n + 0 = n
H0: x + 0 = x

x = x
equals_intro.

forall x : nat, x <= x
x: nat

x <= x
x: nat

exists z : nat, x + z = x
x: nat

x + 0 = x
lia. Qed. (* 3.33 (page 94) *)

forall x y : nat, even x -> even y -> even (x + y)

forall x y : nat, even x -> even y -> even (x + y)
x: nat

forall y : nat, even x -> even y -> even (x + y)
x, y: nat

even x -> even y -> even (x + y)
x, y: nat
H0: even x

even y -> even (x + y)
x, y: nat
H0: even x
H1: even y

even (x + y)
x, y: nat
H0: exists k : nat, x = 2 * k
H1: exists k : nat, y = 2 * k

exists k : nat, x + y = 2 * k
x, y: nat
H0: exists k : nat, x = 2 * k
H1: exists k : nat, y = 2 * k
k1: nat
H2: x = 2 * k1

exists k : nat, x + y = 2 * k
x, y: nat
H0: exists k : nat, x = 2 * k
H1: exists k : nat, y = 2 * k
k1: nat
H2: x = 2 * k1
k2: nat
H3: y = 2 * k2

exists k : nat, x + y = 2 * k
x, y: nat
H0: exists k : nat, x = 2 * k
H1: exists k : nat, y = 2 * k
k1: nat
H2: x = 2 * k1
k2: nat
H3: y = 2 * k2

x + y = 2 * (k1 + k2)
x, y: nat
H0: exists k : nat, x = 2 * k
H1: exists k : nat, y = 2 * k
k1: nat
H2: x = 2 * k1
k2: nat
H3: y = 2 * k2
A0: forall n m p : nat, n * (m + p) = n * m + n * p

x + y = 2 * (k1 + k2)
x, y: nat
H0: exists k : nat, x = 2 * k
H1: exists k : nat, y = 2 * k
k1: nat
H2: x = 2 * k1
k2: nat
H3: y = 2 * k2
A0: forall n m p : nat, n * (m + p) = n * m + n * p
H4: forall m p : nat, 2 * (m + p) = 2 * m + 2 * p

x + y = 2 * (k1 + k2)
x, y: nat
H0: exists k : nat, x = 2 * k
H1: exists k : nat, y = 2 * k
k1: nat
H2: x = 2 * k1
k2: nat
H3: y = 2 * k2
A0: forall n m p : nat, n * (m + p) = n * m + n * p
H4: forall m p : nat, 2 * (m + p) = 2 * m + 2 * p
H5: forall p : nat, 2 * (k1 + p) = 2 * k1 + 2 * p

x + y = 2 * (k1 + k2)
x, y: nat
H0: exists k : nat, x = 2 * k
H1: exists k : nat, y = 2 * k
k1: nat
H2: x = 2 * k1
k2: nat
H3: y = 2 * k2
A0: forall n m p : nat, n * (m + p) = n * m + n * p
H4: forall m p : nat, 2 * (m + p) = 2 * m + 2 * p
H5: forall p : nat, 2 * (k1 + p) = 2 * k1 + 2 * p
H6: 2 * (k1 + k2) = 2 * k1 + 2 * k2

x + y = 2 * (k1 + k2)
x, y: nat
H0: exists k : nat, x = 2 * k
H1: exists k : nat, y = 2 * k
k1: nat
H2: x = 2 * k1
k2: nat
H3: y = 2 * k2
A0: forall n m p : nat, n * (m + p) = n * m + n * p
H4: forall m p : nat, 2 * (m + p) = 2 * m + 2 * p
H5: forall p : nat, 2 * (k1 + p) = 2 * k1 + 2 * p
H6: 2 * (k1 + k2) = 2 * k1 + 2 * k2

x + y = 2 * k1 + 2 * k2
x, y: nat
H0: exists k : nat, x = 2 * k
H1: exists k : nat, y = 2 * k
k1: nat
H2: x = 2 * k1
k2: nat
H3: y = 2 * k2
A0: forall n m p : nat, n * (m + p) = n * m + n * p
H4: forall m p : nat, 2 * (m + p) = 2 * m + 2 * p
H5: forall p : nat, 2 * (k1 + p) = 2 * k1 + 2 * p
H6: 2 * (k1 + k2) = 2 * k1 + 2 * k2

x + y = x + 2 * k2
x, y: nat
H0: exists k : nat, x = 2 * k
H1: exists k : nat, y = 2 * k
k1: nat
H2: x = 2 * k1
k2: nat
H3: y = 2 * k2
A0: forall n m p : nat, n * (m + p) = n * m + n * p
H4: forall m p : nat, 2 * (m + p) = 2 * m + 2 * p
H5: forall p : nat, 2 * (k1 + p) = 2 * k1 + 2 * p
H6: 2 * (k1 + k2) = 2 * k1 + 2 * k2

x + y = x + y
equals_intro.

forall x y : nat, even x -> even y -> even (x + y)
x, y: nat
Hx: even x
Hy: even y

even (x + y)
x, y, k1: nat
Hk1: x = 2 * k1
Hy: even y

even (x + y)
x, y, k1: nat
Hk1: x = 2 * k1
k2: nat
Hk2: y = 2 * k2

even (x + y)
x, y, k1: nat
Hk1: x = 2 * k1
k2: nat
Hk2: y = 2 * k2

x + y = 2 * (k1 + k2)
x, y, k1: nat
Hk1: x = 2 * k1
k2: nat
Hk2: y = 2 * k2

2 * k1 + 2 * k2 = 2 * (k1 + k2)
lia. Qed. (* For more examples see 2022/script.v *)