Built with Alectryon, running Coq+SerAPI v8.18.0+0.18.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.
[Loading ML file number_string_notation_plugin.cmxs (using legacy method) ... done]
Generalizable Variables A B C R V f l n m Vlt. Import Quoting.Instances. Section content. Context `{DecidablePaths C}. Context `(phi : C -> R) `{AlmostRingPreserving C R phi} `{!AlmostRing C} `{!AlmostRing R}.
C: Type
H: DecidablePaths C
R: Type
phi: C -> R
Aplus: Plus C
Bplus: Plus R
Amult: Mult C
Bmult: Mult R
Azero: Zero C
Bzero: Zero R
Aone: One C
Bone: One R
Aneg: AlmostNegate C
Bneg: AlmostNegate R
H0: AlmostRingPreserving phi
AlmostRing0: AlmostRing C
AlmostRing1: AlmostRing R
V: Type0
l: V -> R
n, m: R
V': Type0
l': V' -> R
Q: Quoting.EqQuote R l n m l'
Vlt: Relation V
H1: Trichotomy Vlt
Vlt': Relation V'
H2: Trichotomy Vlt'

eval phi (Quoting.merge R l l') (toPol (Quoting.expr_map inl (Quoting.eqquote_l R))) = eval phi (Quoting.merge R l l') (toPol (Quoting.eqquote_r R)) -> n = m
C: Type
H: DecidablePaths C
R: Type
phi: C -> R
Aplus: Plus C
Bplus: Plus R
Amult: Mult C
Bmult: Mult R
Azero: Zero C
Bzero: Zero R
Aone: One C
Bone: One R
Aneg: AlmostNegate C
Bneg: AlmostNegate R
H0: AlmostRingPreserving phi
AlmostRing0: AlmostRing C
AlmostRing1: AlmostRing R
V: Type0
l: V -> R
n, m: R
V': Type0
l': V' -> R
Q: Quoting.EqQuote R l n m l'
Vlt: Relation V
H1: Trichotomy Vlt
Vlt': Relation V'
H2: Trichotomy Vlt'

eval phi (Quoting.merge R l l') (toPol (Quoting.expr_map inl (Quoting.eqquote_l R))) = eval phi (Quoting.merge R l l') (toPol (Quoting.eqquote_r R)) -> n = m
C: Type
H: DecidablePaths C
R: Type
phi: C -> R
Aplus: Plus C
Bplus: Plus R
Amult: Mult C
Bmult: Mult R
Azero: Zero C
Bzero: Zero R
Aone: One C
Bone: One R
Aneg: AlmostNegate C
Bneg: AlmostNegate R
H0: AlmostRingPreserving phi
AlmostRing0: AlmostRing C
AlmostRing1: AlmostRing R
V: Type0
l: V -> R
n, m: R
V': Type0
l': V' -> R
Q: Quoting.EqQuote R l n m l'
Vlt: Relation V
H1: Trichotomy Vlt
Vlt': Relation V'
H2: Trichotomy Vlt'
E: eval phi (Quoting.merge R l l') (toPol (Quoting.expr_map inl (Quoting.eqquote_l R))) = eval phi (Quoting.merge R l l') (toPol (Quoting.eqquote_r R))

n = m
C: Type
H: DecidablePaths C
R: Type
phi: C -> R
Aplus: Plus C
Bplus: Plus R
Amult: Mult C
Bmult: Mult R
Azero: Zero C
Bzero: Zero R
Aone: One C
Bone: One R
Aneg: AlmostNegate C
Bneg: AlmostNegate R
H0: AlmostRingPreserving phi
AlmostRing0: AlmostRing C
AlmostRing1: AlmostRing R
V: Type0
l: V -> R
n, m: R
V': Type0
l': V' -> R
Q: Quoting.EqQuote R l n m l'
Vlt: Relation V
H1: Trichotomy Vlt
Vlt': Relation V'
H2: Trichotomy Vlt'
E: eval phi (Quoting.merge R l l') (toPol (Quoting.expr_map inl (Quoting.eqquote_l R))) = eval phi (Quoting.merge R l l') (toPol (Quoting.eqquote_r R))

Quoting.eval R (Quoting.merge R l l') (Quoting.expr_map inl (Quoting.eqquote_l R)) = Quoting.eval R (Quoting.merge R l l') (Quoting.eqquote_r R)
C: Type
H: DecidablePaths C
R: Type
phi: C -> R
Aplus: Plus C
Bplus: Plus R
Amult: Mult C
Bmult: Mult R
Azero: Zero C
Bzero: Zero R
Aone: One C
Bone: One R
Aneg: AlmostNegate C
Bneg: AlmostNegate R
H0: AlmostRingPreserving phi
AlmostRing0: AlmostRing C
AlmostRing1: AlmostRing R
V: Type0
l: V -> R
n, m: R
V': Type0
l': V' -> R
Q: Quoting.EqQuote R l n m l'
Vlt: Relation V
H1: Trichotomy Vlt
Vlt': Relation V'
H2: Trichotomy Vlt'
E: eval phi (Quoting.merge R l l') (toPol (Quoting.expr_map inl (Quoting.eqquote_l R))) = eval phi (Quoting.merge R l l') (toPol (Quoting.eqquote_r R))

eval phi (Quoting.merge R l l') (toPol (Quoting.expr_map inl (Quoting.eqquote_l R))) = Quoting.eval R (Quoting.merge R l l') (Quoting.eqquote_r R)
C: Type
H: DecidablePaths C
R: Type
phi: C -> R
Aplus: Plus C
Bplus: Plus R
Amult: Mult C
Bmult: Mult R
Azero: Zero C
Bzero: Zero R
Aone: One C
Bone: One R
Aneg: AlmostNegate C
Bneg: AlmostNegate R
H0: AlmostRingPreserving phi
AlmostRing0: AlmostRing C
AlmostRing1: AlmostRing R
V: Type0
l: V -> R
n, m: R
V': Type0
l': V' -> R
Q: Quoting.EqQuote R l n m l'
Vlt: Relation V
H1: Trichotomy Vlt
Vlt': Relation V'
H2: Trichotomy Vlt'
E: eval phi (Quoting.merge R l l') (toPol (Quoting.expr_map inl (Quoting.eqquote_l R))) = eval phi (Quoting.merge R l l') (toPol (Quoting.eqquote_r R))

eval phi (Quoting.merge R l l') (toPol (Quoting.expr_map inl (Quoting.eqquote_l R))) = eval phi (Quoting.merge R l l') (toPol (Quoting.eqquote_r R))
exact E. Qed.
C: Type
H: DecidablePaths C
R: Type
phi: C -> R
Aplus: Plus C
Bplus: Plus R
Amult: Mult C
Bmult: Mult R
Azero: Zero C
Bzero: Zero R
Aone: One C
Bone: One R
Aneg: AlmostNegate C
Bneg: AlmostNegate R
H0: AlmostRingPreserving phi
AlmostRing0: AlmostRing C
AlmostRing1: AlmostRing R
V: Type0
l: V -> R
n, m: R
V': Type0
l': V' -> R
Q: Quoting.EqQuote R l n m l'
Vlt: Relation V
H1: Trichotomy Vlt
Vlt': Relation V'
H2: Trichotomy Vlt'

(toPol (Quoting.expr_map inl (Quoting.eqquote_l R)) =? toPol (Quoting.eqquote_r R)) = true -> n = m
C: Type
H: DecidablePaths C
R: Type
phi: C -> R
Aplus: Plus C
Bplus: Plus R
Amult: Mult C
Bmult: Mult R
Azero: Zero C
Bzero: Zero R
Aone: One C
Bone: One R
Aneg: AlmostNegate C
Bneg: AlmostNegate R
H0: AlmostRingPreserving phi
AlmostRing0: AlmostRing C
AlmostRing1: AlmostRing R
V: Type0
l: V -> R
n, m: R
V': Type0
l': V' -> R
Q: Quoting.EqQuote R l n m l'
Vlt: Relation V
H1: Trichotomy Vlt
Vlt': Relation V'
H2: Trichotomy Vlt'

(toPol (Quoting.expr_map inl (Quoting.eqquote_l R)) =? toPol (Quoting.eqquote_r R)) = true -> n = m
C: Type
H: DecidablePaths C
R: Type
phi: C -> R
Aplus: Plus C
Bplus: Plus R
Amult: Mult C
Bmult: Mult R
Azero: Zero C
Bzero: Zero R
Aone: One C
Bone: One R
Aneg: AlmostNegate C
Bneg: AlmostNegate R
H0: AlmostRingPreserving phi
AlmostRing0: AlmostRing C
AlmostRing1: AlmostRing R
V: Type0
l: V -> R
n, m: R
V': Type0
l': V' -> R
Q: Quoting.EqQuote R l n m l'
Vlt: Relation V
H1: Trichotomy Vlt
Vlt': Relation V'
H2: Trichotomy Vlt'
E: (toPol (Quoting.expr_map inl (Quoting.eqquote_l R)) =? toPol (Quoting.eqquote_r R)) = true

n = m
C: Type
H: DecidablePaths C
R: Type
phi: C -> R
Aplus: Plus C
Bplus: Plus R
Amult: Mult C
Bmult: Mult R
Azero: Zero C
Bzero: Zero R
Aone: One C
Bone: One R
Aneg: AlmostNegate C
Bneg: AlmostNegate R
H0: AlmostRingPreserving phi
AlmostRing0: AlmostRing C
AlmostRing1: AlmostRing R
V: Type0
l: V -> R
n, m: R
V': Type0
l': V' -> R
Q: Quoting.EqQuote R l n m l'
Vlt: Relation V
H1: Trichotomy Vlt
Vlt': Relation V'
H2: Trichotomy Vlt'
E: (toPol (Quoting.expr_map inl (Quoting.eqquote_l R)) =? toPol (Quoting.eqquote_r R)) = true

eval phi (Quoting.merge R l l') (toPol (Quoting.expr_map inl (Quoting.eqquote_l R))) = eval phi (Quoting.merge R l l') (toPol (Quoting.eqquote_r R))
apply eval_eqb,E. Qed.
C: Type
H: DecidablePaths C
R: Type
phi: C -> R
Aplus: Plus C
Bplus: Plus R
Amult: Mult C
Bmult: Mult R
Azero: Zero C
Bzero: Zero R
Aone: One C
Bone: One R
Aneg: AlmostNegate C
Bneg: AlmostNegate R
H0: AlmostRingPreserving phi
AlmostRing0: AlmostRing C
AlmostRing1: AlmostRing R
V: Type0
Vlt: Relation V
H1: Trichotomy Vlt
a, b: Quoting.Expr V
vs: V -> R

eval phi vs (toPol a) = eval phi vs (toPol b) -> Quoting.eval R vs a = Quoting.eval R vs b
C: Type
H: DecidablePaths C
R: Type
phi: C -> R
Aplus: Plus C
Bplus: Plus R
Amult: Mult C
Bmult: Mult R
Azero: Zero C
Bzero: Zero R
Aone: One C
Bone: One R
Aneg: AlmostNegate C
Bneg: AlmostNegate R
H0: AlmostRingPreserving phi
AlmostRing0: AlmostRing C
AlmostRing1: AlmostRing R
V: Type0
Vlt: Relation V
H1: Trichotomy Vlt
a, b: Quoting.Expr V
vs: V -> R

eval phi vs (toPol a) = eval phi vs (toPol b) -> Quoting.eval R vs a = Quoting.eval R vs b
C: Type
H: DecidablePaths C
R: Type
phi: C -> R
Aplus: Plus C
Bplus: Plus R
Amult: Mult C
Bmult: Mult R
Azero: Zero C
Bzero: Zero R
Aone: One C
Bone: One R
Aneg: AlmostNegate C
Bneg: AlmostNegate R
H0: AlmostRingPreserving phi
AlmostRing0: AlmostRing C
AlmostRing1: AlmostRing R
V: Type0
Vlt: Relation V
H1: Trichotomy Vlt
a, b: Quoting.Expr V
vs: V -> R

Quoting.eval R vs a = Quoting.eval R vs b -> Quoting.eval R vs a = Quoting.eval R vs b
trivial. Qed.
C: Type
H: DecidablePaths C
R: Type
phi: C -> R
Aplus: Plus C
Bplus: Plus R
Amult: Mult C
Bmult: Mult R
Azero: Zero C
Bzero: Zero R
Aone: One C
Bone: One R
Aneg: AlmostNegate C
Bneg: AlmostNegate R
H0: AlmostRingPreserving phi
AlmostRing0: AlmostRing C
AlmostRing1: AlmostRing R
V: Type0
Vlt: Relation V
H1: Trichotomy Vlt
a, b: Quoting.Expr V
vs: V -> R

(toPol a =? toPol b) = true -> Quoting.eval R vs a = Quoting.eval R vs b
C: Type
H: DecidablePaths C
R: Type
phi: C -> R
Aplus: Plus C
Bplus: Plus R
Amult: Mult C
Bmult: Mult R
Azero: Zero C
Bzero: Zero R
Aone: One C
Bone: One R
Aneg: AlmostNegate C
Bneg: AlmostNegate R
H0: AlmostRingPreserving phi
AlmostRing0: AlmostRing C
AlmostRing1: AlmostRing R
V: Type0
Vlt: Relation V
H1: Trichotomy Vlt
a, b: Quoting.Expr V
vs: V -> R

(toPol a =? toPol b) = true -> Quoting.eval R vs a = Quoting.eval R vs b
C: Type
H: DecidablePaths C
R: Type
phi: C -> R
Aplus: Plus C
Bplus: Plus R
Amult: Mult C
Bmult: Mult R
Azero: Zero C
Bzero: Zero R
Aone: One C
Bone: One R
Aneg: AlmostNegate C
Bneg: AlmostNegate R
H0: AlmostRingPreserving phi
AlmostRing0: AlmostRing C
AlmostRing1: AlmostRing R
V: Type0
Vlt: Relation V
H1: Trichotomy Vlt
a, b: Quoting.Expr V
vs: V -> R
X: (toPol a =? toPol b) = true

Quoting.eval R vs a = Quoting.eval R vs b
C: Type
H: DecidablePaths C
R: Type
phi: C -> R
Aplus: Plus C
Bplus: Plus R
Amult: Mult C
Bmult: Mult R
Azero: Zero C
Bzero: Zero R
Aone: One C
Bone: One R
Aneg: AlmostNegate C
Bneg: AlmostNegate R
H0: AlmostRingPreserving phi
AlmostRing0: AlmostRing C
AlmostRing1: AlmostRing R
V: Type0
Vlt: Relation V
H1: Trichotomy Vlt
a, b: Quoting.Expr V
vs: V -> R
X: (toPol a =? toPol b) = true

eval phi vs (toPol a) = eval phi vs (toPol b)
apply eval_eqb;trivial. Qed. End content. Global Instance default_almostneg `{Zero A} : AlmostNegate A | 20 := fun _ => 0. Arguments default_almostneg _ _ _ /. Global Instance negate_almostneg `{Aneg : Negate A} : AlmostNegate A := (-). Arguments negate_almostneg _ _ _ /.
A: Type
Aplus: Plus A
Amult: Mult A
Azero: Zero A
Aone: One A
H: IsSemiCRing A

AlmostRing A
A: Type
Aplus: Plus A
Amult: Mult A
Azero: Zero A
Aone: One A
H: IsSemiCRing A

AlmostRing A
A: Type
Aplus: Plus A
Amult: Mult A
Azero: Zero A
Aone: One A
H: IsSemiCRing A

forall x : A, almost_negate x = almost_negate 1 * x
A: Type
Aplus: Plus A
Amult: Mult A
Azero: Zero A
Aone: One A
H: IsSemiCRing A
x: A

almost_negate x = almost_negate 1 * x
A: Type
Aplus: Plus A
Amult: Mult A
Azero: Zero A
Aone: One A
H: IsSemiCRing A
x: A

0 = 0 * x
symmetry;apply mult_0_l. Qed.
A: Type
Aplus: Plus A
Amult: Mult A
Azero: Zero A
Aone: One A
Anegate: Negate A
H: IsCRing A

AlmostRing A
A: Type
Aplus: Plus A
Amult: Mult A
Azero: Zero A
Aone: One A
Anegate: Negate A
H: IsCRing A

AlmostRing A
A: Type
Aplus: Plus A
Amult: Mult A
Azero: Zero A
Aone: One A
Anegate: Negate A
H: IsCRing A

forall x : A, almost_negate x = almost_negate 1 * x
A: Type
Aplus: Plus A
Amult: Mult A
Azero: Zero A
Aone: One A
Anegate: Negate A
H: IsCRing A
x: A

almost_negate x = almost_negate 1 * x
A: Type
Aplus: Plus A
Amult: Mult A
Azero: Zero A
Aone: One A
Anegate: Negate A
H: IsCRing A
x: A

- x = -1 * x
apply negate_mult_l. Qed.
A, B: Type
Aplus: Plus A
Bplus: Plus B
Amult: Mult A
Bmult: Mult B
Azero: Zero A
Bzero: Zero B
Aone: One A
Bone: One B
f: A -> B
H: IsSemiRingPreserving f

AlmostRingPreserving f
A, B: Type
Aplus: Plus A
Bplus: Plus B
Amult: Mult A
Bmult: Mult B
Azero: Zero A
Bzero: Zero B
Aone: One A
Bone: One B
f: A -> B
H: IsSemiRingPreserving f

AlmostRingPreserving f
A, B: Type
Aplus: Plus A
Bplus: Plus B
Amult: Mult A
Bmult: Mult B
Azero: Zero A
Bzero: Zero B
Aone: One A
Bone: One B
f: A -> B
H: IsSemiRingPreserving f

forall x : A, f (almost_negate x) = almost_negate (f x)
A, B: Type
Aplus: Plus A
Bplus: Plus B
Amult: Mult A
Bmult: Mult B
Azero: Zero A
Bzero: Zero B
Aone: One A
Bone: One B
f: A -> B
H: IsSemiRingPreserving f

A -> f 0 = 0
A, B: Type
Aplus: Plus A
Bplus: Plus B
Amult: Mult A
Bmult: Mult B
Azero: Zero A
Bzero: Zero B
Aone: One A
Bone: One B
f: A -> B
H: IsSemiRingPreserving f

f 0 = 0
apply preserves_0. Qed. Section VarSec. Context `{IsCRing A} `{IsCRing B} {f : A -> B} `{!IsSemiRingPreserving f}.
A: Type
Aplus: Plus A
Amult: Mult A
Azero: Zero A
Aone: One A
Anegate: Negate A
H: IsCRing A
B: Type
Aplus0: Plus B
Amult0: Mult B
Azero0: Zero B
Aone0: One B
Anegate0: Negate B
H0: IsCRing B
f: A -> B
IsSemiRingPreserving0: IsSemiRingPreserving f

AlmostRingPreserving f
A: Type
Aplus: Plus A
Amult: Mult A
Azero: Zero A
Aone: One A
Anegate: Negate A
H: IsCRing A
B: Type
Aplus0: Plus B
Amult0: Mult B
Azero0: Zero B
Aone0: One B
Anegate0: Negate B
H0: IsCRing B
f: A -> B
IsSemiRingPreserving0: IsSemiRingPreserving f

AlmostRingPreserving f
A: Type
Aplus: Plus A
Amult: Mult A
Azero: Zero A
Aone: One A
Anegate: Negate A
H: IsCRing A
B: Type
Aplus0: Plus B
Amult0: Mult B
Azero0: Zero B
Aone0: One B
Anegate0: Negate B
H0: IsCRing B
f: A -> B
IsSemiRingPreserving0: IsSemiRingPreserving f

forall x : A, f (almost_negate x) = almost_negate (f x)
A: Type
Aplus: Plus A
Amult: Mult A
Azero: Zero A
Aone: One A
Anegate: Negate A
H: IsCRing A
B: Type
Aplus0: Plus B
Amult0: Mult B
Azero0: Zero B
Aone0: One B
Anegate0: Negate B
H0: IsCRing B
f: A -> B
IsSemiRingPreserving0: IsSemiRingPreserving f

forall x : A, f (- x) = - f x
apply preserves_negate. Qed. End VarSec. Arguments normalize_eq {C _ R} phi {_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _} _. Arguments by_quoting {C _ R} phi {_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _} _. Ltac ring_with_nat := match goal with |- @paths ?R _ _ => ((pose proof (_ : IsSemiCRing R)) || fail "target equality not on a semiring"); apply (by_quoting (naturals_to_semiring nat R)); reflexivity end. Ltac ring_with_integers Z := match goal with |- @paths ?R _ _ => ((pose proof (_ : IsCRing R)) || fail "target equality not on a ring"); apply (by_quoting (integers_to_ring Z R)); reflexivity end. Ltac ring_with_self := match goal with |- @paths ?R _ _ => ((pose proof (_ : IsSemiCRing R)) || fail "target equality not on a ring"); apply (by_quoting (@id R)); reflexivity end. Ltac ring_repl a b := let Hrw := fresh "Hrw" in assert (Hrw : a = b);[ring_with_nat|rewrite Hrw;clear Hrw]. Tactic Notation "ring_replace" constr(x) "with" constr(y) := ring_repl x y.