added bot instances; tuned
authorhaftmann
Mon, 21 Jun 2010 09:38:20 +0200
changeset 37449ce943f9edf5e
parent 37448 013f78aed840
child 37450 98c6f9dc58d0
added bot instances; tuned
src/HOL/Library/List_Prefix.thy
src/HOL/Library/List_lexord.thy
     1.1 --- a/src/HOL/Library/List_Prefix.thy	Mon Jun 21 09:06:14 2010 +0200
     1.2 +++ b/src/HOL/Library/List_Prefix.thy	Mon Jun 21 09:38:20 2010 +0200
     1.3 @@ -10,17 +10,20 @@
     1.4  
     1.5  subsection {* Prefix order on lists *}
     1.6  
     1.7 -instantiation list :: (type) order
     1.8 +instantiation list :: (type) "{order, bot}"
     1.9  begin
    1.10  
    1.11  definition
    1.12 -  prefix_def [code del]: "xs \<le> ys = (\<exists>zs. ys = xs @ zs)"
    1.13 +  prefix_def: "xs \<le> ys \<longleftrightarrow> (\<exists>zs. ys = xs @ zs)"
    1.14  
    1.15  definition
    1.16 -  strict_prefix_def [code del]: "xs < ys = (xs \<le> ys \<and> xs \<noteq> (ys::'a list))"
    1.17 +  strict_prefix_def: "xs < ys \<longleftrightarrow> xs \<le> ys \<and> xs \<noteq> (ys::'a list)"
    1.18  
    1.19 -instance
    1.20 -  by intro_classes (auto simp add: prefix_def strict_prefix_def)
    1.21 +definition
    1.22 +  "bot = []"
    1.23 +
    1.24 +instance proof
    1.25 +qed (auto simp add: prefix_def strict_prefix_def bot_list_def)
    1.26  
    1.27  end
    1.28  
    1.29 @@ -77,6 +80,12 @@
    1.30  lemma Cons_prefix_Cons [simp]: "(x # xs \<le> y # ys) = (x = y \<and> xs \<le> ys)"
    1.31    by (auto simp add: prefix_def)
    1.32  
    1.33 +lemma less_eq_list_code [code]:
    1.34 +  "([]\<Colon>'a\<Colon>{eq, ord} list) \<le> xs \<longleftrightarrow> True"
    1.35 +  "(x\<Colon>'a\<Colon>{eq, ord}) # xs \<le> [] \<longleftrightarrow> False"
    1.36 +  "(x\<Colon>'a\<Colon>{eq, ord}) # xs \<le> y # ys \<longleftrightarrow> x = y \<and> xs \<le> ys"
    1.37 +  by simp_all
    1.38 +
    1.39  lemma same_prefix_prefix [simp]: "(xs @ ys \<le> xs @ zs) = (ys \<le> zs)"
    1.40    by (induct xs) simp_all
    1.41  
    1.42 @@ -125,10 +134,10 @@
    1.43  lemma prefix_length_less: "xs < ys \<Longrightarrow> length xs < length ys"
    1.44    by (auto simp: strict_prefix_def prefix_def)
    1.45  
    1.46 -lemma strict_prefix_simps [simp]:
    1.47 -    "xs < [] = False"
    1.48 -    "[] < (x # xs) = True"
    1.49 -    "(x # xs) < (y # ys) = (x = y \<and> xs < ys)"
    1.50 +lemma strict_prefix_simps [simp, code]:
    1.51 +  "xs < [] \<longleftrightarrow> False"
    1.52 +  "[] < x # xs \<longleftrightarrow> True"
    1.53 +  "x # xs < y # ys \<longleftrightarrow> x = y \<and> xs < ys"
    1.54    by (simp_all add: strict_prefix_def cong: conj_cong)
    1.55  
    1.56  lemma take_strict_prefix: "xs < ys \<Longrightarrow> take n xs < ys"
    1.57 @@ -301,7 +310,7 @@
    1.58      by (induct zs) (auto intro!: postfix_appendI postfix_ConsI)
    1.59  qed
    1.60  
    1.61 -lemma postfix_to_prefix: "xs >>= ys \<longleftrightarrow> rev ys \<le> rev xs"
    1.62 +lemma postfix_to_prefix [code]: "xs >>= ys \<longleftrightarrow> rev ys \<le> rev xs"
    1.63  proof
    1.64    assume "xs >>= ys"
    1.65    then obtain zs where "xs = zs @ ys" ..
    1.66 @@ -370,21 +379,4 @@
    1.67    qed
    1.68  qed
    1.69  
    1.70 -
    1.71 -subsection {* Executable code *}
    1.72 -
    1.73 -lemma less_eq_code [code]:
    1.74 -    "([]\<Colon>'a\<Colon>{eq, ord} list) \<le> xs \<longleftrightarrow> True"
    1.75 -    "(x\<Colon>'a\<Colon>{eq, ord}) # xs \<le> [] \<longleftrightarrow> False"
    1.76 -    "(x\<Colon>'a\<Colon>{eq, ord}) # xs \<le> y # ys \<longleftrightarrow> x = y \<and> xs \<le> ys"
    1.77 -  by simp_all
    1.78 -
    1.79 -lemma less_code [code]:
    1.80 -    "xs < ([]\<Colon>'a\<Colon>{eq, ord} list) \<longleftrightarrow> False"
    1.81 -    "[] < (x\<Colon>'a\<Colon>{eq, ord})# xs \<longleftrightarrow> True"
    1.82 -    "(x\<Colon>'a\<Colon>{eq, ord}) # xs < y # ys \<longleftrightarrow> x = y \<and> xs < ys"
    1.83 -  unfolding strict_prefix_def by auto
    1.84 -
    1.85 -lemmas [code] = postfix_to_prefix
    1.86 -
    1.87  end
     2.1 --- a/src/HOL/Library/List_lexord.thy	Mon Jun 21 09:06:14 2010 +0200
     2.2 +++ b/src/HOL/Library/List_lexord.thy	Mon Jun 21 09:38:20 2010 +0200
     2.3 @@ -12,10 +12,10 @@
     2.4  begin
     2.5  
     2.6  definition
     2.7 -  list_less_def [code del]: "(xs::('a::ord) list) < ys \<longleftrightarrow> (xs, ys) \<in> lexord {(u,v). u < v}"
     2.8 +  list_less_def: "xs < ys \<longleftrightarrow> (xs, ys) \<in> lexord {(u, v). u < v}"
     2.9  
    2.10  definition
    2.11 -  list_le_def [code del]: "(xs::('a::ord) list) \<le> ys \<longleftrightarrow> (xs < ys \<or> xs = ys)"
    2.12 +  list_le_def: "(xs :: _ list) \<le> ys \<longleftrightarrow> xs < ys \<or> xs = ys"
    2.13  
    2.14  instance ..
    2.15  
    2.16 @@ -91,13 +91,24 @@
    2.17  lemma Cons_le_Cons [simp]: "a # x \<le> b # y \<longleftrightarrow> a < b \<or> a = b \<and> x \<le> y"
    2.18    by (unfold list_le_def) auto
    2.19  
    2.20 -lemma less_code [code]:
    2.21 +instantiation list :: (order) bot
    2.22 +begin
    2.23 +
    2.24 +definition
    2.25 +  "bot = []"
    2.26 +
    2.27 +instance proof
    2.28 +qed (simp add: bot_list_def)
    2.29 +
    2.30 +end
    2.31 +
    2.32 +lemma less_list_code [code]:
    2.33    "xs < ([]\<Colon>'a\<Colon>{eq, order} list) \<longleftrightarrow> False"
    2.34    "[] < (x\<Colon>'a\<Colon>{eq, order}) # xs \<longleftrightarrow> True"
    2.35    "(x\<Colon>'a\<Colon>{eq, order}) # xs < y # ys \<longleftrightarrow> x < y \<or> x = y \<and> xs < ys"
    2.36    by simp_all
    2.37  
    2.38 -lemma less_eq_code [code]:
    2.39 +lemma less_eq_list_code [code]:
    2.40    "x # xs \<le> ([]\<Colon>'a\<Colon>{eq, order} list) \<longleftrightarrow> False"
    2.41    "[] \<le> (xs\<Colon>'a\<Colon>{eq, order} list) \<longleftrightarrow> True"
    2.42    "(x\<Colon>'a\<Colon>{eq, order}) # xs \<le> y # ys \<longleftrightarrow> x < y \<or> x = y \<and> xs \<le> ys"