src/HOL/Library/SCT_Implementation.thy
author wenzelm
Fri, 13 Apr 2007 21:26:35 +0200
changeset 22665 cf152ff55d16
parent 22371 c9f5895972b0
child 22744 5cbe966d67a2
permissions -rw-r--r--
tuned document (headers, sections, spacing);
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
22371
c9f5895972b0 added headers
krauss
parents: 22359
diff changeset
     1
(*  Title:      HOL/Library/SCT_Implementation.thy
c9f5895972b0 added headers
krauss
parents: 22359
diff changeset
     2
    ID:         $Id$
c9f5895972b0 added headers
krauss
parents: 22359
diff changeset
     3
    Author:     Alexander Krauss, TU Muenchen
c9f5895972b0 added headers
krauss
parents: 22359
diff changeset
     4
*)
c9f5895972b0 added headers
krauss
parents: 22359
diff changeset
     5
22665
cf152ff55d16 tuned document (headers, sections, spacing);
wenzelm
parents: 22371
diff changeset
     6
header ""
cf152ff55d16 tuned document (headers, sections, spacing);
wenzelm
parents: 22371
diff changeset
     7
22359
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
     8
theory SCT_Implementation
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
     9
imports ExecutableSet SCT_Definition
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    10
begin
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    11
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    12
fun edges_match :: "('n \<times> 'e \<times> 'n) \<times> ('n \<times> 'e \<times> 'n) \<Rightarrow> bool"
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    13
where
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    14
  "edges_match ((n, e, m), (n',e',m')) = (m = n')"
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    15
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    16
fun connect_edges :: 
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    17
  "('n \<times> ('e::times) \<times> 'n) \<times> ('n \<times> 'e \<times> 'n)
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    18
  \<Rightarrow> ('n \<times> 'e \<times> 'n)"
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    19
where
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    20
  "connect_edges ((n,e,m), (n', e', m')) = (n, e * e', m')"
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    21
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    22
lemma grcomp_code[code]:
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    23
  "grcomp (Graph G) (Graph H) = Graph (connect_edges ` { x \<in> G\<times>H. edges_match x })"
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    24
  by (rule graph_ext) (auto simp:graph_mult_def has_edge_def image_def)
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    25
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    26
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    27
definition test_SCT :: "acg \<Rightarrow> bool"
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    28
where
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    29
  "test_SCT \<A> = 
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    30
  (let \<T> = mk_tcl \<A> \<A>
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    31
    in (\<T> \<noteq> 0 \<and>
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    32
       (\<forall>(n,G,m)\<in>dest_graph \<T>. 
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    33
          n \<noteq> m \<or> G * G \<noteq> G \<or> 
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    34
         (\<exists>(p::nat,e,q)\<in>dest_graph G. p = q \<and> e = LESS))))"
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    35
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    36
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    37
lemma SCT'_exec:
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    38
  assumes a: "test_SCT \<A>"
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    39
  shows "SCT' \<A>"
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    40
proof -
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    41
  from mk_tcl_correctness2 a 
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    42
  have "mk_tcl \<A> \<A> = tcl \<A>" 
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    43
    unfolding test_SCT_def Let_def by auto
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    44
  
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    45
  with a
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    46
  show ?thesis
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    47
    unfolding SCT'_def no_bad_graphs_def test_SCT_def Let_def has_edge_def
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    48
    by auto
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    49
qed
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    50
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    51
code_modulename SML
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    52
  Implementation Graphs
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    53
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    54
lemma [code func]:
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    55
  "(G\<Colon>('a\<Colon>eq, 'b\<Colon>eq) graph) \<le> H \<longleftrightarrow> dest_graph G \<subseteq> dest_graph H"
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    56
  "(G\<Colon>('a\<Colon>eq, 'b\<Colon>eq) graph) < H \<longleftrightarrow> dest_graph G \<subset> dest_graph H"
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    57
  unfolding graph_leq_def graph_less_def by rule+
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    58
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    59
lemma [code func]:
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    60
  "(G\<Colon>('a\<Colon>eq, 'b\<Colon>eq) graph) + H = Graph (dest_graph G \<union> dest_graph H)"
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    61
  unfolding graph_plus_def ..
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    62
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    63
lemma [code func]:
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    64
  "(G\<Colon>('a\<Colon>eq, 'b\<Colon>{eq, times}) graph) * H = grcomp G H"
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    65
  unfolding graph_mult_def ..
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    66
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    67
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    68
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    69
lemma SCT'_empty: "SCT' (Graph {})"
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    70
  unfolding SCT'_def no_bad_graphs_def graph_zero_def[symmetric]
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    71
  tcl_zero
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    72
  by (simp add:in_grzero)
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    73
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    74
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    75
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    76
subsection {* Witness checking *}
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    77
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    78
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    79
definition test_SCT_witness :: "acg \<Rightarrow> acg \<Rightarrow> bool"
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    80
where
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    81
  "test_SCT_witness A T = 
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    82
  (A \<le> T \<and> A * T \<le> T \<and>
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    83
       (\<forall>(n,G,m)\<in>dest_graph T. 
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    84
          n \<noteq> m \<or> G * G \<noteq> G \<or> 
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    85
         (\<exists>(p::nat,e,q)\<in>dest_graph G. p = q \<and> e = LESS)))"
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    86
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    87
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    88
lemma no_bad_graphs_ucl:
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    89
  assumes "A \<le> B"
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    90
  assumes "no_bad_graphs B"
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    91
  shows "no_bad_graphs A"
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    92
using prems
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    93
unfolding no_bad_graphs_def has_edge_def graph_leq_def 
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    94
by blast
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    95
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    96
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    97
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    98
lemma SCT'_witness:
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
    99
  assumes a: "test_SCT_witness A T"
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
   100
  shows "SCT' A"
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
   101
proof -
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
   102
  from a have "A \<le> T" "A * T \<le> T" by (auto simp:test_SCT_witness_def)
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
   103
  hence "A + A * T \<le> T" 
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
   104
    by (subst add_idem[of T, symmetric], rule add_mono)
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
   105
  with star3' have "tcl A \<le> T" unfolding tcl_def .
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
   106
  moreover
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
   107
  from a have "no_bad_graphs T"
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
   108
    unfolding no_bad_graphs_def test_SCT_witness_def has_edge_def
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
   109
    by auto
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
   110
  ultimately
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
   111
  show ?thesis
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
   112
    unfolding SCT'_def
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
   113
    by (rule no_bad_graphs_ucl)
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
   114
qed
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
   115
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
   116
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
   117
code_modulename SML
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
   118
  Graphs SCT
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
   119
  Kleene_Algebras SCT
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
   120
  SCT_Implementation SCT
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
   121
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
   122
code_gen test_SCT (SML -)
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
   123
94a794672c8b Added formalization of size-change principle (experimental).
krauss
parents:
diff changeset
   124
end