# HG changeset patch # User nipkow # Date 1495918328 -7200 # Node ID 32b3feb6f9650044a81da9e7153ec86f6871af2d # Parent 34c4cd9abc1a5df906833673074f967968e379f3 more arg_min diff -r 34c4cd9abc1a -r 32b3feb6f965 src/HOL/Lattices_Big.thy --- a/src/HOL/Lattices_Big.thy Sat May 27 15:48:22 2017 +0200 +++ b/src/HOL/Lattices_Big.thy Sat May 27 22:52:08 2017 +0200 @@ -819,11 +819,37 @@ abbreviation arg_min_on :: "('a \ 'b::ord) \ 'a set \ 'a" where "arg_min_on f S \ arg_min f (\x. x \ S)" +syntax + "_arg_min" :: "('a \ 'b) \ pttrn \ bool \ 'a" + ("(3ARG'_MIN _ _./ _)" [0, 0, 10] 10) +translations + "ARG_MIN f x. P" \ "CONST arg_min f (\x. P)" + lemma is_arg_min_linorder: fixes f :: "'a \ 'b :: linorder" shows "is_arg_min f P x = (P x \ (\y. P y \ f x \ f y))" by(auto simp add: is_arg_min_def) -lemma arg_min_nat_lemma: "P k \ P(arg_min m P) \ (\y. P y \ m (arg_min m P) \ m y)" +lemma arg_minI: + "\ P x; + \y. P y \ \ f y < f x; + \x. \ P x; \y. P y \ \ f y < f x \ \ Q x \ + \ Q (arg_min f P)" +apply (simp add: arg_min_def is_arg_min_def) +apply (rule someI2_ex) + apply blast +apply blast +done + +lemma arg_min_equality: + "P k \ (\x. P x \ f k \ f x) \ f (arg_min f P) = f k" + for f :: "_ \ 'a::order" +apply (rule arg_minI) + apply assumption + apply (simp add: less_le_not_le) +by (metis le_less) + +lemma arg_min_nat_lemma: + "P k \ P(arg_min m P) \ (\y. P y \ m (arg_min m P) \ m y)" for m :: "'a \ nat" apply (simp add: arg_min_def is_arg_min_linorder) apply (rule someI_ex) @@ -832,6 +858,10 @@ lemmas arg_min_natI = arg_min_nat_lemma [THEN conjunct1] +lemma is_arg_min_arg_min_nat: fixes m :: "'a \ nat" +shows "P x \ is_arg_min m P (arg_min m P)" +by (metis arg_min_nat_lemma is_arg_min_linorder) + lemma arg_min_nat_le: "P x \ m (arg_min m P) \ m x" for m :: "'a \ nat" by (rule arg_min_nat_lemma [THEN conjunct2, THEN spec, THEN mp])