doc-src/Exercises/0304/a4/a4.thy
author wenzelm
Wed, 09 Jun 2004 18:52:42 +0200
changeset 14898 a25550451b51
parent 14499 f08ea8e964d8
permissions -rw-r--r--
Url.File;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
14499
streckem
parents:
diff changeset
     1
streckem
parents:
diff changeset
     2
(*<*) theory a4 = Main: (*>*)
streckem
parents:
diff changeset
     3
streckem
parents:
diff changeset
     4
subsection {* Natural Deduction -- Predicate Logic; Sets as Lists *}
streckem
parents:
diff changeset
     5
streckem
parents:
diff changeset
     6
streckem
parents:
diff changeset
     7
subsubsection {* Predicate Logic Formulae *}
streckem
parents:
diff changeset
     8
streckem
parents:
diff changeset
     9
text {*
streckem
parents:
diff changeset
    10
streckem
parents:
diff changeset
    11
We are again talking about proofs in the calculus of Natural
streckem
parents:
diff changeset
    12
Deduction. In addition to the rules of section~\ref{psv0304a3}, you may now also use
streckem
parents:
diff changeset
    13
streckem
parents:
diff changeset
    14
streckem
parents:
diff changeset
    15
  @{text "exI:"}~@{thm exI[no_vars]}\\
streckem
parents:
diff changeset
    16
  @{text "exE:"}~@{thm exE[no_vars]}\\
streckem
parents:
diff changeset
    17
  @{text "allI:"}~@{thm allI[no_vars]}\\
streckem
parents:
diff changeset
    18
  @{text "allE:"}~@{thm allE[no_vars]}\\
streckem
parents:
diff changeset
    19
streckem
parents:
diff changeset
    20
Give a proof of the following propositions or an argument why the formula is not valid:
streckem
parents:
diff changeset
    21
*}
streckem
parents:
diff changeset
    22
streckem
parents:
diff changeset
    23
streckem
parents:
diff changeset
    24
lemma "(\<exists>x. \<forall>y. P x y) \<longrightarrow> (\<forall>y. \<exists>x. P x y)"
streckem
parents:
diff changeset
    25
(*<*) oops (*>*)
streckem
parents:
diff changeset
    26
streckem
parents:
diff changeset
    27
lemma "(\<forall>x. P x \<longrightarrow> Q) = ((\<exists>x. P x) \<longrightarrow> Q)"
streckem
parents:
diff changeset
    28
(*<*) oops (*>*)
streckem
parents:
diff changeset
    29
streckem
parents:
diff changeset
    30
lemma "((\<forall> x. P x)  \<and> (\<forall> x. Q x)) = (\<forall> x. (P x \<and> Q x))"
streckem
parents:
diff changeset
    31
(*<*) oops (*>*)
streckem
parents:
diff changeset
    32
streckem
parents:
diff changeset
    33
lemma "((\<forall> x. P x) \<or> (\<forall> x. Q x)) = (\<forall> x. (P x \<or> Q x))"
streckem
parents:
diff changeset
    34
(*<*) oops (*>*)
streckem
parents:
diff changeset
    35
streckem
parents:
diff changeset
    36
lemma "((\<exists> x. P x) \<or> (\<exists> x. Q x)) = (\<exists> x. (P x \<or> Q x))"
streckem
parents:
diff changeset
    37
(*<*) oops (*>*)
streckem
parents:
diff changeset
    38
streckem
parents:
diff changeset
    39
lemma "\<exists>x. (P x \<longrightarrow> (\<forall>x. P x))"
streckem
parents:
diff changeset
    40
(*<*) oops (*>*)
streckem
parents:
diff changeset
    41
streckem
parents:
diff changeset
    42
streckem
parents:
diff changeset
    43
subsubsection {* Sets as Lists *}
streckem
parents:
diff changeset
    44
streckem
parents:
diff changeset
    45
text {* Finite sets can obviously be implemented by lists. In the
streckem
parents:
diff changeset
    46
following, you will be asked to implement the set operations union,
streckem
parents:
diff changeset
    47
intersection and difference and to show that these implementations are
streckem
parents:
diff changeset
    48
correct. Thus, for a function  *}
streckem
parents:
diff changeset
    49
streckem
parents:
diff changeset
    50
(*<*) consts (*>*)
streckem
parents:
diff changeset
    51
  list_union :: "['a list, 'a list] \<Rightarrow> 'a list"
streckem
parents:
diff changeset
    52
streckem
parents:
diff changeset
    53
text {* to be defined by you it has to be shown that *}
streckem
parents:
diff changeset
    54
streckem
parents:
diff changeset
    55
lemma "set (list_union xs ys) = set xs \<union> set ys"
streckem
parents:
diff changeset
    56
(*<*) oops (*>*)
streckem
parents:
diff changeset
    57
streckem
parents:
diff changeset
    58
streckem
parents:
diff changeset
    59
text {* In addition, the functions should be space efficient in the
streckem
parents:
diff changeset
    60
sense that one obtains lists without duplicates (@{text "distinct"})
streckem
parents:
diff changeset
    61
whenever the parameters of the functions are duplicate-free. Thus, for
streckem
parents:
diff changeset
    62
example, *}
streckem
parents:
diff changeset
    63
streckem
parents:
diff changeset
    64
streckem
parents:
diff changeset
    65
lemma [rule_format]: 
streckem
parents:
diff changeset
    66
  "distinct xs \<longrightarrow> distinct ys \<longrightarrow> (distinct (list_union xs ys))"
streckem
parents:
diff changeset
    67
(*<*) oops (*>*)
streckem
parents:
diff changeset
    68
streckem
parents:
diff changeset
    69
text {* \emph{Hint:} @{text "distinct"} is defined in @{text
streckem
parents:
diff changeset
    70
List.thy}. Also the function @{text mem} and the lemma @{text
streckem
parents:
diff changeset
    71
set_mem_eq} may be useful. *}
streckem
parents:
diff changeset
    72
streckem
parents:
diff changeset
    73
streckem
parents:
diff changeset
    74
subsubsection {* Quantification over Sets *}
streckem
parents:
diff changeset
    75
streckem
parents:
diff changeset
    76
text {* Define a set @{text S} such that the following proposition holds: *}
streckem
parents:
diff changeset
    77
streckem
parents:
diff changeset
    78
lemma "((\<forall> x \<in> A. P x) \<and> (\<forall> x \<in> B. P x)) \<longrightarrow> (\<forall> x \<in> S. P x)"
streckem
parents:
diff changeset
    79
(*<*) oops (*>*)
streckem
parents:
diff changeset
    80
streckem
parents:
diff changeset
    81
streckem
parents:
diff changeset
    82
text {* Define a predicate @{text P} such that *}
streckem
parents:
diff changeset
    83
streckem
parents:
diff changeset
    84
lemma "\<forall> x \<in> A. P (f x) \<Longrightarrow>  \<forall> y \<in> f ` A. Q y"
streckem
parents:
diff changeset
    85
(*<*) oops (*>*)
streckem
parents:
diff changeset
    86
streckem
parents:
diff changeset
    87
streckem
parents:
diff changeset
    88
streckem
parents:
diff changeset
    89
(*<*) end (*>*)
streckem
parents:
diff changeset
    90