Theory Enat_Cost

theory Enat_Cost
imports "HOL-Library.Extended_Nat" Abstract_Cost
begin

type_synonym ecost = "(string,enat) acost"

declare [[coercion_enabled = false]]


definition "lift_acost c  acostC (enat o the_acost c)"

lemma lift_acost_zero: "lift_acost 0 = 0" by (auto simp add: lift_acost_def zero_acost_def zero_enat_def )


lemma lift_acost_cost: "lift_acost (cost name x) = (cost name (enat x))"
  by (auto simp: one_enat_def zero_enat_def lift_acost_def cost_def zero_acost_def)

lemma ecost_le_zero: "(Ca::ecost)  0  Ca=0"
  apply(cases Ca) by(auto simp: zero_acost_def less_eq_acost_def)

lemma get_delta: "Ca  (T::(_,enat)acost)  delta. T = delta + Ca"
  apply(cases Ca; cases T)
  apply(rule exI[where x="T - Ca"])
  apply (auto simp: minus_acost_alt less_eq_acost_def) 
  apply(rule ext)  
  subgoal premises p for f g x
    using p(1)[rule_format, of x]  
    by (metis add.commute add_diff_cancel_enat less_eqE plus_eq_infty_iff_enat) 
  done


end