src/HOL/Corec_Examples/Stream_Processor.thy
author paulson <lp15@cam.ac.uk>
Wed, 19 Aug 2020 12:58:28 +0100
changeset 72170 7fa9605b226c
parent 66453 cc19f7ca2ed6
child 72184 881bd98bddee
permissions -rw-r--r--
Another go with lex: now lexordp back in class ord
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
62694
f50d7efc8fe3 added two 'corec' examples
blanchet
parents:
diff changeset
     1
(*  Title:      HOL/Corec_Examples/Stream_Processor.thy
f50d7efc8fe3 added two 'corec' examples
blanchet
parents:
diff changeset
     2
    Author:     Andreas Lochbihler, ETH Zuerich
f50d7efc8fe3 added two 'corec' examples
blanchet
parents:
diff changeset
     3
    Author:     Dmitriy Traytel, ETH Zuerich
f50d7efc8fe3 added two 'corec' examples
blanchet
parents:
diff changeset
     4
    Author:     Andrei Popescu, TU Muenchen
f50d7efc8fe3 added two 'corec' examples
blanchet
parents:
diff changeset
     5
    Copyright   2014, 2016
f50d7efc8fe3 added two 'corec' examples
blanchet
parents:
diff changeset
     6
f50d7efc8fe3 added two 'corec' examples
blanchet
parents:
diff changeset
     7
Stream processors---a syntactic representation of continuous functions on streams.
f50d7efc8fe3 added two 'corec' examples
blanchet
parents:
diff changeset
     8
*)
f50d7efc8fe3 added two 'corec' examples
blanchet
parents:
diff changeset
     9
62726
5b2a7caa855b tuned examples
blanchet
parents: 62698
diff changeset
    10
section \<open>Stream Processors---A Syntactic Representation of Continuous Functions on Streams\<close>
62694
f50d7efc8fe3 added two 'corec' examples
blanchet
parents:
diff changeset
    11
f50d7efc8fe3 added two 'corec' examples
blanchet
parents:
diff changeset
    12
theory Stream_Processor
66453
cc19f7ca2ed6 session-qualified theory imports: isabelle imports -U -i -d '~~/src/Benchmarks' -a;
wenzelm
parents: 62726
diff changeset
    13
imports "HOL-Library.BNF_Corec" "HOL-Library.Stream"
62694
f50d7efc8fe3 added two 'corec' examples
blanchet
parents:
diff changeset
    14
begin
f50d7efc8fe3 added two 'corec' examples
blanchet
parents:
diff changeset
    15
f50d7efc8fe3 added two 'corec' examples
blanchet
parents:
diff changeset
    16
datatype (discs_sels) ('a, 'b, 'c) sp\<^sub>\<mu> =
f50d7efc8fe3 added two 'corec' examples
blanchet
parents:
diff changeset
    17
  Get "'a \<Rightarrow> ('a, 'b, 'c) sp\<^sub>\<mu>"
f50d7efc8fe3 added two 'corec' examples
blanchet
parents:
diff changeset
    18
| Put "'b" "'c"
f50d7efc8fe3 added two 'corec' examples
blanchet
parents:
diff changeset
    19
f50d7efc8fe3 added two 'corec' examples
blanchet
parents:
diff changeset
    20
codatatype ('a, 'b) sp\<^sub>\<nu> =
f50d7efc8fe3 added two 'corec' examples
blanchet
parents:
diff changeset
    21
  In (out: "('a, 'b, ('a, 'b) sp\<^sub>\<nu>) sp\<^sub>\<mu>")
f50d7efc8fe3 added two 'corec' examples
blanchet
parents:
diff changeset
    22
f50d7efc8fe3 added two 'corec' examples
blanchet
parents:
diff changeset
    23
definition "sub \<equiv> {(f a, Get f) | a f. True}"
f50d7efc8fe3 added two 'corec' examples
blanchet
parents:
diff changeset
    24
f50d7efc8fe3 added two 'corec' examples
blanchet
parents:
diff changeset
    25
lemma subI[intro]: "(f a, Get f) \<in> sub"
f50d7efc8fe3 added two 'corec' examples
blanchet
parents:
diff changeset
    26
  unfolding sub_def by blast
f50d7efc8fe3 added two 'corec' examples
blanchet
parents:
diff changeset
    27
f50d7efc8fe3 added two 'corec' examples
blanchet
parents:
diff changeset
    28
lemma wf_sub[simp, intro]: "wf sub"
f50d7efc8fe3 added two 'corec' examples
blanchet
parents:
diff changeset
    29
proof (rule wfUNIVI)
f50d7efc8fe3 added two 'corec' examples
blanchet
parents:
diff changeset
    30
  fix P  :: "('a, 'b, 'c) sp\<^sub>\<mu> \<Rightarrow> bool" and x
f50d7efc8fe3 added two 'corec' examples
blanchet
parents:
diff changeset
    31
  assume "\<forall>x. (\<forall>y. (y, x) \<in> sub \<longrightarrow> P y) \<longrightarrow> P x"
f50d7efc8fe3 added two 'corec' examples
blanchet
parents:
diff changeset
    32
  hence I: "\<And>x. (\<forall>y. (\<exists>a f. y = f a \<and> x = Get f) \<longrightarrow> P y) \<Longrightarrow> P x" unfolding sub_def by blast
f50d7efc8fe3 added two 'corec' examples
blanchet
parents:
diff changeset
    33
  show "P x" by (induct x) (auto intro: I)
f50d7efc8fe3 added two 'corec' examples
blanchet
parents:
diff changeset
    34
qed
f50d7efc8fe3 added two 'corec' examples
blanchet
parents:
diff changeset
    35
72170
7fa9605b226c Another go with lex: now lexordp back in class ord
paulson <lp15@cam.ac.uk>
parents: 66453
diff changeset
    36
lemma Get_neq: "Get f \<noteq> f a"
7fa9605b226c Another go with lex: now lexordp back in class ord
paulson <lp15@cam.ac.uk>
parents: 66453
diff changeset
    37
  by (metis subI wf_not_sym wf_sub)
7fa9605b226c Another go with lex: now lexordp back in class ord
paulson <lp15@cam.ac.uk>
parents: 66453
diff changeset
    38
62694
f50d7efc8fe3 added two 'corec' examples
blanchet
parents:
diff changeset
    39
definition get where
f50d7efc8fe3 added two 'corec' examples
blanchet
parents:
diff changeset
    40
  "get f = In (Get (\<lambda>a. out (f a)))"
f50d7efc8fe3 added two 'corec' examples
blanchet
parents:
diff changeset
    41
f50d7efc8fe3 added two 'corec' examples
blanchet
parents:
diff changeset
    42
corecursive run :: "('a, 'b) sp\<^sub>\<nu> \<Rightarrow> 'a stream \<Rightarrow> 'b stream" where
f50d7efc8fe3 added two 'corec' examples
blanchet
parents:
diff changeset
    43
  "run sp s = (case out sp of
f50d7efc8fe3 added two 'corec' examples
blanchet
parents:
diff changeset
    44
     Get f \<Rightarrow> run (In (f (shd s))) (stl s)
f50d7efc8fe3 added two 'corec' examples
blanchet
parents:
diff changeset
    45
   | Put b sp \<Rightarrow> b ## run sp s)"
72170
7fa9605b226c Another go with lex: now lexordp back in class ord
paulson <lp15@cam.ac.uk>
parents: 66453
diff changeset
    46
  by (relation "inv_image (map_prod In In ` sub) fst")
7fa9605b226c Another go with lex: now lexordp back in class ord
paulson <lp15@cam.ac.uk>
parents: 66453
diff changeset
    47
     (auto simp: inj_on_def out_def split: sp\<^sub>\<nu>.splits intro: wf_map_prod_image)
62694
f50d7efc8fe3 added two 'corec' examples
blanchet
parents:
diff changeset
    48
f50d7efc8fe3 added two 'corec' examples
blanchet
parents:
diff changeset
    49
corec copy where
f50d7efc8fe3 added two 'corec' examples
blanchet
parents:
diff changeset
    50
  "copy = In (Get (\<lambda>a. Put a copy))"
f50d7efc8fe3 added two 'corec' examples
blanchet
parents:
diff changeset
    51
f50d7efc8fe3 added two 'corec' examples
blanchet
parents:
diff changeset
    52
friend_of_corec get where
f50d7efc8fe3 added two 'corec' examples
blanchet
parents:
diff changeset
    53
  "get f = In (Get (\<lambda>a. out (f a)))"
f50d7efc8fe3 added two 'corec' examples
blanchet
parents:
diff changeset
    54
  by (auto simp: rel_fun_def get_def sp\<^sub>\<mu>.rel_map rel_prod.simps, metis sndI)
f50d7efc8fe3 added two 'corec' examples
blanchet
parents:
diff changeset
    55
f50d7efc8fe3 added two 'corec' examples
blanchet
parents:
diff changeset
    56
lemma run_simps [simp]:
f50d7efc8fe3 added two 'corec' examples
blanchet
parents:
diff changeset
    57
  "run (In (Get f)) s = run (In (f (shd s))) (stl s)"
f50d7efc8fe3 added two 'corec' examples
blanchet
parents:
diff changeset
    58
  "run (In (Put b sp)) s = b ## run sp s"
f50d7efc8fe3 added two 'corec' examples
blanchet
parents:
diff changeset
    59
by(subst run.code; simp; fail)+
f50d7efc8fe3 added two 'corec' examples
blanchet
parents:
diff changeset
    60
f50d7efc8fe3 added two 'corec' examples
blanchet
parents:
diff changeset
    61
lemma copy_sel[simp]: "out copy = Get (\<lambda>a. Put a copy)"
f50d7efc8fe3 added two 'corec' examples
blanchet
parents:
diff changeset
    62
  by (subst copy.code; simp)
f50d7efc8fe3 added two 'corec' examples
blanchet
parents:
diff changeset
    63
72170
7fa9605b226c Another go with lex: now lexordp back in class ord
paulson <lp15@cam.ac.uk>
parents: 66453
diff changeset
    64
lemma wf_imp_irrefl:
7fa9605b226c Another go with lex: now lexordp back in class ord
paulson <lp15@cam.ac.uk>
parents: 66453
diff changeset
    65
  assumes "wf r" shows "irrefl r" 
7fa9605b226c Another go with lex: now lexordp back in class ord
paulson <lp15@cam.ac.uk>
parents: 66453
diff changeset
    66
  using wf_irrefl [OF assms] by (auto simp add: irrefl_def)
7fa9605b226c Another go with lex: now lexordp back in class ord
paulson <lp15@cam.ac.uk>
parents: 66453
diff changeset
    67
7fa9605b226c Another go with lex: now lexordp back in class ord
paulson <lp15@cam.ac.uk>
parents: 66453
diff changeset
    68
62694
f50d7efc8fe3 added two 'corec' examples
blanchet
parents:
diff changeset
    69
corecursive sp_comp (infixl "oo" 65) where
f50d7efc8fe3 added two 'corec' examples
blanchet
parents:
diff changeset
    70
  "sp oo sp' = (case (out sp, out sp') of
f50d7efc8fe3 added two 'corec' examples
blanchet
parents:
diff changeset
    71
      (Put b sp, _) \<Rightarrow> In (Put b (sp oo sp'))
f50d7efc8fe3 added two 'corec' examples
blanchet
parents:
diff changeset
    72
    | (Get f, Put b sp) \<Rightarrow> In (f b) oo sp
f50d7efc8fe3 added two 'corec' examples
blanchet
parents:
diff changeset
    73
    | (_, Get g) \<Rightarrow> get (\<lambda>a. (sp oo In (g a))))"
72170
7fa9605b226c Another go with lex: now lexordp back in class ord
paulson <lp15@cam.ac.uk>
parents: 66453
diff changeset
    74
  apply(relation "map_prod In In ` sub <*lex*> map_prod In In ` sub")
7fa9605b226c Another go with lex: now lexordp back in class ord
paulson <lp15@cam.ac.uk>
parents: 66453
diff changeset
    75
    apply(auto simp: inj_on_def out_def split: sp\<^sub>\<nu>.splits intro: wf_map_prod_image)
7fa9605b226c Another go with lex: now lexordp back in class ord
paulson <lp15@cam.ac.uk>
parents: 66453
diff changeset
    76
  by (metis Get_neq)
62694
f50d7efc8fe3 added two 'corec' examples
blanchet
parents:
diff changeset
    77
62698
9d706e37ddab tuned whitespace
blanchet
parents: 62694
diff changeset
    78
lemma run_copy_unique:
72170
7fa9605b226c Another go with lex: now lexordp back in class ord
paulson <lp15@cam.ac.uk>
parents: 66453
diff changeset
    79
  "(\<And>s. h s = shd s ## h (stl s)) \<Longrightarrow> h = run copy"
7fa9605b226c Another go with lex: now lexordp back in class ord
paulson <lp15@cam.ac.uk>
parents: 66453
diff changeset
    80
  apply corec_unique
7fa9605b226c Another go with lex: now lexordp back in class ord
paulson <lp15@cam.ac.uk>
parents: 66453
diff changeset
    81
  apply(rule ext)
7fa9605b226c Another go with lex: now lexordp back in class ord
paulson <lp15@cam.ac.uk>
parents: 66453
diff changeset
    82
  apply(subst copy.code)
7fa9605b226c Another go with lex: now lexordp back in class ord
paulson <lp15@cam.ac.uk>
parents: 66453
diff changeset
    83
  apply simp
7fa9605b226c Another go with lex: now lexordp back in class ord
paulson <lp15@cam.ac.uk>
parents: 66453
diff changeset
    84
  done
62694
f50d7efc8fe3 added two 'corec' examples
blanchet
parents:
diff changeset
    85
f50d7efc8fe3 added two 'corec' examples
blanchet
parents:
diff changeset
    86
end