doc-src/Exercises/2003/a1/a1.thy
author wenzelm
Sat, 29 May 2004 15:05:25 +0200
changeset 14830 faa4865ba1ce
parent 14523 5656e3151f17
permissions -rw-r--r--
removed norm_typ; improved output; refer to Pretty.pp;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
14523
streckem
parents:
diff changeset
     1
(*<*)
streckem
parents:
diff changeset
     2
theory a1 = Main:
streckem
parents:
diff changeset
     3
(*>*)
streckem
parents:
diff changeset
     4
subsection {* Lists *}
streckem
parents:
diff changeset
     5
streckem
parents:
diff changeset
     6
text{* 
streckem
parents:
diff changeset
     7
Define a function @{term occurs}, such that @{term"occurs x xs"} 
streckem
parents:
diff changeset
     8
is the number of occurrences of the element @{term x} in the list
streckem
parents:
diff changeset
     9
@{term xs}.
streckem
parents:
diff changeset
    10
*}
streckem
parents:
diff changeset
    11
streckem
parents:
diff changeset
    12
(*<*) consts (*>*)
streckem
parents:
diff changeset
    13
  occurs :: "'a \<Rightarrow> 'a list \<Rightarrow> nat"
streckem
parents:
diff changeset
    14
streckem
parents:
diff changeset
    15
text {*
streckem
parents:
diff changeset
    16
Prove or disprove (by counter example) the theorems that follow. You may have to prove some lemmas first.
streckem
parents:
diff changeset
    17
streckem
parents:
diff changeset
    18
Use the @{text "[simp]"}-attribute only if the equation is truly a
streckem
parents:
diff changeset
    19
simplification and is necessary for some later proof.
streckem
parents:
diff changeset
    20
streckem
parents:
diff changeset
    21
In the case of a non-theorem try to find a suitable assumption under which the theorem holds. *};
streckem
parents:
diff changeset
    22
streckem
parents:
diff changeset
    23
theorem "occurs a (xs @ ys) = occurs a xs + occurs a ys "
streckem
parents:
diff changeset
    24
(*<*)oops(*>*)
streckem
parents:
diff changeset
    25
streckem
parents:
diff changeset
    26
theorem "occurs a xs = occurs a (rev xs)"
streckem
parents:
diff changeset
    27
(*<*)oops(*>*)
streckem
parents:
diff changeset
    28
streckem
parents:
diff changeset
    29
theorem "occurs a xs <= length xs"
streckem
parents:
diff changeset
    30
(*<*)oops(*>*)
streckem
parents:
diff changeset
    31
streckem
parents:
diff changeset
    32
theorem "occurs a (replicate n a) = n"
streckem
parents:
diff changeset
    33
(*<*)oops(*>*)
streckem
parents:
diff changeset
    34
streckem
parents:
diff changeset
    35
text{*
streckem
parents:
diff changeset
    36
Define a function @{term areAll}, such that @{term"areAll xs x"} is true iff all elements of @{term xs} are equal to @{term x}.
streckem
parents:
diff changeset
    37
*}
streckem
parents:
diff changeset
    38
(*<*) consts (*>*)
streckem
parents:
diff changeset
    39
  areAll :: "'a list \<Rightarrow> 'a \<Rightarrow> bool"
streckem
parents:
diff changeset
    40
streckem
parents:
diff changeset
    41
theorem "areAll xs a \<longrightarrow> occurs a xs = length xs"
streckem
parents:
diff changeset
    42
(*<*)oops(*>*)
streckem
parents:
diff changeset
    43
streckem
parents:
diff changeset
    44
theorem "occurs a xs = length xs \<longrightarrow> areAll xs a"
streckem
parents:
diff changeset
    45
(*<*)oops(*>*)
streckem
parents:
diff changeset
    46
streckem
parents:
diff changeset
    47
text{*
streckem
parents:
diff changeset
    48
Define two functions to delete elements from a list:
streckem
parents:
diff changeset
    49
@{term"del1 x xs"} deletes the first (leftmost) occurrence of @{term x} from @{term xs}.
streckem
parents:
diff changeset
    50
@{term"delall x xs"} deletes all occurrences of @{term x} from @{term xs}.
streckem
parents:
diff changeset
    51
*}
streckem
parents:
diff changeset
    52
(*<*) consts (*>*)
streckem
parents:
diff changeset
    53
  delall :: "'a \<Rightarrow> 'a list \<Rightarrow> 'a list"
streckem
parents:
diff changeset
    54
  del1 :: "'a \<Rightarrow> 'a list \<Rightarrow> 'a list"
streckem
parents:
diff changeset
    55
streckem
parents:
diff changeset
    56
theorem "occurs a (delall a xs) = 0"
streckem
parents:
diff changeset
    57
(*<*)oops(*>*) 
streckem
parents:
diff changeset
    58
theorem "Suc (occurs a (del1 a xs)) = occurs a xs"
streckem
parents:
diff changeset
    59
(*<*)oops(*>*)
streckem
parents:
diff changeset
    60
streckem
parents:
diff changeset
    61
text{*
streckem
parents:
diff changeset
    62
Define a function @{term replace}, such that @{term"replace x y zs"} yields @{term zs} with every occurrence of @{term x} replaced by @{term y}.
streckem
parents:
diff changeset
    63
*}
streckem
parents:
diff changeset
    64
(*<*) consts (*>*)
streckem
parents:
diff changeset
    65
  replace :: "'a \<Rightarrow> 'a \<Rightarrow> 'a list \<Rightarrow> 'a list"
streckem
parents:
diff changeset
    66
streckem
parents:
diff changeset
    67
theorem "occurs a xs = occurs b (replace a b xs)"
streckem
parents:
diff changeset
    68
(*<*)oops(*>*)
streckem
parents:
diff changeset
    69
streckem
parents:
diff changeset
    70
text{* 
streckem
parents:
diff changeset
    71
With the help of @{term occurs}, define a function @{term remDups} that removes all duplicates from a list.*}
streckem
parents:
diff changeset
    72
(*<*) consts (*>*)
streckem
parents:
diff changeset
    73
  remDups :: "'a list \<Rightarrow> 'a list"
streckem
parents:
diff changeset
    74
text{* Use @{term occurs} to formulate and prove a lemma that expresses the fact that @{term remDups} never inserts a new element into a list.*}
streckem
parents:
diff changeset
    75
streckem
parents:
diff changeset
    76
text{* Use @{term occurs} to formulate and prove a lemma that expresses the fact that @{term remDups} always returns a list without duplicates (i.e.\ the correctness of @{term remDups}).
streckem
parents:
diff changeset
    77
*}
streckem
parents:
diff changeset
    78
streckem
parents:
diff changeset
    79
text{* 
streckem
parents:
diff changeset
    80
Now, with the help of @{term occurs} define a function @{term unique}, such that @{term"unique xs"} is true iff every element in @{term xs} occurs only once.
streckem
parents:
diff changeset
    81
*}
streckem
parents:
diff changeset
    82
(*<*) consts (*>*)
streckem
parents:
diff changeset
    83
  unique :: "'a list \<Rightarrow> bool"
streckem
parents:
diff changeset
    84
streckem
parents:
diff changeset
    85
text{* 
streckem
parents:
diff changeset
    86
Formulate and prove the correctness of @{term remDups} with the help of @{term unique}.
streckem
parents:
diff changeset
    87
*}
streckem
parents:
diff changeset
    88
(*<*) end (*>*)