Theory Fresh

theory Fresh
imports Main
begin

class fresh =
  fixes fresh_in :: "'a set  'a"
  assumes "finite S  fresh_in S  S"

instantiation nat :: fresh
begin
  definition fresh_in_nat :: "nat set  nat" where
    [code]: "fresh_in_nat S  (if Set.is_empty S then 0 else Max S + 1)"

  instance proof
    fix S :: "nat set"
    assume "finite S"
    consider "Set.is_empty S" | "¬Set.is_empty S" by auto
    thus "fresh_in S  S" unfolding fresh_in_nat_def
    proof(cases)
      case 1
        hence "S = {}" using Set.is_empty_def by metis
        hence "0  S" by auto
        thus "(if Set.is_empty S then 0 else Max S + 1)  S" using 1 by auto
      next
      case 2
        have "Max S + 1  S"
          using finite S Max.coboundedI add_le_same_cancel1 not_one_le_zero
          by blast
        thus "(if Set.is_empty S then 0 else Max S + 1)  S" using 2 by auto
      next
    qed
  qed
end

end