src/HOL/Library/Indicator_Function.thy
author hoelzl
Tue Nov 12 19:28:50 2013 +0100 (2013-11-12)
changeset 54408 67dec4ccaabd
parent 45425 7fee7d7abf2f
child 56993 e5366291d6aa
permissions -rw-r--r--
equation when indicator function equals 0 or 1
hoelzl@37665
     1
(*  Title:      HOL/Library/Indicator_Function.thy
hoelzl@37665
     2
    Author:     Johannes Hoelzl (TU Muenchen)
hoelzl@37665
     3
*)
hoelzl@37665
     4
hoelzl@37665
     5
header {* Indicator Function *}
hoelzl@37665
     6
hoelzl@37665
     7
theory Indicator_Function
hoelzl@37665
     8
imports Main
hoelzl@37665
     9
begin
hoelzl@37665
    10
hoelzl@37665
    11
definition "indicator S x = (if x \<in> S then 1 else 0)"
hoelzl@37665
    12
hoelzl@37665
    13
lemma indicator_simps[simp]:
hoelzl@37665
    14
  "x \<in> S \<Longrightarrow> indicator S x = 1"
hoelzl@37665
    15
  "x \<notin> S \<Longrightarrow> indicator S x = 0"
hoelzl@37665
    16
  unfolding indicator_def by auto
hoelzl@37665
    17
wenzelm@45425
    18
lemma indicator_pos_le[intro, simp]: "(0::'a::linordered_semidom) \<le> indicator S x"
hoelzl@37665
    19
  and indicator_le_1[intro, simp]: "indicator S x \<le> (1::'a::linordered_semidom)"
wenzelm@45425
    20
  unfolding indicator_def by auto
wenzelm@45425
    21
wenzelm@45425
    22
lemma indicator_abs_le_1: "\<bar>indicator S x\<bar> \<le> (1::'a::linordered_idom)"
hoelzl@37665
    23
  unfolding indicator_def by auto
hoelzl@37665
    24
hoelzl@54408
    25
lemma indicator_eq_0_iff: "indicator A x = (0::_::zero_neq_one) \<longleftrightarrow> x \<notin> A"
hoelzl@54408
    26
  by (auto simp: indicator_def)
hoelzl@54408
    27
hoelzl@54408
    28
lemma indicator_eq_1_iff: "indicator A x = (1::_::zero_neq_one) \<longleftrightarrow> x \<in> A"
hoelzl@54408
    29
  by (auto simp: indicator_def)
hoelzl@54408
    30
hoelzl@37665
    31
lemma split_indicator:
hoelzl@37665
    32
  "P (indicator S x) \<longleftrightarrow> ((x \<in> S \<longrightarrow> P 1) \<and> (x \<notin> S \<longrightarrow> P 0))"
hoelzl@37665
    33
  unfolding indicator_def by auto
hoelzl@37665
    34
wenzelm@45425
    35
lemma indicator_inter_arith: "indicator (A \<inter> B) x = indicator A x * (indicator B x::'a::semiring_1)"
wenzelm@45425
    36
  unfolding indicator_def by (auto simp: min_def max_def)
wenzelm@45425
    37
wenzelm@45425
    38
lemma indicator_union_arith: "indicator (A \<union> B) x =  indicator A x + indicator B x - indicator A x * (indicator B x::'a::ring_1)"
wenzelm@45425
    39
  unfolding indicator_def by (auto simp: min_def max_def)
wenzelm@45425
    40
wenzelm@45425
    41
lemma indicator_inter_min: "indicator (A \<inter> B) x = min (indicator A x) (indicator B x::'a::linordered_semidom)"
hoelzl@37665
    42
  and indicator_union_max: "indicator (A \<union> B) x = max (indicator A x) (indicator B x::'a::linordered_semidom)"
wenzelm@45425
    43
  unfolding indicator_def by (auto simp: min_def max_def)
wenzelm@45425
    44
wenzelm@45425
    45
lemma indicator_compl: "indicator (- A) x = 1 - (indicator A x::'a::ring_1)"
hoelzl@37665
    46
  and indicator_diff: "indicator (A - B) x = indicator A x * (1 - indicator B x::'a::ring_1)"
hoelzl@37665
    47
  unfolding indicator_def by (auto simp: min_def max_def)
hoelzl@37665
    48
wenzelm@45425
    49
lemma indicator_times: "indicator (A \<times> B) x = indicator A (fst x) * (indicator B (snd x)::'a::semiring_1)"
hoelzl@37665
    50
  unfolding indicator_def by (cases x) auto
hoelzl@37665
    51
wenzelm@45425
    52
lemma indicator_sum: "indicator (A <+> B) x = (case x of Inl x \<Rightarrow> indicator A x | Inr x \<Rightarrow> indicator B x)"
hoelzl@37665
    53
  unfolding indicator_def by (cases x) auto
hoelzl@37665
    54
hoelzl@37665
    55
lemma
hoelzl@37665
    56
  fixes f :: "'a \<Rightarrow> 'b::semiring_1" assumes "finite A"
hoelzl@37665
    57
  shows setsum_mult_indicator[simp]: "(\<Sum>x \<in> A. f x * indicator B x) = (\<Sum>x \<in> A \<inter> B. f x)"
hoelzl@37665
    58
  and setsum_indicator_mult[simp]: "(\<Sum>x \<in> A. indicator B x * f x) = (\<Sum>x \<in> A \<inter> B. f x)"
hoelzl@37665
    59
  unfolding indicator_def
hoelzl@37665
    60
  using assms by (auto intro!: setsum_mono_zero_cong_right split: split_if_asm)
hoelzl@37665
    61
hoelzl@37665
    62
lemma setsum_indicator_eq_card:
hoelzl@37665
    63
  assumes "finite A"
hoelzl@37665
    64
  shows "(SUM x : A. indicator B x) = card (A Int B)"
hoelzl@37665
    65
  using setsum_mult_indicator[OF assms, of "%x. 1::nat"]
hoelzl@37665
    66
  unfolding card_eq_setsum by simp
hoelzl@37665
    67
hoelzl@37665
    68
end