Theory Lex_Order_PP

(* Author: Alexander Maletzky *)

section ‹Properties of the Lexicographic Order on Power-Products›

theory Lex_Order_PP
  imports Polynomials.Power_Products
begin

text ‹We prove some useful properties of the purely lexicographic order relation on
  power-products.›

lemma lex_pm_keys_leE:
  assumes "lex_pm s t" and "x  keys (s::'x::linorder 0 'a::add_linorder_min)"
  obtains y where "y  keys t" and "y  x"
  using assms(1) unfolding lex_pm_alt
proof (elim disjE exE conjE)
  assume "s = t"
  show ?thesis
  proof
    from assms(2) show "x  keys t" by (simp only: s = t)
  qed (fact order.refl)
next
  fix y
  assume 1: "lookup s y < lookup t y" and 2: "y'<y. lookup s y' = lookup t y'"
  show ?thesis
  proof (cases "y  x")
    case True
    from zero_min 1 have "0 < lookup t y" by (rule le_less_trans)
    hence "y  keys t" by (simp add: dual_order.strict_implies_not_eq in_keys_iff)
    thus ?thesis using True ..
  next
    case False
    hence "x < y" by simp
    with 2 have "lookup s x = lookup t x" by simp
    with assms(2) have "x  keys t" by (simp only: in_keys_iff not_False_eq_True)
    thus ?thesis using order.refl ..
  qed
qed

lemma lex_pm_except_max:
  assumes "lex_pm s t" and "keys s  keys t  {..x}"
  shows "lex_pm (except s {x}) (except t {x})"
proof -
  from assms(1) have "s = t  (x. lookup s x < lookup t x  (y<x. lookup s y = lookup t y))"
    by (simp only: lex_pm_alt)
  thus ?thesis
  proof (elim disjE exE conjE)
    assume "s = t"
    thus ?thesis by (simp only: lex_pm_refl)
  next
    fix y
    assume "z<y. lookup s z = lookup t z"
    hence eq: "lookup s z = lookup t z" if "z < y" for z using that by simp
    assume *: "lookup s y < lookup t y"
    hence "y  keys s  keys t" by (auto simp flip: lookup_not_eq_zero_eq_in_keys)
    with assms(2) have "y  {..x}" ..
    hence "y = x  y < x" by auto
    thus ?thesis
    proof
      assume y: "y = x"
      have "except s {x} = except t {x}"
      proof (rule poly_mapping_eqI)
        fix z
        show "lookup (except s {x}) z = lookup (except t {x}) z"
        proof (rule linorder_cases)
          assume "z < y"
          thus ?thesis by (simp add: lookup_except eq)
        next
          assume "y < z"
          hence "z  {..x}" by (simp add: y)
          with assms(2) have "z  keys s" and "z  keys t" by blast+
          with y < z show ?thesis by (simp add: y lookup_except in_keys_iff)
        next
          assume "z = y"
          thus ?thesis by (simp add: y lookup_except)
        qed
      qed
      thus ?thesis by (simp only: lex_pm_refl)
    next
      assume "y < x"
      show ?thesis unfolding lex_pm_alt
      proof (intro disjI2 exI conjI allI impI)
        from y < x * show "lookup (except s {x}) y < lookup (except t {x}) y"
          by (simp add: lookup_except)
      next
        fix z
        assume "z < y"
        hence "z < x" using y < x by (rule less_trans)
        with z < y show "lookup (except s {x}) z = lookup (except t {x}) z"
          by (simp add: lookup_except eq)
      qed
    qed
  qed
qed

lemma lex_pm_strict_plus_left:
  assumes "lex_pm_strict s t" and "x y. x  keys t  y  keys u  x < y"
  shows "lex_pm_strict (u + s) (t::_ 0 'a::add_linorder_min)"
proof -
  from assms(1) obtain x where 1: "lookup s x < lookup t x" and 2: "y. y < x  lookup s y = lookup t y"
    by (auto simp: lex_pm_strict_def less_poly_mapping_def less_fun_def)
  from 1 have "x  keys t" by (auto simp flip: lookup_not_eq_zero_eq_in_keys)
  have lookup_u: "lookup u z = 0" if "z  x" for z
  proof (rule ccontr)
    assume "lookup u z  0"
    hence "z  keys u" by (simp add: in_keys_iff)
    with x  keys t have "x < z" by (rule assms(2))
    with that show False by simp
  qed
  from 1 have "lookup (u + s) x < lookup t x" by (simp add: lookup_add lookup_u)
  moreover have "lookup (u + s) y = lookup t y" if "y < x" for y using that
    by (simp add: lookup_add 2 lookup_u)
  ultimately show ?thesis by (auto simp: lex_pm_strict_def less_poly_mapping_def less_fun_def)
qed

end (* theory *)