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 |