doc-src/Exercises/0304/a1/a1.thy
author obua
Sun, 09 May 2004 23:04:36 +0200
changeset 14722 8e739a6eaf11
parent 14499 f08ea8e964d8
permissions -rw-r--r--
replaced apply-style proof for instance Multiset :: plus_ac0 by recommended Isar proof style
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
14499
streckem
parents:
diff changeset
     1
streckem
parents:
diff changeset
     2
(*<*) theory a1 = Main: (*>*)
streckem
parents:
diff changeset
     3
streckem
parents:
diff changeset
     4
subsection {* List functions *}
streckem
parents:
diff changeset
     5
streckem
parents:
diff changeset
     6
text{* Define a function @{text sum}, which computes the sum of
streckem
parents:
diff changeset
     7
elements of a list of natural numbers. *}
streckem
parents:
diff changeset
     8
streckem
parents:
diff changeset
     9
(*<*) consts (*>*)
streckem
parents:
diff changeset
    10
  sum :: "nat list \<Rightarrow> nat"
streckem
parents:
diff changeset
    11
streckem
parents:
diff changeset
    12
text{* Then, define a function @{text flatten} which flattens a list
streckem
parents:
diff changeset
    13
of lists by appending the member lists. *}
streckem
parents:
diff changeset
    14
streckem
parents:
diff changeset
    15
(*<*) consts (*>*)
streckem
parents:
diff changeset
    16
  flatten :: "'a list list \<Rightarrow> 'a list"
streckem
parents:
diff changeset
    17
streckem
parents:
diff changeset
    18
text{* Test your function by applying them to the following example lists: *}
streckem
parents:
diff changeset
    19
streckem
parents:
diff changeset
    20
streckem
parents:
diff changeset
    21
lemma "sum [2::nat, 4, 8] = x"
streckem
parents:
diff changeset
    22
(*<*) oops (*>*)
streckem
parents:
diff changeset
    23
streckem
parents:
diff changeset
    24
lemma "flatten [[2::nat, 3], [4, 5], [7, 9]] = x"
streckem
parents:
diff changeset
    25
(*<*) oops (*>*)
streckem
parents:
diff changeset
    26
streckem
parents:
diff changeset
    27
streckem
parents:
diff changeset
    28
text{* Prove the following statements, or give a counterexample: *}
streckem
parents:
diff changeset
    29
streckem
parents:
diff changeset
    30
streckem
parents:
diff changeset
    31
lemma "length (flatten xs) = sum (map length xs)"
streckem
parents:
diff changeset
    32
(*<*) oops (*>*)
streckem
parents:
diff changeset
    33
streckem
parents:
diff changeset
    34
lemma sum_append: "sum (xs @ ys) = sum xs + sum ys"
streckem
parents:
diff changeset
    35
(*<*) oops (*>*)
streckem
parents:
diff changeset
    36
streckem
parents:
diff changeset
    37
lemma flatten_append: "flatten (xs @ ys) = flatten xs @ flatten ys"
streckem
parents:
diff changeset
    38
(*<*) oops (*>*)
streckem
parents:
diff changeset
    39
streckem
parents:
diff changeset
    40
lemma "flatten (map rev (rev xs)) = rev (flatten xs)"
streckem
parents:
diff changeset
    41
(*<*) oops (*>*)
streckem
parents:
diff changeset
    42
streckem
parents:
diff changeset
    43
lemma "flatten (rev (map rev xs)) = rev (flatten xs)"
streckem
parents:
diff changeset
    44
(*<*) oops (*>*)
streckem
parents:
diff changeset
    45
streckem
parents:
diff changeset
    46
lemma "list_all (list_all P) xs = list_all P (flatten xs)"
streckem
parents:
diff changeset
    47
(*<*) oops (*>*)
streckem
parents:
diff changeset
    48
streckem
parents:
diff changeset
    49
lemma "flatten (rev xs) = flatten xs"
streckem
parents:
diff changeset
    50
(*<*) oops (*>*)
streckem
parents:
diff changeset
    51
streckem
parents:
diff changeset
    52
lemma "sum (rev xs) = sum xs"
streckem
parents:
diff changeset
    53
(*<*) oops (*>*)
streckem
parents:
diff changeset
    54
streckem
parents:
diff changeset
    55
streckem
parents:
diff changeset
    56
text{* Find a predicate @{text P} which satisfies *}
streckem
parents:
diff changeset
    57
streckem
parents:
diff changeset
    58
lemma "list_all P xs \<longrightarrow> length xs \<le> sum xs"
streckem
parents:
diff changeset
    59
(*<*) oops (*>*)
streckem
parents:
diff changeset
    60
streckem
parents:
diff changeset
    61
text{* Define, by means of primitive recursion, a function @{text
streckem
parents:
diff changeset
    62
exists} which checks whether an element satisfying a given property is
streckem
parents:
diff changeset
    63
contained in the list: *}
streckem
parents:
diff changeset
    64
streckem
parents:
diff changeset
    65
streckem
parents:
diff changeset
    66
(*<*) consts (*>*)
streckem
parents:
diff changeset
    67
  list_exists :: "('a \<Rightarrow> bool) \<Rightarrow> ('a list \<Rightarrow> bool)"
streckem
parents:
diff changeset
    68
streckem
parents:
diff changeset
    69
text{* Test your function on the following examples: *}
streckem
parents:
diff changeset
    70
streckem
parents:
diff changeset
    71
streckem
parents:
diff changeset
    72
lemma "list_exists (\<lambda> n. n < 3) [4::nat, 3, 7] = b"
streckem
parents:
diff changeset
    73
(*<*) oops (*>*)
streckem
parents:
diff changeset
    74
streckem
parents:
diff changeset
    75
lemma "list_exists (\<lambda> n. n < 4) [4::nat, 3, 7] = b"
streckem
parents:
diff changeset
    76
(*<*) oops (*>*)
streckem
parents:
diff changeset
    77
streckem
parents:
diff changeset
    78
text{* Prove the following statements: *}
streckem
parents:
diff changeset
    79
streckem
parents:
diff changeset
    80
lemma list_exists_append: 
streckem
parents:
diff changeset
    81
  "list_exists P (xs @ ys) = (list_exists P xs \<or> list_exists P ys)"
streckem
parents:
diff changeset
    82
(*<*) oops (*>*)
streckem
parents:
diff changeset
    83
streckem
parents:
diff changeset
    84
lemma "list_exists (list_exists P) xs = list_exists P (flatten xs)"
streckem
parents:
diff changeset
    85
(*<*) oops (*>*)
streckem
parents:
diff changeset
    86
streckem
parents:
diff changeset
    87
text{* You could have defined @{text list_exists} only with the aid of
streckem
parents:
diff changeset
    88
@{text list_all}. Do this now, i.e. define a function @{text
streckem
parents:
diff changeset
    89
list_exists2} and show that it is equivalent to @{text list_exists}. *}
streckem
parents:
diff changeset
    90
streckem
parents:
diff changeset
    91
streckem
parents:
diff changeset
    92
(*<*) end (*>*)
streckem
parents:
diff changeset
    93