src/HOL/Lex/NAe.thy
changeset 14428 bb2b0e10d9be
parent 10834 a7897aebbffc
equal deleted inserted replaced
14427:cea7d2f76112 14428:bb2b0e10d9be
     4     Copyright   1998 TUM
     4     Copyright   1998 TUM
     5 
     5 
     6 Nondeterministic automata with epsilon transitions
     6 Nondeterministic automata with epsilon transitions
     7 *)
     7 *)
     8 
     8 
     9 NAe = NA +
     9 theory NAe = NA:
    10 
    10 
    11 types ('a,'s)nae = ('a option,'s)na
    11 types ('a,'s)nae = "('a option,'s)na"
    12 
    12 
    13 syntax eps :: "('a,'s)nae => ('s * 's)set"
    13 syntax eps :: "('a,'s)nae => ('s * 's)set"
    14 translations "eps A" == "step A None"
    14 translations "eps A" == "step A None"
    15 
    15 
    16 consts steps :: "('a,'s)nae => 'a list =>   ('s * 's)set"
    16 consts steps :: "('a,'s)nae => 'a list =>   ('s * 's)set"
    17 primrec
    17 primrec
    18 "steps A [] = (eps A)^*"
    18 "steps A [] = (eps A)^*"
    19 "steps A (a#w) = steps A w  O  step A (Some a)  O  (eps A)^*"
    19 "steps A (a#w) = steps A w  O  step A (Some a)  O  (eps A)^*"
    20 
    20 
    21 constdefs
    21 constdefs
    22  accepts :: ('a,'s)nae => 'a list => bool
    22  accepts :: "('a,'s)nae => 'a list => bool"
    23 "accepts A w == ? q. (start A,q) : steps A w & fin A q"
    23 "accepts A w == ? q. (start A,q) : steps A w & fin A q"
    24 
    24 
    25 (* not really used:
    25 (* not really used:
    26 consts delta :: "('a,'s)nae => 'a list => 's => 's set"
    26 consts delta :: "('a,'s)nae => 'a list => 's => 's set"
    27 primrec
    27 primrec
    28 "delta A [] s = (eps A)^* `` {s}"
    28 "delta A [] s = (eps A)^* `` {s}"
    29 "delta A (a#w) s = lift(delta A w) (lift(next A (Some a)) ((eps A)^* `` {s}))"
    29 "delta A (a#w) s = lift(delta A w) (lift(next A (Some a)) ((eps A)^* `` {s}))"
    30 *)
    30 *)
       
    31 
       
    32 lemma steps_epsclosure[simp]: "steps A w O (eps A)^* = steps A w"
       
    33 by(cases w)(simp_all add:O_assoc)
       
    34 
       
    35 lemma in_steps_epsclosure:
       
    36   "[| (p,q) : (eps A)^*; (q,r) : steps A w |] ==> (p,r) : steps A w"
       
    37 apply(rule steps_epsclosure[THEN equalityE])
       
    38 apply blast
       
    39 done
       
    40 
       
    41 lemma epsclosure_steps: "(eps A)^* O steps A w = steps A w";
       
    42 apply(induct w)
       
    43  apply simp
       
    44 apply(simp add:O_assoc[symmetric])
       
    45 done
       
    46 
       
    47 lemma in_epsclosure_steps:
       
    48   "[| (p,q) : steps A w; (q,r) : (eps A)^* |] ==> (p,r) : steps A w"
       
    49 apply(rule epsclosure_steps[THEN equalityE])
       
    50 apply blast
       
    51 done
       
    52 
       
    53 lemma steps_append[simp]:  "steps A (v@w) = steps A w  O  steps A v"
       
    54 by(induct v)(simp_all add:O_assoc)
       
    55 
       
    56 lemma in_steps_append[iff]:
       
    57   "(p,r) : steps A (v@w) = ((p,r) : (steps A w O steps A v))"
       
    58 apply(rule steps_append[THEN equalityE])
       
    59 apply blast
       
    60 done
       
    61 
       
    62 (* Equivalence of steps and delta
       
    63 * Use "(? x : f ` A. P x) = (? a:A. P(f x))" ?? *
       
    64 Goal "!p. (p,q) : steps A w = (q : delta A w p)";
       
    65 by (induct_tac "w" 1);
       
    66  by (Simp_tac 1);
       
    67 by (asm_simp_tac (simpset() addsimps [comp_def,step_def]) 1);
       
    68 by (Blast_tac 1);
       
    69 qed_spec_mp "steps_equiv_delta";
       
    70 *)
       
    71 
    31 end
    72 end