1 (**************************************************************************)
4 (* ||A|| A project by Andrea Asperti *)
6 (* ||I|| Developers: *)
7 (* ||T|| The HELM team. *)
8 (* ||A|| http://helm.cs.unibo.it *)
10 (* \ / This file is distributed under the terms of the *)
11 (* v GNU General Public License Version 2 *)
13 (**************************************************************************)
15 set "baseuri" "cic:/matita/valued_lattice/".
17 include "ordered_groups.ma".
19 record vlattice (R : ogroup) : Type ≝ {
22 join: vl_carr → vl_carr → vl_carr;
23 meet: vl_carr → vl_carr → vl_carr;
24 meet_refl: ∀x. value (meet x x) ≈ value x;
25 join_refl: ∀x. value (join x x) ≈ value x;
26 meet_comm: ∀x,y. value (meet x y) ≈ value (meet y x);
27 join_comm: ∀x,y. value (join x y) ≈ value (join y x);
28 join_assoc: ∀x,y,z. value (join x (join y z)) ≈ value (join (join x y) z);
29 meet_assoc: ∀x,y,z. value (meet x (meet y z)) ≈ value (meet (meet x y) z);
30 meet_wins1: ∀x,y. value (join x (meet x y)) ≈ value x;
31 meet_wins2: ∀x,y. value (meet x (join x y)) ≈ value x;
32 modular_mjp: ∀x,y. value (join x y) + value (meet x y) ≈ value x + value y;
33 join_meet_le: ∀x,y,z. value (join x y) ≤ value (join x (meet y z));
34 meet_join_le: ∀x,y,z. value (meet x y) ≤ value (meet x (join y z))
37 interpretation "valued lattice meet" 'and a b =
38 (cic:/matita/valued_lattice/meet.con _ _ a b).
40 interpretation "valued lattice join" 'or a b =
41 (cic:/matita/valued_lattice/join.con _ _ a b).
43 notation < "\nbsp \mu a" non associative with precedence 80 for @{ 'value2 $a}.
44 interpretation "lattice value" 'value2 a = (cic:/matita/valued_lattice/value.con _ _ a).
46 notation "\mu" non associative with precedence 80 for @{ 'value }.
47 interpretation "lattice value" 'value = (cic:/matita/valued_lattice/value.con _ _).
49 lemma feq_joinr: ∀R.∀L:vlattice R.∀x,y,z:L.
50 μ x ≈ μ y → μ (z ∧ x) ≈ μ (z ∧ y) → μ (z ∨ x) ≈ μ (z ∨ y).
51 intros (R L x y z H H1);
52 apply (plus_cancr ??? (μ(z∧x)));
53 apply (eq_trans ?? (μz + μx) ? (modular_mjp ????));
54 apply (eq_trans ?? (μz + μy) ? H); clear H;
55 apply (eq_trans ?? (μ(z∨y) + μ(z∧y))); [1: apply eq_sym; apply modular_mjp]
56 apply (plus_cancl ??? (- μ (z ∨ y)));
57 apply (eq_trans ?? ? ? (plus_assoc ????));
58 apply (eq_trans ?? (0+ μ(z∧y)) ? (opp_inverse ??));
59 apply (eq_trans ?? ? ? (zero_neutral ??));
60 apply (eq_trans ?? (- μ(z∨y)+ μ(z∨y)+ μ(z∧x)) ?? (plus_assoc ????));
61 apply (eq_trans ?? (0+ μ(z∧x)) ?? (opp_inverse ??));
62 apply (eq_trans ?? (μ (z ∧ x)) ?H1 (zero_neutral ??));
65 lemma modularj: ∀R.∀L:vlattice R.∀y,z:L. μ(y∨z) ≈ μy + μz + -μ (y ∧ z).
67 lapply (modular_mjp ?? y z) as H1;
68 apply (plus_cancr ??? (μ(y ∧ z)));
69 apply (eq_trans ?? ? ? H1); clear H1;
70 apply (eq_trans ?? ? ?? (plus_assoc ????));
71 apply (eq_trans ?? (μy+ μz + 0)); [2: apply feq_plusl; apply eq_sym; apply opp_inverse]
72 apply (eq_trans ?? ? ?? (plus_comm ???));
73 apply (eq_trans ?? (μy + μz) ?? (eq_sym ??? (zero_neutral ??)));
77 lemma modularm: ∀R.∀L:vlattice R.∀y,z:L. μ(y∧z) ≈ μy + μz + -μ (y ∨ z).
79 lapply (modular_mjp ?? y z) as H1;
80 apply (plus_cancl ??? (μ(y ∨ z)));
81 apply (eq_trans ?? ? ? H1); clear H1;
82 apply (eq_trans ????? (plus_comm ???));
83 apply (eq_trans ?? ? ?? (plus_assoc ????));
84 apply (eq_trans ?? (μy+ μz + 0)); [2: apply feq_plusl; apply eq_sym; apply opp_inverse]
85 apply (eq_trans ?? ? ?? (plus_comm ???));
86 apply (eq_trans ?? (μy + μz) ?? (eq_sym ??? (zero_neutral ??)));
90 lemma modularmj: ∀R.∀L:vlattice R.∀x,y,z:L.μ(x∧(y∨z))≈(μx + μ(y ∨ z) + - μ(x∨(y∨z))).
92 lapply (modular_mjp ?? x (y ∨ z)) as H1;
93 apply (eq_trans ?? (μ(x∨(y∨z))+ μ(x∧(y∨z)) +-μ(x∨(y∨z))) ?? H1); clear H1;
94 apply (eq_trans ?? ? ?? (plus_comm ???));
95 (* apply (eq_trans ?? (0+μ(x∧(y∧z))) ?? (opp_inverse ??)); ASSERT FALSE *)
96 apply (eq_trans ?? (- μ(x∨(y∨z))+ μ(x∨(y∨z))+ μ(x∧(y∨z)))); [2: apply eq_sym; apply plus_assoc;]
97 apply (eq_trans ?? (0+μ(x∧(y∨z)))); [2: apply feq_plusr; apply eq_sym; apply opp_inverse;]
98 (* apply (eq_trans ?? ? ? (eq_refl ??) (zero_neutral ??)); ASSERT FALSE *)
99 apply (eq_trans ?? (μ(x∧(y∨z)))); [apply eq_reflexive]
100 apply eq_sym; apply zero_neutral.
103 lemma step1_3_57: ∀R.∀L:vlattice R.∀x,y,z:L.
104 μ(x ∧ (y ∨ z)) ≈ (μ x) + (μ y) + μ z + -μ (y ∧ z) + -μ (z ∨ (x ∨ y)).
106 apply (eq_trans ?? ? ? (modularmj ?? x y z));
107 apply (eq_trans ?? ( μx+ (μy+ μz+- μ(y∧z)) +- μ(x∨(y∨z))) ?); [
108 apply feq_plusr; apply feq_plusl; apply (modularj ?? y z);]
109 apply (eq_trans ?? (μx+ μy+ μz+- μ(y∧z)+- μ(x∨(y∨z)))); [2:
110 apply feq_plusl; apply feq_opp;
111 apply (eq_trans ?? ? ? (join_assoc ?????));
112 apply (eq_trans ?? ? ? (join_comm ????));
114 apply feq_plusr; apply (eq_trans ?? ? ? (plus_assoc ????));
115 apply feq_plusr; apply plus_assoc;
118 lemma meet_join_le1: ∀R.∀L:vlattice R.∀x,y,z:L.μ (x ∧ z) ≤ μ (x ∧ (y ∨ z)).
120 apply (le_rewr ??? ? (eq_sym ??? (step1_3_57 ?????)));
121 apply (le_rewr ??? (μx+ μy+ μz+- μ(y∧z)+ -μ(z∨x∨y))); [
122 apply feq_plusl; apply feq_opp; apply (eq_trans ?? ? ?? (eq_sym ??? (join_assoc ?????))); apply eq_reflexive;]
123 apply (le_rewr ??? (μx+ μy+ μz+- μ(y∧z)+ (- ( μ(z∨x)+ μy+- μ((z∨x)∧y))))); [
124 apply feq_plusl; apply feq_opp; apply eq_sym; apply modularj]
125 apply (le_rewr ??? (μx+ μy+ μz+- μ(y∧z)+ (- μ(z∨x)+ -μy+-- μ((z∨x)∧y)))); [
126 apply feq_plusl; apply (eq_trans ?? (- (μ(z∨x)+ μy) + -- μ((z∨x)∧y))); [
127 apply feq_plusr; apply eq_sym; apply eq_opp_plus_plus_opp_opp;]
128 apply eq_sym; apply eq_opp_plus_plus_opp_opp;]
129 apply (le_rewr ??? (μx+ μy+ μz+- μ(y∧z)+(- μ(z∨x)+- μy+ μ(y∧(z∨x))))); [
130 repeat apply feq_plusl; apply eq_sym; apply (eq_trans ?? (μ((z∨x)∧y)) ? (eq_opp_opp_x_x ??));
132 apply (le_rewr ??? (μx+ μy+ μz+- μ(y∧z)+(- μ(z∨x)+- μy)+ μ(y∧(z∨x)))); [
133 apply eq_sym; apply plus_assoc;]
134 apply (le_rewr ??? (μx+ μy+ μz+- μ(y∧z)+(- μy + - μ(z∨x))+ μ(y∧(z∨x)))); [
135 repeat apply feq_plusr; repeat apply feq_plusl; apply plus_comm;]
136 apply (le_rewr ??? (μx+ μy+ μz+- μ(y∧z)+- μy + - μ(z∨x)+ μ(y∧(z∨x)))); [
137 repeat apply feq_plusr; apply eq_sym; apply plus_assoc;]
138 apply (le_rewr ??? (μx+ μy+ μz+- μy + - μ(y∧z)+- μ(z∨x)+ μ(y∧(z∨x)))); [
139 repeat apply feq_plusr; apply (eq_trans ?? ? ?? (plus_assoc ????));
140 apply (eq_trans ?? ( μx+ μy+ μz+(- μy+- μ(y∧z))) ? (eq_sym ??? (plus_assoc ????)));
141 apply feq_plusl; apply plus_comm;]
142 apply (le_rewr ??? (μx+ μy+ -μy+ μz + - μ(y∧z)+- μ(z∨x)+ μ(y∧(z∨x)))); [
143 repeat apply feq_plusr; apply (eq_trans ?? ? ?? (plus_assoc ????));
144 apply (eq_trans ?? (μx+ μy+( -μy+ μz)) ? (eq_sym ??? (plus_assoc ????)));
145 apply feq_plusl; apply plus_comm;]
146 apply (le_rewr ??? (μx+ 0 + μz + - μ(y∧z)+- μ(z∨x)+ μ(y∧(z∨x)))); [
147 repeat apply feq_plusr; apply (eq_trans ?? ? ?? (plus_assoc ????));
148 apply feq_plusl; apply eq_sym; apply (eq_trans ?? ? ? (plus_comm ???));
149 apply opp_inverse; apply eq_reflexive;]
150 apply (le_rewr ??? (μx+ μz + - μ(y∧z)+- μ(z∨x)+ μ(y∧(z∨x)))); [
151 repeat apply feq_plusr; apply (eq_trans ?? ? ?? (plus_comm ???));
152 apply eq_sym; apply zero_neutral;]
153 apply (le_rewr ??? (μz+ μx + - μ(y∧z)+- μ(z∨x)+ μ(y∧(z∨x)))); [
154 repeat apply feq_plusr; apply plus_comm;]
155 apply (le_rewr ??? (μz+ μx +- μ(z∨x)+ - μ(y∧z)+ μ(y∧(z∨x)))); [
156 repeat apply feq_plusr; apply (eq_trans ?? ? ?? (plus_assoc ????));
157 apply (eq_trans ?? ? ? (eq_sym ??? (plus_assoc ????))); apply feq_plusl;
159 apply (le_rewr ??? (μ(z∧x)+ - μ(y∧z)+ μ(y∧(z∨x)))); [
160 repeat apply feq_plusr; apply modularm;]
161 apply (le_rewr ??? (μ(z∧x)+ (- μ(y∧z)+ μ(y∧(z∨x)))) (plus_assoc ????));
162 apply (le_rewl ??? (μ(x∧z) + 0)); [apply (eq_trans ?? ? ? (plus_comm ???)); apply zero_neutral]
163 apply (le_rewl ??? (μ(x∧z) + (-μ(y∧z) + μ(y∧z)))); [ apply feq_plusl; apply opp_inverse]
164 apply (le_rewl ??? (μ(z∧x) + (-μ(y∧z) + μ(y∧z)))); [ apply feq_plusr; apply meet_comm;]
165 repeat apply fle_plusl; apply meet_join_le;