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.
[Loading ML file number_string_notation_plugin.cmxs (using legacy method) ... done]
ClassAlmostNegateA := almost_negate : A -> A.ClassAlmostRingA {Aplus : Plus A} {Amult : Mult A}
{Azero : Zero A} {Aone : One A} {Anegate : AlmostNegate A} :=
{ almost_ring_semiring : IsSemiCRing A
; almost_ring_neg_pr : forallx : A, almost_negate x = (almost_negate 1) * x }.Sectionalmostring_mor.Context {AB : 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} {Aneg : AlmostNegate A} {Bneg : AlmostNegate B}.ClassAlmostRingPreserving (f : A -> B) :=
{ almostring_mor_sr_mor : IsSemiRingPreserving f
; almostring_mor_neg : forallx, f (almost_negate x) = almost_negate (f x) }.Endalmostring_mor.ModuleQuoting.InductiveExpr (V:Type0) : Type0 :=
| Var (v : V)
| Zero
| One
| Plus (a b : Expr V)
| Mult (a b : Expr V)
| Neg (a : Expr V)
.Arguments Var {V} v.Arguments Zero {V}.Arguments One {V}.Arguments Plus {V} a b.Arguments Mult {V} a b.Arguments Neg {V} a.Sectioncontents.UniverseU.Context (R:Type@{U}) `{AlmostRing R}.NotationVars V := (V -> R).Fixpointeval {V:Type0} (vs : Vars V) (e : Expr V) : R :=
match e with
| Var v => vs v
| Zero => 0
| One => 1
| Plus a b => eval vs a + eval vs b
| Mult a b => eval vs a * eval vs b
| Neg a => almost_negate (eval vs a)
end.
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 vs, vs': Vars V
vs == vs' -> eval vs == eval vs'
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 vs, vs': Vars V
vs == vs' -> eval vs == eval vs'
intros E e;induction e;simpl;auto;apply ap011;auto.Qed.
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R
Vars Empty
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R
Vars Empty
intros [].Defined.Definitionsingletonx : Vars Unit := fun_ => x.Definitionmerge {AB:Type0 } (va:Vars A) (vb:Vars B) : Vars (sum@{SetSet} A B)
:= funi => match i with inl i => va i | inr i => vb i end.SectionLookup.ClassLookup {A:Type0 } (x: R) (f: Vars A)
:= { lookup: A; lookup_correct: f lookup = x }.GlobalArguments lookup {A} x f {_}.Context (x:R) {AB:Type0 } (va : Vars A) (vb : Vars B).
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R x: R A, B: Type0 va: Vars A vb: Vars B Lookup0: Lookup x va
Lookup x (merge va vb)
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R x: R A, B: Type0 va: Vars A vb: Vars B Lookup0: Lookup x va
Lookup x (merge va vb)
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R x: R A, B: Type0 va: Vars A vb: Vars B Lookup0: Lookup x va
merge va vb (inl (lookup x va)) = x
exact lookup_correct.Defined.
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R x: R A, B: Type0 va: Vars A vb: Vars B Lookup0: Lookup x vb
Lookup x (merge va vb)
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R x: R A, B: Type0 va: Vars A vb: Vars B Lookup0: Lookup x vb
Lookup x (merge va vb)
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R x: R A, B: Type0 va: Vars A vb: Vars B Lookup0: Lookup x vb
merge va vb (inr (lookup x vb)) = x
exact lookup_correct.Defined.
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R x: R A, B: Type0 va: Vars A vb: Vars B
Lookup x (singleton x)
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R x: R A, B: Type0 va: Vars A vb: Vars B
Lookup x (singleton x)
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R x: R A, B: Type0 va: Vars A vb: Vars B
singleton x tt = x
reflexivity.Defined.EndLookup.Fixpointexpr_map {VW:Type0 } (f : V -> W) (e : Expr V) : Expr W :=
match e with
| Var v => Var (f v)
| Zero => Zero
| One => One
| Plus a b => Plus (expr_map f a) (expr_map f b)
| Mult a b => Mult (expr_map f a) (expr_map f b)
| Neg a => Neg (expr_map f a)
end.
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V, W: Type0 f: V -> W v: Vars W e: Expr V
eval v (expr_map f e) = eval (v ∘ f) e
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V, W: Type0 f: V -> W v: Vars W e: Expr V
eval v (expr_map f e) = eval (v ∘ f) e
induction e;simpl;tryreflexivity;apply ap011;auto.Qed.SectionQuote.ClassQuote {V:Type0 } (l: Vars V) (n: R) {V':Type0 } (r: Vars V') :=
{ quote : Expr (V |_| V')
; eval_quote : @eval (V |_| V') (merge l r) quote = n }.GlobalArguments quote {V l} n {V' r _}.GlobalArguments eval_quote {V l} n {V' r _}.
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R A, B, C: Type
A + B + C -> A + (B + C)
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R A, B, C: Type
A + B + C -> A + (B + C)
intros [[?|?]|?];auto.Defined.
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R A, B, C: Type
A + B -> A + (B + C)
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R A, B, C: Type
A + B -> A + (B + C)
intros [?|?];auto.Defined.
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V
Quote v 0 noVars
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V
Quote v 0 noVars
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V
eval (merge v noVars) Zero = 0
reflexivity.Defined.
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V
Quote v 1 noVars
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V
Quote v 1 noVars
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V
eval (merge v noVars) One = 1
reflexivity.Defined.
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V n: R V': Type0 v': Vars V' m: R V'': Type0 v'': Vars V'' Quote0: Quote v n v' Quote1: Quote (merge v v') m v''
eval (merge v (merge v' v''))
(Plus (expr_map sum_aux (quote n))
(expr_map sum_assoc (quote m))) = n + m
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V n: R V': Type0 v': Vars V' m: R V'': Type0 v'': Vars V'' Quote0: Quote v n v' Quote1: Quote (merge v v') m v''
eval (merge v (merge v' v''))
(Plus (expr_map sum_aux (quote n))
(expr_map sum_assoc (quote m))) = n + m
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V n: R V': Type0 v': Vars V' m: R V'': Type0 v'': Vars V'' Quote0: Quote v n v' Quote1: Quote (merge v v') m v''
eval (merge v (merge v' v''))
(expr_map sum_aux (quote n)) +
eval (merge v (merge v' v''))
(expr_map sum_assoc (quote m)) = n + m
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V n: R V': Type0 v': Vars V' m: R V'': Type0 v'': Vars V'' Quote0: Quote v n v' Quote1: Quote (merge v v') m v''
eval (merge v (merge v' v'') ∘ sum_aux) (quote n) +
eval (merge v (merge v' v'') ∘ sum_assoc) (quote m) =
eval (merge v v') (quote n) +
eval (merge (merge v v') v'') (quote m)
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V n: R V': Type0 v': Vars V' m: R V'': Type0 v'': Vars V'' Quote0: Quote v n v' Quote1: Quote (merge v v') m v''
merge v (merge v' v'') ∘ sum_aux == merge v v'
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V n: R V': Type0 v': Vars V' m: R V'': Type0 v'': Vars V'' Quote0: Quote v n v' Quote1: Quote (merge v v') m v''
merge v (merge v' v'') ∘ sum_assoc ==
merge (merge v v') v''
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V n: R V': Type0 v': Vars V' m: R V'': Type0 v'': Vars V'' Quote0: Quote v n v' Quote1: Quote (merge v v') m v''
merge v (merge v' v'') ∘ sum_aux == merge v v'
intros [?|?];reflexivity.
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V n: R V': Type0 v': Vars V' m: R V'': Type0 v'': Vars V'' Quote0: Quote v n v' Quote1: Quote (merge v v') m v''
merge v (merge v' v'') ∘ sum_assoc ==
merge (merge v v') v''
intros [[?|?]|?];reflexivity.Qed.
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V n: R V': Type0 v': Vars V' m: R V'': Type0 v'': Vars V'' Quote0: Quote v n v' Quote1: Quote (merge v v') m v''
Quote v (n + m) (merge v' v'')
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V n: R V': Type0 v': Vars V' m: R V'': Type0 v'': Vars V'' Quote0: Quote v n v' Quote1: Quote (merge v v') m v''
Quote v (n + m) (merge v' v'')
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V n: R V': Type0 v': Vars V' m: R V'': Type0 v'': Vars V'' Quote0: Quote v n v' Quote1: Quote (merge v v') m v''
eval (merge v (merge v' v'')) ?quote = n + m
apply quote_plus_ok.Defined.
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V n: R V': Type0 v': Vars V' m: R V'': Type0 v'': Vars V'' Quote0: Quote v n v' Quote1: Quote (merge v v') m v''
eval (merge v (merge v' v''))
(Mult (expr_map sum_aux (quote n))
(expr_map sum_assoc (quote m))) = n * m
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V n: R V': Type0 v': Vars V' m: R V'': Type0 v'': Vars V'' Quote0: Quote v n v' Quote1: Quote (merge v v') m v''
eval (merge v (merge v' v''))
(Mult (expr_map sum_aux (quote n))
(expr_map sum_assoc (quote m))) = n * m
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V n: R V': Type0 v': Vars V' m: R V'': Type0 v'': Vars V'' Quote0: Quote v n v' Quote1: Quote (merge v v') m v''
eval (merge v (merge v' v''))
(expr_map sum_aux (quote n)) *
eval (merge v (merge v' v''))
(expr_map sum_assoc (quote m)) = n * m
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V n: R V': Type0 v': Vars V' m: R V'': Type0 v'': Vars V'' Quote0: Quote v n v' Quote1: Quote (merge v v') m v''
eval (merge v (merge v' v'') ∘ sum_aux) (quote n) *
eval (merge v (merge v' v'') ∘ sum_assoc) (quote m) =
eval (merge v v') (quote n) *
eval (merge (merge v v') v'') (quote m)
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V n: R V': Type0 v': Vars V' m: R V'': Type0 v'': Vars V'' Quote0: Quote v n v' Quote1: Quote (merge v v') m v''
merge v (merge v' v'') ∘ sum_aux == merge v v'
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V n: R V': Type0 v': Vars V' m: R V'': Type0 v'': Vars V'' Quote0: Quote v n v' Quote1: Quote (merge v v') m v''
merge v (merge v' v'') ∘ sum_assoc ==
merge (merge v v') v''
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V n: R V': Type0 v': Vars V' m: R V'': Type0 v'': Vars V'' Quote0: Quote v n v' Quote1: Quote (merge v v') m v''
merge v (merge v' v'') ∘ sum_aux == merge v v'
intros [?|?];reflexivity.
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V n: R V': Type0 v': Vars V' m: R V'': Type0 v'': Vars V'' Quote0: Quote v n v' Quote1: Quote (merge v v') m v''
merge v (merge v' v'') ∘ sum_assoc ==
merge (merge v v') v''
intros [[?|?]|?];reflexivity.Qed.
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V n: R V': Type0 v': Vars V' m: R V'': Type0 v'': Vars V'' Quote0: Quote v n v' Quote1: Quote (merge v v') m v''
Quote v (n * m) (merge v' v'')
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V n: R V': Type0 v': Vars V' m: R V'': Type0 v'': Vars V'' Quote0: Quote v n v' Quote1: Quote (merge v v') m v''
Quote v (n * m) (merge v' v'')
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V n: R V': Type0 v': Vars V' m: R V'': Type0 v'': Vars V'' Quote0: Quote v n v' Quote1: Quote (merge v v') m v''
eval (merge v (merge v' v'')) ?quote = n * m
apply quote_mult_ok.Defined.
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V n: R V': Type0 v': Vars V' Quote0: Quote v n v'
eval (merge v v') (Neg (quote n)) = almost_negate n
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V n: R V': Type0 v': Vars V' Quote0: Quote v n v'
eval (merge v v') (Neg (quote n)) = almost_negate n
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V n: R V': Type0 v': Vars V' Quote0: Quote v n v'
almost_negate (eval (merge v v') (quote n)) =
almost_negate n
apply ap,eval_quote.Qed.
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V n: R V': Type0 v': Vars V' Quote0: Quote v n v'
Quote v (almost_negate n) v'
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V n: R V': Type0 v': Vars V' Quote0: Quote v n v'
Quote v (almost_negate n) v'
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V n: R V': Type0 v': Vars V' Quote0: Quote v n v'
eval (merge v v') (Neg (quote n)) = almost_negate n
apply quote_neg_ok.Defined.
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V x: R i: Lookup x v
Quote v x noVars
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V x: R i: Lookup x v
Quote v x noVars
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V x: R i: Lookup x v
eval (merge v noVars) (Var (inl (lookup x v))) = x
exact lookup_correct.Defined.
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V x: R
Quote v x (singleton x)
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V x: R
Quote v x (singleton x)
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V x: R
eval (merge v (singleton x)) (Var (inr tt)) = x
reflexivity.Defined.EndQuote.Definitionquote': forallx {V':Type0 } {v: Vars V'} {d: Quote noVars x v}, Expr _
:= @quote _ _.Definitioneval_quote': forallx {V':Type0} {v: Vars V'} {d: Quote noVars x v},
eval (merge noVars v) (quote x) = x
:= @eval_quote _ _.ClassEqQuote {V:Type0 } (l: Vars V) (nm: R) {V':Type0 } (r: Vars V') :=
{ eqquote_l : Expr V
; eqquote_r : Expr (V |_| V')
; eval_eqquote : eval (merge l r) (expr_map inl eqquote_l)
= eval (merge l r) eqquote_r -> n = m }.
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V n: R V': Type0 v': Vars V' m: R V'': Type0 v'': Vars V'' Quote0: Quote v n v' Quote1: Quote (merge v v') m v''
eval (merge v (merge v' v''))
(expr_map sum_aux (quote n)) =
eval (merge v (merge v' v''))
(expr_map sum_assoc (quote m)) -> n = m
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V n: R V': Type0 v': Vars V' m: R V'': Type0 v'': Vars V'' Quote0: Quote v n v' Quote1: Quote (merge v v') m v''
eval (merge v (merge v' v''))
(expr_map sum_aux (quote n)) =
eval (merge v (merge v' v''))
(expr_map sum_assoc (quote m)) -> n = m
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V n: R V': Type0 v': Vars V' m: R V'': Type0 v'': Vars V'' Quote0: Quote v n v' Quote1: Quote (merge v v') m v'' E: eval (merge v (merge v' v''))
(expr_map sum_aux (quote n)) =
eval (merge v (merge v' v''))
(expr_map sum_assoc (quote m))
n = m
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V n: R V': Type0 v': Vars V' m: R V'': Type0 v'': Vars V'' Quote0: Quote v n v' Quote1: Quote (merge v v') m v'' E: eval (merge v (merge v' v''))
(expr_map sum_aux (quote n)) =
eval (merge v (merge v' v''))
(expr_map sum_assoc (quote m))
eval (merge v v') (quote n) =
eval (merge (merge v v') v'') (quote m)
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V n: R V': Type0 v': Vars V' m: R V'': Type0 v'': Vars V'' Quote0: Quote v n v' Quote1: Quote (merge v v') m v'' E: eval (merge v (merge v' v''))
(expr_map sum_aux (quote n)) =
eval (merge v (merge v' v''))
(expr_map sum_assoc (quote m))
eval (merge v v') (quote n) =
eval (merge v (merge v' v''))
(expr_map sum_aux (quote n))
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V n: R V': Type0 v': Vars V' m: R V'': Type0 v'': Vars V'' Quote0: Quote v n v' Quote1: Quote (merge v v') m v'' E: eval (merge v (merge v' v''))
(expr_map sum_aux (quote n)) =
eval (merge v (merge v' v''))
(expr_map sum_assoc (quote m))
eval (merge v (merge v' v''))
(expr_map sum_assoc (quote m)) =
eval (merge (merge v v') v'') (quote m)
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V n: R V': Type0 v': Vars V' m: R V'': Type0 v'': Vars V'' Quote0: Quote v n v' Quote1: Quote (merge v v') m v'' E: eval (merge v (merge v' v''))
(expr_map sum_aux (quote n)) =
eval (merge v (merge v' v''))
(expr_map sum_assoc (quote m))
eval (merge v v') (quote n) =
eval (merge v (merge v' v''))
(expr_map sum_aux (quote n))
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V n: R V': Type0 v': Vars V' m: R V'': Type0 v'': Vars V'' Quote0: Quote v n v' Quote1: Quote (merge v v') m v'' E: eval (merge v (merge v' v''))
(expr_map sum_aux (quote n)) =
eval (merge v (merge v' v''))
(expr_map sum_assoc (quote m))
eval (merge v v') (quote n) =
eval (merge v (merge v' v'') ∘ sum_aux) (quote n)
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V n: R V': Type0 v': Vars V' m: R V'': Type0 v'': Vars V'' Quote0: Quote v n v' Quote1: Quote (merge v v') m v'' E: eval (merge v (merge v' v''))
(expr_map sum_aux (quote n)) =
eval (merge v (merge v' v''))
(expr_map sum_assoc (quote m))
merge v v' == merge v (merge v' v'') ∘ sum_aux
intros [?|?];reflexivity.
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V n: R V': Type0 v': Vars V' m: R V'': Type0 v'': Vars V'' Quote0: Quote v n v' Quote1: Quote (merge v v') m v'' E: eval (merge v (merge v' v''))
(expr_map sum_aux (quote n)) =
eval (merge v (merge v' v''))
(expr_map sum_assoc (quote m))
eval (merge v (merge v' v''))
(expr_map sum_assoc (quote m)) =
eval (merge (merge v v') v'') (quote m)
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V n: R V': Type0 v': Vars V' m: R V'': Type0 v'': Vars V'' Quote0: Quote v n v' Quote1: Quote (merge v v') m v'' E: eval (merge v (merge v' v''))
(expr_map sum_aux (quote n)) =
eval (merge v (merge v' v''))
(expr_map sum_assoc (quote m))
eval (merge v (merge v' v'') ∘ sum_assoc) (quote m) =
eval (merge (merge v v') v'') (quote m)
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V n: R V': Type0 v': Vars V' m: R V'': Type0 v'': Vars V'' Quote0: Quote v n v' Quote1: Quote (merge v v') m v'' E: eval (merge v (merge v' v''))
(expr_map sum_aux (quote n)) =
eval (merge v (merge v' v''))
(expr_map sum_assoc (quote m))
merge v (merge v' v'') ∘ sum_assoc ==
merge (merge v v') v''
intros [[?|?]|?];reflexivity.Qed.
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V n: R V': Type0 v': Vars V' m: R V'': Type0 v'': Vars V'' Quote0: Quote v n v' Quote1: Quote (merge v v') m v''
EqQuote (merge v v') n m v''
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V n: R V': Type0 v': Vars V' m: R V'': Type0 v'': Vars V'' Quote0: Quote v n v' Quote1: Quote (merge v v') m v''
EqQuote (merge v v') n m v''
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V n: R V': Type0 v': Vars V' m: R V'': Type0 v'': Vars V'' Quote0: Quote v n v' Quote1: Quote (merge v v') m v''
eval (merge (merge v v') v'')
(expr_map inl ?eqquote_l) =
eval (merge (merge v v') v'') ?eqquote_r -> n = m
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V n: R V': Type0 v': Vars V' m: R V'': Type0 v'': Vars V'' Quote0: Quote v n v' Quote1: Quote (merge v v') m v'' E: eval (merge (merge v v') v'')
(expr_map inl ?eqquote_l) =
eval (merge (merge v v') v'') ?eqquote_r
n = m
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V n: R V': Type0 v': Vars V' m: R V'': Type0 v'': Vars V'' Quote0: Quote v n v' Quote1: Quote (merge v v') m v'' E: eval (merge (merge v v') v'')
(expr_map inl ?eqquote_l) =
eval (merge (merge v v') v'') ?eqquote_r
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V n: R V': Type0 v': Vars V' m: R V'': Type0 v'': Vars V'' Quote0: Quote v n v' Quote1: Quote (merge v v') m v'' E: eval (merge (merge v v') v'')
(expr_map inl ?eqquote_l) =
eval (merge (merge v v') v'') ?eqquote_r
eval (merge v (merge v' v''))
(expr_map sum_aux (quote n)) =
eval (merge (merge v v') v'')
(expr_map inl ?eqquote_l)
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V n: R V': Type0 v': Vars V' m: R V'': Type0 v'': Vars V'' Quote0: Quote v n v' Quote1: Quote (merge v v') m v'' E: eval (merge (merge v v') v'')
(expr_map inl ?eqquote_l) =
eval (merge (merge v v') v'') ?eqquote_r
eval (merge (merge v v') v'') ?eqquote_r =
eval (merge v (merge v' v''))
(expr_map sum_assoc (quote m))
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V n: R V': Type0 v': Vars V' m: R V'': Type0 v'': Vars V'' Quote0: Quote v n v' Quote1: Quote (merge v v') m v'' E: eval (merge (merge v v') v'')
(expr_map inl ?eqquote_l) =
eval (merge (merge v v') v'') ?eqquote_r
eval (merge v (merge v' v''))
(expr_map sum_aux (quote n)) =
eval (merge (merge v v') v'')
(expr_map inl ?eqquote_l)
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V n: R V': Type0 v': Vars V' m: R V'': Type0 v'': Vars V'' Quote0: Quote v n v' Quote1: Quote (merge v v') m v'' E: eval (merge (merge v v') v'')
(expr_map inl ?eqquote_l) =
eval (merge (merge v v') v'') ?eqquote_r
eval (merge v (merge v' v'') ∘ sum_aux) (quote n) =
eval (merge (merge v v') v'' ∘ inl) ?eqquote_l
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V n: R V': Type0 v': Vars V' m: R V'': Type0 v'': Vars V'' Quote0: Quote v n v' Quote1: Quote (merge v v') m v'' E: eval (merge (merge v v') v'')
(expr_map inl (quote n)) =
eval (merge (merge v v') v'') ?eqquote_r
merge v (merge v' v'') ∘ sum_aux ==
merge (merge v v') v'' ∘ inl
intros [?|?];reflexivity.
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V n: R V': Type0 v': Vars V' m: R V'': Type0 v'': Vars V'' Quote0: Quote v n v' Quote1: Quote (merge v v') m v'' E: eval (merge (merge v v') v'')
(expr_map inl (quote n)) =
eval (merge (merge v v') v'') ?eqquote_r
eval (merge (merge v v') v'') ?eqquote_r =
eval (merge v (merge v' v''))
(expr_map sum_assoc (quote m))
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V n: R V': Type0 v': Vars V' m: R V'': Type0 v'': Vars V'' Quote0: Quote v n v' Quote1: Quote (merge v v') m v'' E: eval (merge (merge v v') v'')
(expr_map inl (quote n)) =
eval (merge (merge v v') v'') ?eqquote_r
eval (merge (merge v v') v'') ?eqquote_r =
eval (merge v (merge v' v'') ∘ sum_assoc) (quote m)
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V n: R V': Type0 v': Vars V' m: R V'': Type0 v'': Vars V'' Quote0: Quote v n v' Quote1: Quote (merge v v') m v'' E: eval (merge (merge v v') v'')
(expr_map inl (quote n)) =
eval (merge (merge v v') v'') (quote m)
merge (merge v v') v'' ==
merge v (merge v' v'') ∘ sum_assoc
intros [[?|?]|?];reflexivity.Defined.
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R A, B: Type
Empty + A -> A + B
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R A, B: Type
Empty + A -> A + B
intros [[]|?];auto.Defined.
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V V': Type0 v': Vars V' l, r: R Quote0: Quote noVars l v Quote1: Quote v r v'
letheap := merge v v' ineval heap (expr_map sum_forget (quote l)) =
eval heap (quote r) -> l = r
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V V': Type0 v': Vars V' l, r: R Quote0: Quote noVars l v Quote1: Quote v r v'
letheap := merge v v' ineval heap (expr_map sum_forget (quote l)) =
eval heap (quote r) -> l = r
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V V': Type0 v': Vars V' l, r: R Quote0: Quote noVars l v Quote1: Quote v r v' heap:= merge v v': Vars (V + V') E: eval heap (expr_map sum_forget (quote l)) =
eval heap (quote r)
l = r
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V V': Type0 v': Vars V' l, r: R Quote0: Quote noVars l v Quote1: Quote v r v' heap:= merge v v': Vars (V + V') E: eval heap (expr_map sum_forget (quote l)) =
eval heap (quote r)
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V V': Type0 v': Vars V' l, r: R Quote0: Quote noVars l v Quote1: Quote v r v' heap:= merge v v': Vars (V + V') E: eval heap (expr_map sum_forget (quote l)) =
eval heap (quote r)
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V V': Type0 v': Vars V' l, r: R Quote0: Quote noVars l v Quote1: Quote v r v' heap:= merge v v': Vars (V + V') E: eval heap (expr_map sum_forget (quote l)) =
eval heap (quote r)
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V V': Type0 v': Vars V' l, r: R Quote0: Quote noVars l v Quote1: Quote v r v' heap:= merge v v': Vars (V + V') E: eval heap (expr_map sum_forget (quote l)) =
eval heap (quote r)
merge noVars v == heap ∘ sum_forget
R: Type Aplus: canonical_names.Plus R Amult: canonical_names.Mult R Azero: canonical_names.Zero R Aone: canonical_names.One R Anegate: AlmostNegate R H: AlmostRing R V: Type0 v: Vars V V': Type0 v': Vars V' l, r: R Quote0: Quote noVars l v Quote1: Quote v r v' heap:= merge v v': Vars (V + V') E: eval heap (expr_map sum_forget (quote l)) =
eval heap (quote r) v0: V