Theory AxOverrAndUpd

Up to index of Isabelle/HOL/overriding-update

theory AxOverrAndUpd
imports Main
begin

theory AxOverrAndUpd
imports Main
begin


text
  {* we define a locale containing our symbols, the constant empty set
   and the first three axioms *}

locale ax123 = 
  fixes over :: "'a => 'a => 'a" (infixl "\<rhd>" 101) (*overriding*)
  fixes min :: "'a => 'a => 'a" (infixl "\<ominus>" 102)  (* minus *)
  fixes e   :: "'a"                              (* empty set *)
  assumes idemp: "f \<rhd> f = f"                     (* Ax1 *)
  assumes empty: "f \<ominus> f = e"                     (* Ax2 *)
  assumes swap: "f  \<ominus> g \<rhd> g = g \<rhd> f"           (* Ax3, weaksymmetry in the paper *)

text {* Then we define three different locales containing a different set of axioms. 
        We use it to find proofs of some laws without using all the axioms.*}

locale ax1234 = ax123 + (* context with Axioms 1 to 4 *)
  (* assumes drem: "f - (g - h) = f - (f - h) |> f - g"*)
(*  assumes drem: "min f (min g h) = over (min f (min f h)) (min f g)"*)
  assumes dbmin: "f \<ominus> (g \<ominus> h) = f \<ominus> g \<rhd> f \<ominus> (f \<ominus> h)"

locale ax12345 = ax1234 +
   assumes distr: "(f \<rhd> g) \<ominus> h = (f \<ominus> h) \<rhd> (g \<ominus> h)"

locale ax1235 = ax123 + 
   assumes distr: "(f \<rhd> g) \<ominus> h = (f \<ominus> h) \<rhd> (g \<ominus> h)"

lemma (in ax12345) eUf:
  shows "e \<rhd> f = f"
  by (metis empty swap idemp)
(*proof -
  from empty[where f=f] have "e > f = f-f > f"
  by simp
  also from swap[where f=f] have "… = f > f"
  by simp
  also from idemp[where f=f] have "… = f"
  by simp
  finally show ?thesis by simp
qed*)


lemma (in ax12345) fUe:
  shows "f \<rhd> e = f"
(*  by (metis distr eUf empty idemp swap)*)
  by (metis distr eUf empty idemp swap)
(*  by (metis eUf fMe swap)*)
(*proof - 
  from fMe[where f = f] have "f > e = (f - e) > e"
    by simp
  also from weaksym[where f = e and g = f] have "… = e > f" by simp
  finally show ?thesis by (simp add: eUf)
qed*)
(*proof -
  from empty[where f=f] have "f > e = f > f-f"
  by simp
  also from weakswap[where f=f] have "… = f > f"
  by simp
  also from idemp[where f=f] have "… = f"
  by simp
  finally show ?thesis by simp
qed*)


lemma (in ax12345) fMe:
  shows "f \<ominus> e = f"
  by (metis eUf fUe swap)
(*  by (metis dbmin distr eUf empty idemp swap)*)
(*proof -
  from empty[where f=f] have "f-e = f-(f-f)"
  by simp
  also from drem[where f=f and g=f] have "… = f-(f-f) > f-f"
  by simp
  also from swap[where f=f] have "… = f-f > f"
  by simp
  also from empty[where f=f] have "… = e>f"
  by simp
  also from eUf[where f=f] have "… = f"
  by simp
  finally show ?thesis by simp
qed *)



lemma (in ax12345) overlap1:
(*  shows "f-g > f = f"*)
  shows "over (min f g) f = f"
  by (metis dbmin distr eUf empty fMe fUe swap)
(*proof -
  from swap[where f=f] have "f-g > f = f-(f-g) > f-g"
  by simp
  also from partition1[where f=f] have "… = f"
  by simp
  finally show ?thesis by simp
qed*)


lemma (in ax12345) combrem: 
  shows "f \<ominus> g \<ominus> h = f \<ominus> (g \<rhd> h)"
(*  shows "min (min f g) h = min f (over g h)" *)
  by (metis dbmin distr eUf empty fMe fUe overlap1 swap)


lemma (in ax12345) partition1:
(*  shows "f-(f-g) > f-g = f"*)
  shows "over (min f (min f g)) (min f g) = f"
  by (metis overlap1 swap)
(*proof -
  from drem[where f=f and g=g] have "f-(f-g) > f-g = f-(g-g)"
  by simp
  also from empty[where f=g] have "… = f-e"
  by simp
  also from fMe[where f=f] have "… = f"
  by simp
  finally show ?thesis by simp
qed*)


lemma (in ax12345) eMf:
  shows "e \<ominus>  f = e"
  by (metis fUe overlap1)
(* try without fMgMg
proof -
  from fMe[where f=f] have "e-f = e-(f-e)"
  by simp
  also from drem[where f=e and g=f] have "… = e-(e-e) > e-f"
  by simp
*)
(*proof -
  from empty[where f=f] have "e-f = f-f-f"
  by simp
  also from fMgMg[where g=f] have "… = f-f"
  by simp
  also from empty[where f=f] have "… = e"
  by simp
  finally show ?thesis by simp
qed*)

 
lemma (in ax12345) weakswap: 
  shows "over f (min g f) = over f g"
(*  shows "f > g-f = f > g"*)
  by (metis dbmin empty fMe overlap1 swap)
(*  by (metis distr eMf fMe fUe)*)
(*  by (metis dbmin empty fMe overlap1 swap)*)
(*proof -
  from swap[where g=f] have "f > g-f = g-f-f > f"
  by simp
  also from combrem[where f=g] have "… = g-(f>f) > f"
  by simp
  also from idemp[where f=f] have "… = g-f > f"
  by simp
  also from swap[where f=g] have "… = f > g"
  by simp
  finally show ?thesis by simp
qed *)


(* seems too hard now
lemma drem2:
  shows "f-(g-h) = f-g > f-(f-h)"
proof -
  from drem[where f=f and g=g] have "f-(g-h) = f-(f-h) > f-g"
  by simp
  also from swap[where f="f-g"] have "… = f-g-(f-(f-h)) > f-(f-h)"
  by simp

we do not have f-f[h = f-h yet
*)


lemma (in ax12345) fMgMg:
  shows "(min (min f g) g) = min f g"
(*  shows "f-g-g = f-g"*)
  by (metis combrem idemp)
(*proof -
  from combrem[where f=f] have "f-g-g = f-(g>g)"
  by simp
  also from idemp[where f=g] have "… = f-g"
  by simp
  finally show ?thesis by simp
qed*)


lemma (in ax12345) partition2:
(*  shows "f-g > f-(f-g) = f"*)
  shows "over (min f g) (min f (min f g)) = f"  
  by (metis overlap1 weakswap)
(*proof -
  from swap[where g="f-g"] have "f-g > f-(f-g) = f-(f-g)-(f-g) > f-g"
  by simp
  also from fMgMg[where f=f] have "… = f-(f-g) > f-g"
  by simp
  also from partition1[where f=f] have "… = f"
  by simp
  finally show ?thesis by simp
qed*)

lemma (in ax12345) fMgMf:
  shows "f \<ominus> g \<ominus> f = e"
(* proof -
  from combrem[where f=f] have "f-g-f = f-(g>f)"
  by simp
  also from swap[where f=f] have "… = f-(f-g > g)"
  by simp
  also from combrem[where f=f] have "… = f-(f-g)-g"
  by simp

f-(g-(f-g) > f-g))

f-(g-(f-g))-(f-g)
drem
(f-(f-(f-g)) > f-(f-g))-(f-g)
*)
  by (metis distr empty fUe overlap1)
(*  by (metis combrem eMf empty overlap1)*)
(*proof -
  from partition2[where f=f] have "f-g-f = f-g - (f-g > f-(f-g))"
  by simp
  also from combrem[where f="f-g"] have "… = f-g - (f-g) - (f-(f-g))"
  by simp
  also from empty[where f="f-g"] have "… = e - (f-(f-g))"
  by simp
  also from eMf[where f="f-(f-g)"] have "… = e"
  by simp
  finally show ?thesis by simp
qed*)

lemma (in ax12345) overlap2:
(*  shows "f > f-g = f"*)
  shows "over f (min f g) = f"
 by (metis fMgMf fUe weakswap)
(*proof -
  from swap[where g=f] have "f > f-g = f-g-f > f"
  by simp
  also from fMgMf[where f=f] have "… = e > f"
  by simp
  also from eUf[where f=f] have "… = f"
  by simp
  finally show ?thesis by simp
qed*)

lemma (in ax12345) lem1:
(*  shows "f-(f>g) = e"*)
  shows "min f (over f g) = e"
  by (metis combrem empty fMgMf) (*without axiom 4*)
(*  by (metis combrem eMf empty)*)
(*proof -
  from combrem[where f=f] have "f-(f>g) = f-f-g"
  by simp
  also from empty[where f=f] have "… = e-g"
  by simp
  also from eMf[where f=g] have "… = e"
  by simp
  finally show ?thesis by simp
qed*)

lemma (in ax12345) fUgUf:
(* this is what I would like to work  apply(simp add: idemp empty swap drem combrem) *)
(*  shows "f > g > f = f > g"*)
  shows "over (over f g) f = over f g"
  by (metis distr eUf empty idemp swap) (*without axiom 4 *)
(*  by (metis combrem eMf empty fUe weakswap)*)
(*proof -
  from swap[where f=f] have "f > g > f = f-(f>g) > (f>g)"
  by simp
  also from lem1[where f=f] have "… = e > (f>g)"
  by simp
  also from eUf[where f="f>g"] have "… = f>g"
  by simp
  finally show ?thesis by simp
qed*)


lemma (in ax12345) weaksym:
(*  shows "f-g-h = f-h-g"*)
  shows "min (min f g) h = min (min f h) g"
(*  by (metis distr empty idemp) *) (*without axiom4*)
  by (metis combrem distr eUf fMgMf fUgUf weakswap)
(*proof -
  from combrem[where f=f] have "f-g-h = f-(g>h)"
  by simp
  also from swap[where g=g] have "… = f - (h-g>g)"
  by simp
  also from combrem[where f=f] have "… = f - (h-g) - g"
  by simp
  also from drem[where f=f and g=h] have "… = (f-(f-g) > f-h) - g"
  by simp
  also from distr[where f="f-(f-g)" and g="f-h" and h=g] have "… = f-(f-g)-g > f-h-g"
  by simp
  also from combrem[where f=f] have "… = f-(f-g > g) > f-h-g"
  by simp
  also from swap[where f=f] have "… = f-(g>f) > f-h-g"
  by simp
  also from combrem[where f=f] have "… = f-g-f > f-h-g"
  by simp
  also from fMgMf[where f=f] have "… = e > f-h-g"
  by simp
  also from eUf[where f="f-h-g"] have "… = f-h-g"
  by simp
  finally show ?thesis by simp
qed*)

lemma (in ax12345) lem2:
  shows "over f (min g (min g f)) = f"
  (* shows "f > g-(g-f) = f"*)
(*  by (metis distr eMf eUf fMe fMgMf fUe)*)
  by (metis empty fUe weakswap weaksym)
(*proof -
  from swap[where g=f] have "f > g-(g-f) = g-(g-f)-f > f"
  by simp
  also from weaksym[where f=g and g="g-f" and h=f] have "… = g-f-(g-f) > f"
  by simp
  also from empty[where f="g-f"] have "… = e > f"
  by simp
  also from eUf[where f=f] have "… = f"
  by simp
  finally show ?thesis by simp
qed*)

(*lemma (in ax1235) lem2: 
  shows "min f (over f g) = e"
  by (metis distr eUf empty fUe swap)*)

lemma (in ax12345) lem3:
(*  shows "f-(g-f) = f"*)
  shows "min f (min g f) = f"
(*  by (metis distr eMf fMe fUe)*) (*without axiom 4*)
  by (metis dbmin empty fMe overlap1)
(*proof -
  from drem[where f=f and g=g] have "f-(g-f) = f-(f-f) > f-g"
  by simp
  also from empty[where f=f] have "… = f-e > f-g"
  by simp
  also from fMe[where f=f] have "… = f > f-g"
  by simp
  also from overlap2[where f=f] have "… = f"
  by simp
  finally show ?thesis by simp
qed*)

lemma (in ax12345) lem4:
(*  shows "(f>g>h)-f = g-f > h-f"*)
  shows " min (over (over f g) h) f = over (min g f) (min h f)"
(*by (metis distr eMf eUf fMe fMgMf fUe) *) (*without axiom 4*)
(*  by (metis distr eUf empty)*)
proof -
  from distr[where h=f] have "(f \<rhd> g \<rhd> h) \<ominus> f = (f \<rhd> g) \<ominus> f \<rhd>  h \<ominus> f"
    by (metis distr eMf fMe fUe)
  (*  by simp broken *)
  also from distr[where h=f] have "… = f \<ominus> f \<rhd> g\<ominus> f \<rhd> h \<ominus> f"
    by (metis distr eMf eUf empty fMe fMgMf fUe)
  (*by simp*)
  also from empty[where f=f] have "… = e \<rhd> g \<ominus> f \<rhd> h \<ominus> f"
  by simp
  also from eUf[where f="g \<ominus> f"] have "… = g \<ominus> f \<rhd> h \<ominus> f"
  by simp
  finally show ?thesis by simp
qed

lemma (in ax12345) assoc:
(*  shows "(f > g) > h = f > (g > h)"*)
  shows "over (over f g) h = over f (over g h)"
(*  by (metis distr eUf empty idemp lem3) *)(*proof without axiom 4*)
(*  by (metis combrem distr eUf empty lem3 lem4 overlap1 swap weakswap)*)
  by (metis combrem distr eUf empty lem3 lem4 overlap1 swap weakswap)
(*  by (metis distr eMf eUf fMe fMgMf fUe)*)
(*    by (metis dbmin eUf empty idemp swap) *) (*without axiom 5*)
(*proof -
  from partition2[where g=f] have "f\<rhd> g \<rhd> h = (f\<rhd> g\<rhd> h)\<ominus>f \<rhd>  (f\<rhd> g\<rhd> h)\<ominus>((f\<rhd> g\<rhd> h) \<ominus> f)"
  by simp
  also from lem4[where f=f] have "… = g\<ominus>f \<rhd>  h\<ominus>f \<rhd>  (f\<rhd> g\<rhd> h)\<ominus>((f\<rhd> g\<rhd> h) \<ominus> f)"
  by simp
  also from distr[where h=f] have "… = (g\<rhd> h)\<ominus>f \<rhd>  (f\<rhd> g\<rhd> h)\<ominus>((f\<rhd> g\<rhd> h) \<ominus> f)"
    by (metis distr eUf empty idemp lem3 lem4 weakswap)
  also from lem4[where f=f] have "… = (g\<rhd> h)\<ominus>f \<rhd>  (f\<rhd> g\<rhd> h)\<ominus>(g\<ominus>f \<rhd>  h\<ominus>f)"
  by simp
  also from combrem[where g="g\<ominus>f"] have "… = (g\<rhd> h)\<ominus>f \<rhd>  (f\<rhd> g\<rhd> h)\<ominus>(g\<ominus>f)\<ominus>(h\<ominus>f)"
  by simp
  also from distr[where h="g\<ominus>f"] have "… = (g\<rhd> h)\<ominus>f \<rhd>  ((f\<rhd> g)\<ominus>(g\<ominus>f) \<rhd>  h\<ominus>(g\<ominus>f))\<ominus>(h\<ominus>f)"
    by(metis distr eMf eUf empty idemp)
  also from distr[where h="g\<ominus>f"] have "… = (g\<rhd> h)\<ominus>f \<rhd>  (f\<ominus>(g\<ominus>f) \<rhd>  g\<ominus>(g\<ominus>f) \<rhd>  h\<ominus>(g\<ominus>f))\<ominus>(h\<ominus>f)"
    by (metis distr eMf eUf empty fUe idemp lem2 lem3)
  also from lem3[where f=f] have "… = (g\<rhd> h)\<ominus>f \<rhd>  (f \<rhd>  g\<ominus>(g\<ominus>f) \<rhd>  h\<ominus>(g\<ominus>f))\<ominus>(h\<ominus>f)"
  by simp
  also from lem2[where f=f] have "… = (g\<rhd> h)\<ominus>f \<rhd>  (f \<rhd>  h\<ominus>(g\<ominus>f))\<ominus>(h\<ominus>f)"
  by simp
  also from lem3[where f=f] have "… = (g\<rhd> h)\<ominus>f \<rhd>  (f\<ominus>(g\<ominus>f) \<rhd>  h\<ominus>(g\<ominus>f))\<ominus>(h\<ominus>f)"
  by simp
  also from distr[where h="g\<ominus>f"] have "… = (g\<rhd> h)\<ominus>f \<rhd>  (f\<rhd> h)\<ominus>(g\<ominus>f)\<ominus>(h\<ominus>f)"
    by (metis distr eMf eUf empty fUe idemp lem3)
  also from weaksym[where f="f\<rhd> h"] have "… = (g\<rhd> h)\<ominus>f \<rhd>  (f\<rhd> h)\<ominus>(h\<ominus>f)\<ominus>(g\<ominus>f)"
  by simp
  also from distr[where h="h\<ominus>f"] have "… = (g\<rhd> h)\<ominus>f \<rhd>  (f\<ominus>(h\<ominus>f) \<rhd>  h\<ominus>(h\<ominus>f))\<ominus>(g\<ominus>f)"
    by (metis distr eMf eUf empty idemp lem2 lem3 swap)
  also from lem3[where f=f] have "… = (g\<rhd> h)\<ominus>f \<rhd>  (f \<rhd>  h\<ominus>(h\<ominus>f))\<ominus>(g\<ominus>f)"
  by simp
  also from lem2[where f=f] have "… = (g\<rhd> h)\<ominus>f \<rhd>  f\<ominus>(g\<ominus>f)"
  by simp
  also from lem3[where f=f] have "… = (g\<rhd> h)\<ominus>f \<rhd>  f"
  by simp
  also from swap[where g=f] have "… = f\<rhd> (g\<rhd> h)"
  by simp
  finally show ?thesis by simp
qed*)



lemma (in ax12345) weaksym3:
(*  shows "f-g > f-h = f-h > f-g"*)
  shows "f \<ominus> g \<rhd> f \<ominus> h = f \<ominus> h \<rhd> f \<ominus> g"
(*  by (metis combrem dbmin distr eUf empty lem3 overlap1 swap weakswap weaksym)*)
proof (neg_clausify)
assume 0: "(f::'a::type) \<ominus> (g::'a::type) \<rhd> f \<ominus> (h::'a::type) ≠ f \<ominus> h \<rhd> f \<ominus> g"
have 1: "!!(X1::'a::type) (X2::'a::type) X3::'a::type. X1 \<ominus> (X2 \<rhd> X3) = X1 \<ominus> X2 \<ominus> (X3 \<ominus> X2)"
  by (metis combrem weakswap)
have 2: "!!(X1::'a::type) (X2::'a::type) X3::'a::type. X1 \<ominus> X2 \<ominus> X3 = X1 \<ominus> X2 \<ominus> (X3 \<ominus> X2)"
  by (metis 1 combrem)
have 3: "!!(X1::'a::type) (X2::'a::type) X3::'a::type. X1 \<rhd> X2 \<ominus> X1 \<ominus> X3 = X1 \<rhd> X2 \<ominus> X3"
  by (metis weakswap weaksym)
have 4: "!!(X1::'a::type) X2::'a::type. (e::'a::type) \<rhd> X2 \<ominus> X1 = (X1 \<rhd> X2) \<ominus> X1"
  by (metis distr empty)
have 5: "!!(X1::'a::type) (X2::'a::type) X3::'a::type.
   X1 \<rhd> X3 \<ominus> (X2 \<ominus> X1) = (X1 \<rhd> X3) \<ominus> (X2 \<ominus> X1)"
  by (metis distr lem3)
have 6: "!!(X1::'a::type) X2::'a::type. X2 \<ominus> X1 = (X1 \<rhd> X2) \<ominus> X1"
  by (metis 4 eUf)
have 7: "!!(X1::'a::type) X2::'a::type. (X2 \<rhd> X1) \<ominus> (X1 \<ominus> X2) = X2 \<ominus> (X1 \<ominus> X2)"
  by (metis 6 swap)
have 8: "!!(X1::'a::type) X2::'a::type. (X2 \<rhd> X1) \<ominus> (X1 \<ominus> X2) = X2"
  by (metis 7 lem3)
have 9: "!!(X1::'a::type) X2::'a::type. X1 \<ominus> (X1 \<ominus> (X1 \<ominus> X2)) = X1 \<ominus> X2"
  by (metis 8 overlap1)
have 10: "!!(X1::'a::type) (X2::'a::type) X3::'a::type.
   X1 \<ominus> X2 \<rhd> X1 \<ominus> X3 = X1 \<ominus> (X2 \<ominus> (X1 \<ominus> X3))"
  by (metis dbmin 9)
have 11: "!!(X1::'a::type) (X2::'a::type) X3::'a::type.
   X1 \<rhd> X2 \<ominus> X1 \<ominus> X3 = X1 \<rhd> X2 \<ominus> (X3 \<ominus> X1)"
  by (metis 3 2)
have 12: "!!(X1::'a::type) (X2::'a::type) X3::'a::type. X1 \<rhd> X2 \<ominus> X3 = X1 \<rhd> X2 \<ominus> (X3 \<ominus> X1)"
  by (metis 11 3)
have 13: "!!(X1::'a::type) (X2::'a::type) X3::'a::type. (X1 \<rhd> X2) \<ominus> (X3 \<ominus> X1) = X1 \<rhd> X2 \<ominus> X3"
  by (metis 12 5)
have 14: "!!(X1::'a::type) (X2::'a::type) X3::'a::type.
   X1 \<ominus> (X3 \<ominus> (X1 \<ominus> X2)) = X1 \<ominus> X2 \<rhd> X1 \<ominus> X3"
  by (metis 13 overlap1)
have 15: "(f::'a::type) \<ominus> ((g::'a::type) \<ominus> (f \<ominus> (h::'a::type))) ≠ f \<ominus> h \<rhd> f \<ominus> g"
  by (metis 0 10)
have 16: "(f::'a::type) \<ominus> ((g::'a::type) \<ominus> (f \<ominus> (h::'a::type))) ≠ f \<ominus> (h \<ominus> (f \<ominus> g))"
  by (metis 15 10)
have 17: "!!(X1::'a::type) (X2::'a::type) X3::'a::type.
   X1 \<ominus> (X2 \<ominus> (X1 \<ominus> X3)) = X1 \<ominus> (X3 \<ominus> (X1 \<ominus> X2))"
  by (metis 14 10)
show "False"
  by (metis 16 17)
qed
(*proof -
  from swap[where g="f-g"] have "f-g > f-h = f-h-(f-g) > f-g"
  by simp
  also from weaksym[where f=f] have "… = f-(f-g)-h > f-g"
  by simp
  also from partition2[where g=h] have "… = f-(f-g)-h > (f-g-h > (f-g)@h)"
  by simp
  also from assoc[where g="f-g-h"] have "… = (f-(f-g)-h > f-g-h) > (f-g)@h"
  by simp
  also from idemp[where f="f-g-h"] have "… = (f-(f-g)-h > (f-g-h > f-g-h)) > (f-g)@h"
  by simp
  also from assoc[where h="f-g-h"] have "… = (f-(f-g)-h > f-g-h > f-g-h) > (f-g)@h"
  by simp
  also from distr[where h=h] have "… = (f-(f-g) > f-g)-h > f-g-h > (f-g)@h"
  by simp
  also from swap[where f=f] have "… = (f-g > f)-h > f-g-h > (f-g)@h"
  by simp
  also from overlap1[where f=f] have "… = f-h > f-g-h > (f-g)@h"
  by simp
  also from assoc[where f="f-h"] have "… = f-h > (f-g-h > (f-g)@h)"
  by simp
  also from partition2[where g=h] have "… = f-h > f-g"
  by simp
  finally show ?thesis by simp
qed*)

lemma (in ax12345) drem:
  (* assumes drem: "f - (g - h) = f - (f - h) |> f - g"*)
  (*  assumes drem: "min f (min g h) = over (min f (min f h)) (min f g)"*)
  shows "f \<ominus> (g \<ominus> h) = f \<ominus> (f \<ominus> h) \<rhd> f \<ominus> g"
(*  shows "min f (min g h) = over (min f (min f h)) (min f g)"*)
  by (metis dbmin weaksym3)
(* try alt proof but same need for associativity
lemma lem5:
  shows "f-g > f-h = f-h > f-g"
proof -
  from swap2[where f="f-g"] have "f-g > f-h = f-g > f-h-(f-g)"
  by simp
  also from weaksym[where f=f] have "… = f-g > f-(f-g)-h"
  by simp

  finally show ?thesis by simp
qed*)

lemma (in ax12345) lem6:
(*  shows "(f>g) - (g-f) = f"*)
  shows "min (over f g) (min g f) = f"  
  by (metis distr eUf empty lem3 swap)
(*proof -
  from distr[where f=f] have "(f>g) - (g-f) = f-(g-f) > g-(g-f)"
  by simp
  also from lem3[where f=f] have "… = f > g-(g-f)"
  by simp
  also from lem2[where f=f] have "… = f"
  by simp
  finally show ?thesis by simp
qed*)

lemma (in ax12345) lem7:
(*  shows "(f>g) - (h-f) = f > g-h"*)
  shows "min (over f g) (min h f) = over f (min g h)"
(*  by (metis combrem distr lem3 weakswap weaksym)*)
proof (neg_clausify)
assume 0: "((f::'a::type) \<rhd> (g::'a::type)) \<ominus> ((h::'a::type) \<ominus> f) ≠ f \<rhd> g \<ominus> h"
have 1: "!!(X1::'a::type) (X2::'a::type) X3::'a::type. X1 \<ominus> (X2 \<rhd> X3) = X1 \<ominus> X2 \<ominus> (X3 \<ominus> X2)"
  by (metis combrem weakswap)
have 2: "!!(X1::'a::type) (X2::'a::type) X3::'a::type. X1 \<ominus> X2 \<ominus> X3 = X1 \<ominus> X2 \<ominus> (X3 \<ominus> X2)"
  by (metis 1 combrem)
have 3: "!!(X1::'a::type) (X2::'a::type) X3::'a::type. X1 \<rhd> X2 \<ominus> X1 \<ominus> X3 = X1 \<rhd> X2 \<ominus> X3"
  by (metis weakswap weaksym)
have 4: "!!(X1::'a::type) (X2::'a::type) X3::'a::type.
   X1 \<rhd> X3 \<ominus> (X2 \<ominus> X1) = (X1 \<rhd> X3) \<ominus> (X2 \<ominus> X1)"
  by (metis distr lem3)
have 5: "!!(X1::'a::type) (X2::'a::type) X3::'a::type.
   X1 \<rhd> X2 \<ominus> X1 \<ominus> X3 = X1 \<rhd> X2 \<ominus> (X3 \<ominus> X1)"
  by (metis 3 2)
have 6: "!!(X1::'a::type) (X2::'a::type) X3::'a::type. X1 \<rhd> X2 \<ominus> X3 = X1 \<rhd> X2 \<ominus> (X3 \<ominus> X1)"
  by (metis 5 3)
have 7: "!!(X1::'a::type) (X2::'a::type) X3::'a::type. X1 \<rhd> X3 \<ominus> X2 = (X1 \<rhd> X3) \<ominus> (X2 \<ominus> X1)"
  by (metis 4 6)
show "False"
  by (metis 0 7)
qed
(*proof -
  from drem[where f="f>g" and g=h] have "(f>g) - (h-f) = (f>g)-((f>g)-f) > (f>g) - h"
  by simp
  also from distr[where f=f] have "… = (f>g)-(f-f>g-f) > (f>g) - h"
  by simp
  also from empty[where f=f] have "… = (f>g)-(e>g-f) > (f>g) - h"
  by simp
  also from eUf[where f="g-f"] have "… = (f>g)-(g-f) > (f>g) - h"
  by simp
  also from lem6[where f=f] have "… = f > (f>g) - h"
  by simp
  also from distr[where f=f] have "… = f > (f-h > g-h)"
  by simp
  also from assoc[where f=f] have "… = f > f-h > g-h"
  by simp
  also from overlap2[where f=f] have "… = f > g-h"
  by simp
  finally show ?thesis by simp
qed*)

lemma (in ax12345)
(*  shows "f-g > g-h = g-h > f-g"*)
  shows "over (min f g) (min g h) = over (min g h) (min f g)"
  by (metis combrem overlap2 swap)
(*proof -
  from swap[where g="f-g"] have "f-g > g-h = g-h-(f-g) > f-g"
  by simp
  also from weaksym[where f=g] have "… = g-(f-g)-h > f-g"
  by simp
  also from lem3[where f=g] have "… = g-h > f-g"
  by simp
  finally show ?thesis by simp
qed*)

(* now the lemmas for restriction *)

(* lemma w_drem:
  assumes "f~=g"
  shows "f-(g-h) = f-(f-h) > f-g"
proof -
  from drem[where f=f and g=g] show ?thesis by simp
qed

declare w_drem[simp] *)

locale ax_restri = ax12345 +
  fixes dorestri::"'a => 'a=> 'a" (infixl "\<down>" 103)   (* domain restriction *)
  assumes restri: "f \<down> g = f \<ominus> (f \<ominus> g)" (* "f@g = f-(f-g)"*)

  
lemma (in ax_restri) idemp2:
(*  shows "f@f = f"*)
  shows "f \<down> f = f"
  by (metis lem3 restri)
(*  apply simp
proof -
  from empty[where f=f] and fMe[where f=f] show "f-(f-f)=f" by simp
qed*)

lemma (in ax_restri) (*lem8:*)
(*  shows "f@g > f = f"*)
  shows "f \<down>  g \<rhd>  f = f"
  by (metis overlap1 restri)
(*proof -
  from overlap1[where f=f] have "f-(f-g) > f = f-(f-g) > (f-g > f)"
  by simp
  also from assoc[where h=f] have "… = f-(f-g) > f-g > f"
  by simp
  also from swap[where f=f] have "… = f-g > f > f"
  by simp
  also from assoc[where h=f] have "… = f-g > (f > f)"
  by simp
  also from idemp[where f=f] have "… = f-g > f"
  by simp
  also from overlap1[where f=f] have "… = f"
  by simp
  finally show "f-(f-g) > f = f" by simp
qed*)

lemma (in ax_restri) lem9:
  shows "f \<down> g \<ominus>  g = e"
  by (metis empty restri weaksym)
(*  apply simp
proof -
  from weaksym[where f=f] have "f - (f-g) - g = f - g - (f-g)"
  by simp
  also from empty[where f="f-g"] have "… = e"
  by simp
  finally show "f - (f-g) - g = e" by simp
qed*)

lemma (in ax_restri) (*lem10:*)
  shows "f \<down>  g \<down> (h \<ominus> g) = e"
  by (metis drem eUf empty fMe lem2 lem3 lem7 lem9 overlap1 restri)
(* proof -
  from restri[where f="f@g"] have "f@g@(h-g) = f@g - (f@g - (h-g))"
  by simp
  also from drem[where f="f@g" and g=h and h=g] have "… = f@g - (f@g - (f@g - g) > f@g - h)"
  by simp
  also from lem9[where f=f] have "… = f@g - (f@g-e > f@g-h)"
  by simp
  also from fMe[where f="f@g"] have "… = f@g - (f@g > f@g-h)"
  by simp
  also from overlap2[where f="f@g"] have "… = f@g - f@g"
  by simp
  also from empty[where f="f@g"] have "… = e"
  by simp
  finally show ?thesis by simp
qed *)

lemma (in ax_restri) lem11:
(*  shows "f-h > f-f @ h = f-h"*)
  shows "f \<ominus> h \<rhd> f \<ominus> f \<down> h = f \<ominus> h"
  (*shows "over (min f h) (min f (dorestri f h)) = min f h"*)
  by  (metis eUf lem9 restri swap)

(*proof -
  from swap[where g="f-h"] have "f-h > f-f@h = f-f@h-(f-h) > f-h"
  by simp
  also from combrem[where f=f] have "… = f-(f@h > f-h) > f-h"
  by simp
  also have "… = f-(f-(f-h) > (f-h)) > f-h"
  by simp
  also from swap[where f=f] have "… = f - (f-h > f) > f-h"
  by simp
  also from overlap1[where f=f] have "… = f-f > f-h"
  by simp
  also from empty[where f=f] have "… = e > f-h"
  by simp
  also from eUf[where f="f-h"] have "… = f-h"
  by simp
  finally show ?thesis by simp
qed*)

lemma (in ax_restri) lem12:
(*  shows "f-f@h > f-h = f-f@h"*)
  shows "f \<ominus> f \<down> h \<rhd> f \<ominus> h = f \<ominus> f \<down> h"
  (*shows "over (min f  (dorestri f h)) (min f h) = min f (dorestri f h)"*)
  by(metis distr drem eUf empty fMe overlap1 overlap2 restri swap)
(*proof -
  from swap[where f="f-h"] have "f-f@h > f-h = f-h-(f-f@h) > f-f@h"
  by simp
  also from combrem[where f=f] have "… = f-(h > f-f@h) > f-f@h"
  by simp
  also from lem7[where f=h and g=f and h="f@h"] have "… = f-((h>f) - (f@h-h)) > f-f@h"
  by simp
  also from lem9[where f=f] have "… = f-((h>f) - e) > f-f@h"
  by simp
  also from fMe[where f="h>f"] have "… = f-(h>f) > f-f@h"
  by simp
  also from combrem[where f=f] have "… = f-h-f > f-f@h"
  by simp
  also from weaksym[where f=f] have "… = f-f-h > f-f@h"
  by simp
  also from empty[where f=f] have "… = e-h > f-f@h"
  by simp
  also from eMf[where f=h] have "… = e > f-f@h"
  by simp
  also from eUf[where f="f-f@h"] have "… = f-f@h"
  by simp
  finally show ?thesis by simp
qed*)

lemma (in ax_restri) lem13:
  shows "f \<ominus> f \<down> h = f \<ominus> h"
  by (metis empty fUe lem7 overlap1 restri)
(*proof -
  from lem12[where f=f] have "f-f@h = f-f@h > f-h"
  by simp
  also from weaksym3[where f=f] have "… = f-h > f-f@h"
  by simp
  also from lem11[where f=f] have "… = f-h"
  by simp
  finally show ?thesis by simp
qed *)

lemma (in ax_restri) (*lem14:*)
(*  shows "f@(g@h) = f@g@h"*)
  shows "dorestri f (dorestri g h) = dorestri (dorestri f g) h"
(*  by (metis combrem dbmin drem empty fUe lem13 lem3 lem7 overlap1 restri weakswap weaksym weaksym3)*)
proof -
  from drem[where f=f and g=g and h="g\<ominus> h"] 
  have "f \<down> (g \<down> h) = f \<ominus> (f\<ominus> (f\<ominus> (g \<ominus> h)) \<rhd> f \<ominus> g)"
    by (metis drem restri)
  also from combrem[where f=f] 
  have "… = f \<ominus> (f \<ominus> (f \<ominus> ( g \<ominus> h))) \<ominus> (f \<ominus> g)"
  by simp
  also from weaksym[where f=f] 
  have "… = f \<ominus> (f\<ominus> g) \<ominus> (f\<ominus> (f\<ominus> (g \<ominus> h)))"
  by simp
  also from drem[where f=f and g=g] 
  have "… = f \<ominus> (f\<ominus> g) \<ominus> (f\<ominus> (f\<ominus> (f\<ominus> h) \<rhd>  f \<ominus> g))"
  by simp
  also from combrem[where f="f"] 
  have "… = f \<ominus> (f\<ominus>g \<rhd>  (f\<ominus>(f\<ominus>(f\<ominus>h))) \<ominus> (f\<ominus>g))"
  by simp
  also from lem13[where f=f] 
  have "… = f \<ominus> (f\<ominus>g \<rhd> f\<ominus>h \<ominus> (f\<ominus>g))"
    by (metis combrem lem13 restri weakswap)
  also from weaksym[where f=f] 
  have "… = f \<ominus> (f\<ominus>g \<rhd> f\<ominus>(f\<ominus>g)\<ominus>h)"
  by simp
  also from combrem[where f=f] 
  have "… = f \<ominus> (f\<ominus>g) \<ominus> (f\<ominus>(f\<ominus>g)\<ominus>h)"
  by simp
  finally show ?thesis by (metis restri weaksym)
qed

lemma (in ax_restri) weaksymRes:
(*  shows "f@g@h = f@h@g"*)
  shows "dorestri (dorestri f g) h = dorestri (dorestri f h) g"
  by(metis combrem restri weakswap weaksym)
(*  apply simp
proof -
  from combrem[where f=f] have "f@g@h = f - (f-g > f-(f-g)-h)"
  by simp
  also from weaksym[where f=f] have "… = f - (f-g > f-h-(f-g))"
  by simp
  also from weakswap[where f="f-g"] have "… = f - (f-g > f-h)"
  by simp
  also from combrem[where f=f] have "… = f - (f-g) - (f-h)"
  by simp
  also from weaksym[where f=f] have "… = f - (f-h) - (f-g)"
  by simp
  also from combrem[where f=f] have "… = f - (f-h > f-g)"
  by simp
  also from weakswap[where f="f-h"] have "… = f - (f-h > f-g-(f-h))"
  by simp
  also from weaksym[where f=f] have "… = f - (f-h > f-(f-h)-g)"
  by simp
  also from combrem[where f=f] have "… = f@h@g"
  by simp
  finally show "f - (f - g) - (f - (f - g) - h) = f - (f - h) - (f - (f - h) - g)" by simp
qed*)

lemma (in ax_restri) lem16:
(*  shows "f - g@h = f-g > f-h"*)
  shows "min f (dorestri g h) = over (min f g) (min f h)"
(*  by (metis assoc combrem distr drem eUf empty fUe lem3 lem7 overlap1 restri weakswap weaksym weaksym3 weaksymRes)*)
proof (neg_clausify)
assume 0: "(f::'a::type) \<ominus> (g::'a::type) \<down> (h::'a::type) ≠ f \<ominus> g \<rhd> f \<ominus> h"
have 1: "!!(X1::'a::type) (X2::'a::type) X3::'a::type.
   X1 \<ominus> (X1 \<ominus> X2) \<ominus> (X1 \<ominus> (X1 \<ominus> X2) \<ominus> X3) =
   X1 \<ominus> (X1 \<ominus> X3) \<ominus> (X1 \<ominus> (X1 \<ominus> X3) \<ominus> X2)"
  by (metis weaksymRes restri)
have 2: "(f::'a::type) \<ominus> (g::'a::type) \<rhd> f \<ominus> (h::'a::type) ≠ f \<ominus> (g \<ominus> (g \<ominus> h))"
  by (metis 0 restri)
have 3: "!!(X1::'a::type) (X2::'a::type) X3::'a::type. X1 \<ominus> (X2 \<rhd> X3) = X1 \<ominus> X2 \<ominus> (X3 \<ominus> X2)"
  by (metis combrem weakswap)
have 4: "!!(X1::'a::type) (X2::'a::type) X3::'a::type. X1 \<ominus> X2 \<ominus> X3 = X1 \<ominus> X2 \<ominus> (X3 \<ominus> X2)"
  by (metis 3 combrem)
have 5: "!!(X1::'a::type) (X2::'a::type) X3::'a::type. X1 \<ominus> X3 = X1 \<ominus> X3 \<ominus> (X2 \<ominus> X1)"
  by (metis weaksym lem3)
have 6: "!!(X1::'a::type) (X2::'a::type) X3::'a::type.
   X1 \<ominus> (X3 \<ominus> (X1 \<ominus> X2)) = X1 \<ominus> X2 \<rhd> X1 \<ominus> X3"
  by (metis lem7 overlap1)
have 7: "!!(X1::'a::type) X2::'a::type. (e::'a::type) \<rhd> X2 \<ominus> X1 = (X1 \<rhd> X2) \<ominus> X1"
  by (metis distr empty)
have 8: "!!(X1::'a::type) X2::'a::type. X2 \<ominus> X1 = (X1 \<rhd> X2) \<ominus> X1"
  by (metis 7 eUf)
have 9: "!!(X1::'a::type) (X2::'a::type) X3::'a::type.
   X3 \<ominus> (X1 \<rhd> X2) = (X1 \<rhd> X2 \<rhd> X3) \<ominus> X1 \<ominus> X2"
  by (metis combrem 8)
have 10: "!!(X1::'a::type) (X2::'a::type) X3::'a::type.
   X3 \<ominus> X1 \<ominus> X2 = (X1 \<rhd> X2 \<rhd> X3) \<ominus> X1 \<ominus> X2"
  by (metis 9 combrem)
have 11: "!!(X1::'a::type) (X2::'a::type) X3::'a::type. X3 \<ominus> X1 \<ominus> X2 = (X2 \<rhd> X3) \<ominus> X1 \<ominus> X2"
  by (metis 10 assoc 8)
have 12: "!!(X1::'a::type) (X2::'a::type) X3::'a::type.
   (X1 \<rhd> X2) \<ominus> ((X1 \<rhd> X2) \<ominus> X3) \<ominus> (X2 \<ominus> ((X1 \<rhd> X2) \<ominus> X3) \<ominus> X1) =
   (X1 \<rhd> X2) \<ominus> ((X1 \<rhd> X2) \<ominus> X1) \<ominus> ((X1 \<rhd> X2) \<ominus> ((X1 \<rhd> X2) \<ominus> X1) \<ominus> X3)"
  by (metis 1 11)
have 13: "!!(X1::'a::type) (X2::'a::type) X3::'a::type.
   X1 \<ominus> ((X1 \<rhd> X2) \<ominus> X3) =
   (X1 \<rhd> X2) \<ominus> ((X1 \<rhd> X2) \<ominus> X1) \<ominus> ((X1 \<rhd> X2) \<ominus> ((X1 \<rhd> X2) \<ominus> X1) \<ominus> X3)"
  by (metis 12 weaksym 4 lem7 empty fUe)
have 14: "!!(X1::'a::type) (X2::'a::type) X3::'a::type.
   X1 \<ominus> ((X1 \<rhd> X2) \<ominus> X3) = X1 \<ominus> (X1 \<ominus> X3)"
  by (metis 13 8 lem7 empty fUe)
have 15: "!!(X1::'a::type) (X2::'a::type) X3::'a::type.
   X1 \<ominus> (X3 \<ominus> (X1 \<ominus> (X1 \<ominus> X2))) = X1 \<ominus> (X3 \<ominus> X2)"
  by (metis drem 6)
have 16: "!!(X1::'a::type) (X2::'a::type) X3::'a::type.
   X1 \<ominus> (X3 \<ominus> (X1 \<ominus> X2)) = X1 \<ominus> X3 \<rhd> X1 \<ominus> X2"
  by (metis weaksym3 6)
have 17: "!!(X1::'a::type) (X2::'a::type) X3::'a::type.
   X1 \<ominus> (X3 \<ominus> (X1 \<ominus> X2)) = X1 \<ominus> (X2 \<ominus> (X1 \<ominus> X3))"
  by (metis 16 6)
have 18: "(f::'a::type) \<ominus> ((h::'a::type) \<ominus> (f \<ominus> (g::'a::type))) ≠ f \<ominus> (g \<ominus> (g \<ominus> h))"
  by (metis 2 6)
have 19: "!!(X1::'a::type) (X2::'a::type) X3::'a::type.
   X1 \<ominus> (X2 \<ominus> X3) = X1 \<ominus> (X2 \<ominus> (X1 \<ominus> (X2 \<ominus> X3)))"
  by (metis 17 5)
have 20: "(f::'a::type) \<ominus> ((g::'a::type) \<ominus> (f \<ominus> (h::'a::type))) ≠ f \<ominus> (g \<ominus> (g \<ominus> h))"
  by (metis 18 17)
have 21: "!!(X1::'a::type) (X2::'a::type) X4::'a::type.
   X1 \<ominus> (X2 \<ominus> (X1 \<ominus> (X2 \<ominus> (X2 \<ominus> X4)))) = X1 \<ominus> (X2 \<ominus> (X2 \<ominus> X4))"
  by (metis 19 14)
have 22: "!!(X1::'a::type) (X2::'a::type) X4::'a::type.
   X1 \<ominus> (X2 \<ominus> (X1 \<ominus> X4)) = X1 \<ominus> (X2 \<ominus> (X2 \<ominus> X4))"
  by (metis 21 15)
show "False"
  by (metis 20 22)
qed


(*  apply simp
proof -
  from drem[where f=f and g=g] have "f-(g-(g-h)) = f-(f-(g-h)) > f-g"
  by simp
  also from drem[where f=f and g=g] have "… = f - (f-(f-h) > f-g) > f-g"
  by simp
  also from combrem[where f=f] have "… = f - (f-(f-h)) - (f-g) > f-g"
  by simp
  also from lem13[where f=f] have "… = f-h-(f-g) > f-g"
  by simp
  also from swap[where f="f-h"] have "… = f-g > f-h"
  by simp
  finally show "f-(g-(g-h)) = f-g > f-h" by simp
qed*)

lemma (in ax_restri) (*lem17:*)
(*  shows "f - g@h = f - h@g"*)
  shows "min f (dorestri g h) = min f (dorestri h g)"  
  by (metis lem16 weaksym3)
(*proof -
  from lem16[where f=f] have "f - g@h = f-g > f-h"
  by simp
  also from weaksym3[where f=f] have "…=  f-h > f-g"
  by simp
  also from lem16[where f=f] have "… = f - h@g"
  by simp
  finally show ?thesis by simp
qed*)

lemma (in ax_restri) lem18:
(*  shows "(f>g)@h = f@h > g@h"*)
  shows " (f \<rhd> g) \<down> h = f \<down> h \<rhd> g \<down> h"
(*  shows "dorestri (over f g) h = over (dorestri f h) (dorestri g h)"*)
  (* on this proof sledgehammer failed *)
(*  by (metis distr combrem weaksym drem fMgMg overlap2)*)
proof -
  from distr[where f=f] have "min (over f g) (min (over f g) h) = min (over f g) (over (min f h) (min g h))"
  by simp
  also from distr[where f=f] have "… = over (min f (over (min f h) (min g h))) (min g (over (min f h) (min g h)))"
  by simp
  also from combrem[where f=f] have "… = over (min (min f (min f h)) (min g h)) (min g (over (min f h) (min g h)))"
  by simp
  also from weaksym[where f=f] have "… = over (min (min f (min g h)) (min f h)) (min g (over (min f h) (min g h)))"
  by simp
  also from drem[where f=f and g=g] have "… = over (min (over (min f (min f h)) (min f g)) (min f h)) (min g (over (min f h) (min g h)))"
  by simp
  also from distr[where h="f\<ominus>h"] 
  have "… = over (over (min (min f (min f h)) (min f h)) (min (min f g) (min f h))) (min g (over (min f h) (min g h)))"
  by simp
  also from fMgMg[where f=f] have "… =  f\<ominus>(f\<ominus>h) \<rhd> f\<ominus>g\<ominus>(f\<ominus>h) \<rhd> g\<ominus>(f\<ominus>h \<rhd> g\<ominus>h)"
  by simp
  also from weaksym[where f=f] have "… = f\<ominus>(f\<ominus>h) \<rhd> f\<ominus>(f\<ominus>h)\<ominus>g \<rhd> g\<ominus>(f\<ominus>h \<rhd> g\<ominus>h)"
  by simp
  also from overlap2[where g=g] have "… = f\<ominus>(f\<ominus>h) \<rhd> g\<ominus>(f\<ominus>h \<rhd> g\<ominus>h)"
  by simp
  also from combrem[where f=g] have "… = f\<ominus>(f\<ominus>h) \<rhd> g\<ominus>(f\<ominus>h)\<ominus>(g\<ominus>h)"
  by simp
  also from drem[where f=g and g=f] have "… = f\<ominus>(f\<ominus>h) \<rhd> (g\<ominus>(g\<ominus>h) \<rhd> g\<ominus>f) \<ominus> (g\<ominus>h)"
  by simp
  also from distr[where h="g\<ominus>h"] have "… = f\<ominus>(f\<ominus>h) \<rhd> (g\<ominus>(g\<ominus>h)\<ominus>(g\<ominus>h) \<rhd> g\<ominus>f\<ominus>(g\<ominus>h))"
  by simp
  also from fMgMg[where f=g] have "… = f\<ominus>(f\<ominus>h) \<rhd> (g\<ominus>(g\<ominus>h) \<rhd> g\<ominus>f\<ominus>(g\<ominus>h))"
  by simp
  also from weaksym[where f=g] have "… = f\<ominus>(f\<ominus>h) \<rhd> (g\<ominus>(g\<ominus>h) \<rhd> g\<ominus>(g\<ominus>h)\<ominus>f)"
  by simp
  also from overlap2[where g=f] have "… = f\<ominus>(f\<ominus>h) \<rhd> g\<ominus>(g\<ominus>h)"
  by simp
  finally show ?thesis by (simp add: restri)
qed

lemma (in ax_restri) lem19:
(*  shows "f@(g>h) = f@g > f@h"*)
  shows "f \<down> (g \<rhd> h) = f \<down> g \<rhd> f \<down> h"
(*  shows "restri f (over g h) = over (restri f g) (restri f h)"*)
  by (metis combrem drem restri weaksym)
(*  by (metis dbmin drem eMf empty fUe restri weaksymRes)*)
(*  
  apply simp
proof -
  from combrem[where f=f] have "f@(g>h) = f-(f-g-h)"
  by simp
  also from drem[where f=f and g="f-g" and h=h] have "… = f-(f-h) > f-(f-g)"
  by simp
  also from weaksym3[where f=f] have "… = f@g > f@h"
  by simp
  finally show "f - (f - (g > h)) = f - (f - g) > f - (f - h)" by simp
qed*)



lemma (in ax_restri) (*lem20:*)
(*  shows "(f>g)@(f>h) = f > g@h"*)
  shows "(f \<rhd> g) \<down> (f \<rhd> h) = f \<rhd> g \<down> h"
  by (metis combrem distr eUf empty lem7 restri weaksym)
(*proof -
  from lem18[where f=f] have "(f>g)@(f>h) = f@(f>h) > g@(f>h)"
  by simp
  also from lem19[where f=f] have "… = f@f > f@h > g@(f>h)"
  by simp
  also from idemp2[where f=f] have "… = f > f@h > g@(f>h)"
  by simp
  also from overlap2[where f=f] have "… = f > g@(f>h)"
  by simp
  also from lem19[where f=g] have "… = f > (g@f > g@h)"
  by simp
  also from assoc[where f=f] have "… = f > g@f > g@h"
  by simp
  also from lem2[where f=f] have "… = f > g@h"
  by simp
  finally show ?thesis by simp
qed*)

lemma (in ax_restri) (*lem21:*)
  shows "f \<down> (g \<ominus> h) = f \<down> g \<ominus> h"
(*  shows "f@(g-h) = f@g - h"*)
  apply (simp add:restri)
  by (metis combrem dbmin distr eUf empty fUe lem18 lem3 lem7 restri weaksym)
(*  apply simp
proof -
  from drem[where f=f and g=g] have "f@(g-h) = f - (f-(f-h) > f-g)"
  by simp
  also from combrem[where f=f] have "… = f-(f-(f-h)) - (f-g)"
  by simp
  also from lem13[where f=f] have "… = f-h-(f-g)"
  by simp
  also from weaksym[where f=f] have "… = f-(f-g)-h"
  by simp
  finally show "f-(f-(g-h)) = f-(f-g)-h" by simp
qed*)

lemma (in ax_restri) lem22:
  shows "(f \<ominus> g) \<down> h = f \<down> h \<ominus> g"
(*  shows "(f-g)@h = f@h - g"*) 
  by(metis combrem dbmin distr eUf empty fUe lem18 lem3 lem7 restri weakswap weaksym)
(*
  apply simp
proof -
  from weaksym[where f=f] have "(f-g)@h = f - g - (f-h-g)"
  by simp
  also from combrem[where f=f] have "… = f - (g > f-h-g)"
  by simp
  also from weakswap[where f=g] have "… = f - (g > f-h)"
  by simp
  also from combrem[where f=f] have "… = f - g - (f-h)"
  by simp
  also from weaksym[where f=f] have "… = f - (f-h) - g"
  by simp
  finally show "(f-g)-(f-g-h) = f-(f-h)-g" by simp
qed*)



lemma (in ax_restri) (*lem23:*)
(*  shows "(f-h)@(g-h) = f@g-h"*)
  shows "(f \<ominus> h) \<down> (g \<ominus> h) = f \<down> g \<ominus> h"
  apply (simp add: restri)
  by (metis dbmin eMf empty fMe fUe lem22 restri)
(*proof -
  from combrem[where f=f] have "f \<ominus> h \<ominus> (f\<ominus> h \<ominus> (g \<ominus> h)) = f \<ominus> (h \<rhd>  f \<ominus> (h \<rhd> g \<ominus> h))"
  by simp
  also from weakswap[where f=h] have "… = f \<ominus> (h \<rhd>  f \<ominus> (h \<rhd> g))"
  by simp
  also from combrem[where f=f] have "… = f \<ominus> (h \<rhd>  f \<ominus> h \<ominus> g)"
  by simp
  also from weaksym[where f=f] have "… = f \<ominus> (h \<rhd>  f \<ominus> g \<ominus> h)"
  by simp
  also from weakswap[where f=h] have "… = f \<ominus> (h \<rhd>  f \<ominus> g)"
  by simp
  also from combrem[where f=f] have "… = f \<ominus> h \<ominus> (f \<ominus> g)"
  by simp
  also from weaksym[where f=f] have "… = f\<ominus> (f \<ominus> g) \<ominus> h"
  by simp
  finally show "f \<ominus> h \<ominus> (f \<ominus> h \<ominus> (g \<ominus> h)) = f \<ominus> (f \<ominus> g) \<ominus> h" by simp
qed *)

(*lemma rev_combrem:
  shows "f-(g>h) = f-g-h"
  apply(simp add: combrem)
done

lemma rev_distr:
  shows "f-h > g-h = (f>g)-h"
  apply(simp add: distr)
done

lemma rev_drem:
  shows "f@h > f-g = f-(g-h)"
proof -
  from drem[where f=f and g=g] show ?thesis by simp
qed

lemma rev_swap:
  shows "g > f = f-g > g"
  apply(simp add: swap)
done

lemma rev_empty:
  shows "e = f-f"
  apply(simp add: empty)
done

lemma rev_idemp:
  shows "f = f>f"
  apply(simp add: idemp)
done

declare distr[simp]
declare rev_distr[simp]
declare drem[simp]
declare rev_drem[simp]
declare swap[simp]
declare rev_swap[simp]
declare empty[simp]
declare rev_empty[simp]
declare idemp[simp]
declare rev_idemp[simp]

lemma boem:
  shows "f-g-h = f-(g>h)"
  apply simp
*)

lemma (in ax_restri) lem24:
  shows "f \<ominus> g \<rhd> h \<down> g = h \<down> g \<rhd> f \<ominus> g"
(*  shows "f-g > h@g = h@g > f-g"*)
  apply (simp add: restri)
  by (metis swap restri combrem distr dbmin empty eMf fUe restri)
(*proof -  
    from swap[where g="f\<ominus>g"] have "f\<ominus>g \<rhd> h\<down>g = h\<down>g\<ominus>(f\<ominus>g) \<rhd> f\<ominus>g"
  by simp
  also from restri[where f=h] have "… = h\<ominus>(h\<ominus>g)\<ominus>(f\<ominus>g) \<rhd> f\<ominus>g"
  by simp
  also from combrem[where f=h] have "… = h\<ominus>(h\<ominus>g\<rhd>f\<ominus>g) \<rhd> f\<ominus>g"
  by simp
  also from distr[where h=g] have "… = h\<ominus>((h\<rhd>f)\<ominus>g) \<rhd> f\<ominus>g"
  by simp
  also from drem[where f=h and g="h\<rhd>f" and h=g] have "… = h\<ominus>(h\<ominus>g) \<rhd> h\<ominus>(h\<rhd>f) \<rhd> f\<ominus>g"
  by simp
  also from combrem[where f=h] have "… = h\<ominus>(h\<ominus>g) \<rhd> h\<ominus>h\<ominus>f \<rhd> f\<ominus>g"
  by simp
  also from empty[where f=h] have "… = h\<ominus>(h\<ominus>g) \<rhd> e\<ominus>f \<rhd> f\<ominus>g"
  by simp
  also from eMf[where f=f] have "… = h\<ominus>(h\<ominus>g) \<rhd> e \<rhd> f\<ominus>g"
  by simp
  also from fUe[where f="h\<ominus>(h\<ominus>g)"] have "… = h\<ominus>(h\<ominus>g) \<rhd> f\<ominus>g"
  by simp
  also from restri[where f=h] have "… = h\<down>g \<rhd> f\<ominus>g"
  by simp
  finally show ?thesis by simp
qed*)

lemma (in ax_restri) (*lem25:*)
  shows "x \<down> y \<ominus> z \<rhd> v \<ominus> (y \<rhd> w) = v \<ominus> (y \<rhd> w) \<rhd> (x \<down> y) \<ominus> z"
(*  shows "x@y-z > v-(y>w) = v-(y>w) > x@y-z"*)
  by (metis lem22 combrem weaksym lem24 combrem)
(*  by (metis dbmin eMf eUf empty fUe lem22 restri)*)
(*  
proof -
  from lem22[where f=x] have "x@y-z > v-(y>w) = (x-z)@y > v-(y>w)"
  by simp
  also from combrem[where f=v] have "… = (x-z)@y > v-y-w"
  by simp
  also from weaksym[where f=v] have "… = (x-z)@y > v-w-y"
  by simp
  also from lem24[where h="x-z"] have "… = v-w-y > (x-z)@y"
  by simp
  also from weaksym[where f=v] have "… = v-y-w > (x-z)@y"
  by simp
  also from combrem[where f=v] have "… = v-(y>w) > (x-z)@y"
  by simp
  also from lem22[where f=x] have "… = v-(y>w) > x@y-z"
  by simp
  finally show ?thesis by simp
qed*)

lemma (in ax_restri) (*lem26:*)
  shows   "x \<down> y \<ominus> z \<rhd> v \<ominus> (x \<rhd> w) = v \<ominus> (x \<rhd> w) \<rhd> x \<down> y \<ominus> z"
(*  shows "x @ y - z > v - (x > w) = v - (x > w) > x @ y - z"*)
(*  by (metis combrem dbmin distr eUf empty fUe lem18 lem3 lem7 restri swap weaksym)*)
proof -
  from idemp2[where f=x] 
  have "x\<down>y\<ominus>z \<rhd> v\<ominus>(x\<rhd>w) = x\<down>x\<down>y\<ominus>z \<rhd> v\<ominus>(x\<rhd>w)"
  by simp
  also from weaksymRes[where f=x] have "… = x\<down>y\<down>x\<ominus>z \<rhd> v\<ominus>(x\<rhd>w)"
  by simp
  also from lem22[where g=z] have "… = (x\<down>y\<ominus>z)\<down>x \<rhd> v\<ominus>(x\<rhd>w)"
  by simp
  also from combrem[where f=v] have "… = (x\<down>y\<ominus>z)\<down>x \<rhd> v\<ominus>x\<ominus>w"
  by simp
  also from weaksym[where f=v] have "… = (x\<down>y\<ominus>z)\<down>x \<rhd> v\<ominus>w\<ominus>x"
  by simp
  also from lem24[where g=x] have "… = v\<ominus>w\<ominus>x \<rhd> (x\<down>y\<ominus>z)\<down>x"
  by simp
  also from weaksym[where f=v] have "… = v\<ominus>x\<ominus>w \<rhd> (x\<down>y\<ominus>z)\<down>x"
  by simp
  also from combrem[where f=v] have "… = v\<ominus>(x\<rhd>w) \<rhd> (x\<down>y\<ominus>z)\<down>x"
  by simp
  also from lem22[where g=z] have "… = v\<ominus>(x\<rhd>w) \<rhd> x\<down>y\<down>x\<ominus>z"
  by simp
  also from weaksymRes[where f=x] have "… = v\<ominus>(x\<rhd>w) \<rhd> x\<down>x\<down>y\<ominus>z"
  by simp
  also from idemp2[where f=x] have "… = v\<ominus>(x\<rhd>w) \<rhd>  x \<down> y\<ominus>z"
  by simp
  finally show ?thesis by (simp add: restri) 
qed


end

lemma eUf:

  e \<rhd> f = f

lemma fUe:

  f \<rhd> e = f

lemma fMe:

  f \<ominus> e = f

lemma overlap1:

  f \<ominus> g \<rhd> f = f

lemma combrem:

  f \<ominus> g \<ominus> h = f \<ominus> (g \<rhd> h)

lemma partition1:

  f \<ominus> (f \<ominus> g) \<rhd> f \<ominus> g = f

lemma eMf:

  e \<ominus> f = e

lemma weakswap:

  f \<rhd> g \<ominus> f = f \<rhd> g

lemma fMgMg:

  f \<ominus> g \<ominus> g = f \<ominus> g

lemma partition2:

  f \<ominus> g \<rhd> f \<ominus> (f \<ominus> g) = f

lemma fMgMf:

  f \<ominus> g \<ominus> f = e

lemma overlap2:

  f \<rhd> f \<ominus> g = f

lemma lem1:

  f \<ominus> (f \<rhd> g) = e

lemma fUgUf:

  f \<rhd> g \<rhd> f = f \<rhd> g

lemma weaksym:

  f \<ominus> g \<ominus> h = f \<ominus> h \<ominus> g

lemma lem2:

  f \<rhd> g \<ominus> (g \<ominus> f) = f

lemma lem3:

  f \<ominus> (g \<ominus> f) = f

lemma lem4:

  (f \<rhd> g \<rhd> h) \<ominus> f = g \<ominus> f \<rhd> h \<ominus> f

lemma assoc:

  f \<rhd> g \<rhd> h = f \<rhd> (g \<rhd> h)

lemma weaksym3:

  f \<ominus> g \<rhd> f \<ominus> h = f \<ominus> h \<rhd> f \<ominus> g

lemma drem:

  f \<ominus> (g \<ominus> h) = f \<ominus> (f \<ominus> h) \<rhd> f \<ominus> g

lemma lem6:

  (f \<rhd> g) \<ominus> (g \<ominus> f) = f

lemma lem7:

  (f \<rhd> g) \<ominus> (h \<ominus> f) = f \<rhd> g \<ominus> h

lemma

  f \<ominus> g \<rhd> g \<ominus> h = g \<ominus> h \<rhd> f \<ominus> g

lemma idemp2:

  f \<down> f = f

lemma

  f \<down> g \<rhd> f = f

lemma lem9:

  f \<down> g \<ominus> g = e

lemma

  f \<down> g \<down> (h \<ominus> g) = e

lemma lem11:

  f \<ominus> h \<rhd> f \<ominus> f \<down> h = f \<ominus> h

lemma lem12:

  f \<ominus> f \<down> h \<rhd> f \<ominus> h = f \<ominus> f \<down> h

lemma lem13:

  f \<ominus> f \<down> h = f \<ominus> h

lemma

  f \<down> (g \<down> h) = f \<down> g \<down> h

lemma weaksymRes:

  f \<down> g \<down> h = f \<down> h \<down> g

lemma lem16:

  f \<ominus> g \<down> h = f \<ominus> g \<rhd> f \<ominus> h

lemma

  f \<ominus> g \<down> h = f \<ominus> h \<down> g

lemma lem18:

  (f \<rhd> g) \<down> h = f \<down> h \<rhd> g \<down> h

lemma lem19:

  f \<down> (g \<rhd> h) = f \<down> g \<rhd> f \<down> h

lemma

  (f \<rhd> g) \<down> (f \<rhd> h) = f \<rhd> g \<down> h

lemma

  f \<down> (g \<ominus> h) = f \<down> g \<ominus> h

lemma lem22:

  (f \<ominus> g) \<down> h = f \<down> h \<ominus> g

lemma

  (f \<ominus> h) \<down> (g \<ominus> h) = f \<down> g \<ominus> h

lemma lem24:

  f \<ominus> g \<rhd> h \<down> g = h \<down> g \<rhd> f \<ominus> g

lemma

  x \<down> y \<ominus> z \<rhd> v \<ominus> (y \<rhd> w) =
  v \<ominus> (y \<rhd> w) \<rhd> x \<down> y \<ominus> z

lemma

  x \<down> y \<ominus> z \<rhd> v \<ominus> (x \<rhd> w) =
  v \<ominus> (x \<rhd> w) \<rhd> x \<down> y \<ominus> z