• No results found

Regular Sets and Expressions

N/A
N/A
Protected

Academic year: 2022

Share "Regular Sets and Expressions"

Copied!
17
0
0

Loading.... (view fulltext now)

Full text

(1)

Regular Sets and Expressions

Alexander Krauss and Tobias Nipkow February 11, 2011

Abstract

This is a library of constructions on regular expressions and lan- guages. It provides the operations of concatenation, Kleene star and derivative on languages. Regular expressions and their meaning are defined. An executable equivalence checker for regular expressions is verified; it does not need automata but works directly on regular expressions. By mapping regular expressions to binary relations, an automatic and complete proof method for (in)equalities of binary re- lations over union, concatenation and (reflexive) transitive closure is obtained.

Contents

1 Regular sets 2

1.1 op @@ . . . . 2

1.2 A

n

. . . . 3

1.3 star . . . . 3

1.4 deriv . . . . 6

1.5 bisimilar . . . . 8

2 Regular expressions 9 3 Deciding Regular Expression Equivalence 9 3.1 Term ordering . . . . 9

3.2 Normalizing operations . . . . 10

3.3 Finality and Derivative . . . . 11

3.4 Bisimulation between regular expressions . . . . 12

3.5 Closure computation . . . . 13

3.6 The overall procedure . . . . 14

4 Regular Expressions as Homogeneous Binary Relations 15

5 Proving Relation (In)equalities via Regular Expressions 16

(2)

1 Regular sets

theory Regular-Set imports Main begin

types 0a lang = 0a list set

definition conc :: 0a lang ⇒ 0a lang ⇒ 0a lang (infixr @@ 75 ) where A @@ B = {xs@ys | xs ys. xs:A & ys:B }

overloading lang-pow == compow :: nat ⇒ 0a lang ⇒ 0a lang begin

primrec lang-pow :: nat ⇒ 0a lang ⇒ 0a lang where lang-pow 0 A = {[]} |

lang-pow (Suc n) A = A @@ (lang-pow n A) end

definition star :: 0a lang ⇒ 0a lang where star A = (S n. A ˆˆ n)

definition deriv :: 0a ⇒ 0a lang ⇒ 0a lang where deriv x L = { xs. x #xs ∈ L }

coinductive bisimilar :: 0a list set ⇒ 0a list set ⇒ bool where ([] ∈ K ←→ [] ∈ L)

=⇒ (Vx . bisimilar (deriv x K ) (deriv x L))

=⇒ bisimilar K L

1.1 op @@

lemma concI [simp,intro]: u : A =⇒ v : B =⇒ u@v : A @@ B by (auto simp add : conc-def )

lemma concE [elim]:

assumes w ∈ A @@ B

obtains u v where u ∈ A v ∈ B w = u@v using assms by (auto simp: conc-def )

lemma conc-mono: A ⊆ C =⇒ B ⊆ D =⇒ A @@ B ⊆ C @@ D by (auto simp: conc-def )

lemma conc-empty[simp]: shows {} @@ A = {} and A @@ {} = {}

by auto

lemma conc-epsilon[simp]: shows {[]} @@ A = A and A @@ {[]} = A by (simp-all add :conc-def )

lemma conc-assoc: (A @@ B ) @@ C = A @@ (B @@ C )

(3)

by (auto elim!: concE ) (simp only: append-assoc[symmetric] concI ) lemma conc-Un-distrib:

shows A @@ (B ∪ C ) = A @@ B ∪ A @@ C and (A ∪ B ) @@ C = A @@ C ∪ B @@ C by auto

lemma conc-UNION-distrib:

shows A @@ UNION I M = UNION I (%i . A @@ M i ) and UNION I M @@ A = UNION I (%i . M i @@ A) by auto

1.2 A

n

lemma lang-pow-add : A ˆˆ (n + m) = A ˆˆ n @@ A ˆˆ m by (induct n) (auto simp: conc-assoc)

lemma lang-pow-empty: {} ˆˆ n = (if n = 0 then {[]} else {}) by (induct n) auto

lemma lang-pow-empty-Suc[simp]: ({}::0a lang) ˆˆ Suc n = {}

by (simp add : lang-pow-empty)

lemma length-lang-pow-ub:

ALL w : A. length w ≤ k =⇒ w : Aˆˆn =⇒ length w ≤ k ∗n by(induct n arbitrary: w ) (fastsimp simp: conc-def )+

lemma length-lang-pow-lb:

ALL w : A. length w ≥ k =⇒ w : Aˆˆn =⇒ length w ≥ k ∗n by(induct n arbitrary: w ) (fastsimp simp: conc-def )+

1.3 star

lemma star-if-lang-pow [simp]: w : A ˆˆ n =⇒ w : star A by (auto simp: star-def )

lemma Nil-in-star [iff ]: [] : star A proof (rule star-if-lang-pow )

show [] : A ˆˆ 0 by simp qed

lemma star-if-lang[simp]: assumes w : A shows w : star A proof (rule star-if-lang-pow )

show w : A ˆˆ 1 using hw : Ai by simp qed

lemma append-in-starI [simp]:

assumes u : star A and v : star A shows u@v : star A proof −

(4)

from hu : star Ai obtain m where u : A ˆˆ m by (auto simp: star-def ) moreover

from hv : star Ai obtain n where v : A ˆˆ n by (auto simp: star-def ) ultimately have u@v : A ˆˆ (m+n) by (simp add : lang-pow-add ) thus ?thesis by simp

qed

lemma conc-star-star : star A @@ star A = star A by (auto simp: conc-def )

lemma star-induct [consumes 1 , case-names Nil append , induct set : star ]:

assumes w : star A and P []

and step: !!u v . u : A =⇒ v : star A =⇒ P v =⇒ P (u@v ) shows P w

proof −

{ fix n have w : A ˆˆ n =⇒ P w

by (induct n arbitrary: w ) (auto intro: hP []istep star-if-lang-pow ) } with hw : star Aishow P w by (auto simp: star-def )

qed

lemma star-empty[simp]: star {} = {[]}

by (auto elim: star-induct )

lemma star-epsilon[simp]: star {[]} = {[]}

by (auto elim: star-induct )

lemma star-idemp[simp]: star (star A) = star A by (auto elim: star-induct )

lemma star-unfold-left : star A = A @@ star A ∪ {[]} (is ?L = ?R) proof

show ?L ⊆ ?R by (rule, erule star-induct ) auto qed auto

lemma concat-in-star : set ws ⊆ A =⇒ concat ws : star A by (induct ws) simp-all

lemma in-star-iff-concat :

w : star A = (EX ws. set ws ⊆ A & w = concat ws) (is - = (EX ws. ?R w ws))

proof

assume w : star A thus EX ws. ?R w ws proof induct

case Nil have ?R [] [] by simp thus ?case ..

next

case (append u v ) moreover

(5)

then obtain ws where set ws ⊆ A ∧ v = concat ws by blast ultimately have ?R (u@v ) (u#ws) by auto

thus ?case ..

qed next

assume EX us. ?R w us thus w : star A by (auto simp: concat-in-star )

qed

lemma star-conv-concat : star A = {concat ws|ws. set ws ⊆ A}

by (fastsimp simp: in-star-iff-concat )

lemma star-insert-eps[simp]: star (insert [] A) = star (A) proof −

{ fix us

have set us ⊆ insert [] A =⇒ EX vs. concat us = concat vs ∧ set vs ⊆ A (is ?P =⇒ EX vs. ?Q vs)

proof

let ?vs = filter (%u. u 6= []) us

show ?P =⇒ ?Q ?vs by (induct us) auto qed

} thus ?thesis by (auto simp: star-conv-concat ) qed

lemma Arden:

assumes [] /∈ A and X = A @@ X ∪ B shows X = star A @@ B

proof −

{ fix n have X = Aˆˆ(n+1 )@@X ∪ (S i ≤n. Aˆˆi @@B ) proof (induct n)

case 0 show ?case using hX = A @@ X ∪ Bi by simp next

case (Suc n)

have X = A@@X Un B by(rule assms(2 ))

also have . . . = A@@(Aˆˆ(n+1 )@@X ∪ (S i ≤n. Aˆˆi @@B )) Un B by(subst Suc)(rule refl )

also have . . . = Aˆˆ(n+2 )@@X ∪ (S i ≤n. Aˆˆ(i +1 )@@B ) Un B by(simp add :conc-UNION-distrib conc-assoc conc-Un-distrib)

also have . . . = Aˆˆ(n+2 )@@X ∪ (UN i : {1 ..n+1 }. Aˆˆi @@B ) ∪ B by(subst UN-le-add-shift )(rule refl )

also have . . . = Aˆˆ(n+2 )@@X ∪ (UN i : {1 ..n+1 }. Aˆˆi @@B ) ∪ Aˆˆ0 @@B

by(simp)

also have . . . = Aˆˆ(n+2 )@@X ∪ (S i ≤n+1 . Aˆˆi @@B ) by(auto simp: UN-le-eq-Un0 )

finally show ?case by simp qed

} note 1 = this { fix w assume w : X

(6)

let ?n = size w

from h[] /∈ Ai have ALL u : A. length u ≥ 1

by (metis Suc-eq-plus1 add-leD2 le-0-eq length-0-conv not-less-eq-eq) hence ALL u : Aˆˆ(?n+1 ). length u ≥ ?n+1

by (metis length-lang-pow-lb nat-mult-1 )

hence ALL u : Aˆˆ(?n+1 )@@X . length u ≥ ?n+1 by(auto simp only: conc-def length-append ) hence w /∈ Aˆˆ(?n+1 )@@X by auto

hence w : star A @@ B using hw : Xi 1 [of ?n]

by(auto simp add : star-def conc-UNION-distrib) } moreover

{ fix w assume w : star A @@ B

hence EX n. w : Aˆˆn @@ B by(auto simp: conc-def star-def ) hence w : X using 1 by blast

} ultimately show ?thesis by blast qed

1.4 deriv

lemma deriv-empty[simp]: deriv a {} = {}

and deriv-epsilon[simp]: deriv a {[]} = {}

and deriv-char [simp]: deriv a {[b]} = (if a = b then {[]} else {}) and deriv-union[simp]: deriv a (A ∪ B ) = deriv a A ∪ deriv a B by (auto simp: deriv-def )

lemma deriv-conc-subset :

deriv a A @@ B ⊆ deriv a (A @@ B ) (is ?L ⊆ ?R) proof

fix w assume w ∈ ?L

then obtain u v where w = u @ v a # u ∈ A v ∈ B by (auto simp: deriv-def )

then have a # w ∈ A @@ B

by (auto intro: concI [of a # u, simplified ]) thus w ∈ ?R by (auto simp: deriv-def ) qed

lemma deriv-conc1 : assumes [] /∈ A

shows deriv a (A @@ B ) = deriv a A @@ B (is ?L = ?R) proof

show ?L ⊆ ?R proof

fix w assume w ∈ ?L

then have a # w ∈ A @@ B by (simp add : deriv-def ) then obtain x y

where aw : a # w = x @ y x ∈ A y ∈ B by auto with h[] /∈ Ai obtain x0where x = a # x0

by (cases x ) auto

with aw have w = x0@ y x0∈ deriv a A

(7)

by (auto simp: deriv-def )

with hy ∈ Bishow w ∈ ?R by simp qed

show ?R ⊆ ?L by (fact deriv-conc-subset ) qed

lemma deriv-conc2 : assumes [] ∈ A

shows deriv a (A @@ B ) = deriv a A @@ B ∪ deriv a B (is ?L = ?R)

proof

show ?L ⊆ ?R proof

fix w assume w ∈ ?L

then have a # w ∈ A @@ B by (simp add : deriv-def ) then obtain x y

where aw : a # w = x @ y x ∈ A y ∈ B by auto show w ∈ ?R

proof (cases x ) case Nil

with aw have w ∈ deriv a B by (auto simp: deriv-def ) thus ?thesis ..

next

case (Cons b x0)

with aw have w = x0@ y x0∈ deriv a A by (auto simp: deriv-def )

with hy ∈ Bi show w ∈ ?R by simp qed

qed

from concI [OF h[] ∈ Ai, simplified ] have B ⊆ A @@ B ..

then have deriv a B ⊆ deriv a (A @@ B ) by (auto simp: deriv-def ) with deriv-conc-subset [of a A B ]

show ?R ⊆ ?L by auto qed

lemma wlog-no-eps:

assumes PB :VB . [] /∈ B =⇒ P B

assumes preserved : VA. P A =⇒ P (insert [] A) shows P A

proof −

let ?B = A − {[]}

have P ?B by (rule PB ) auto thus P A

proof cases assume [] ∈ A

then have (insert [] ?B ) = A by auto with preserved [OF hP ?Bi]

(8)

show ?thesis by simp qed auto

qed

lemma deriv-insert-eps[simp]:

deriv a (insert [] A) = deriv a A by (auto simp: deriv-def )

lemma deriv-star [simp]: deriv a (star A) = deriv a A @@ star A proof (induct A rule: wlog-no-eps)

fix B :: 0a list set assume [] /∈ B

thus deriv a (star B ) = deriv a B @@ star B by (subst star-unfold-left ) (simp add : deriv-conc1 ) qed auto

1.5 bisimilar

lemma equal-if-bisimilar :

assumes bisimilar K L shows K = L proof (rule set-eqI )

fix w

from hbisimilar K Li show w ∈ K ←→ w ∈ L proof (induct w arbitrary : K L)

case Nil thus ?case by (auto elim: bisimilar .cases) next

case (Cons a w K L)

from hbisimilar K Li have bisimilar (deriv a K ) (deriv a L) by (auto elim: bisimilar .cases)

then have w ∈ deriv a K ←→ w ∈ deriv a L by (rule Cons(1 )) thus ?case by (auto simp: deriv-def )

qed qed

lemma language-coinduct : fixes R (infixl ∼ 50 ) assumes K ∼ L

assumes VK L. K ∼ L =⇒ ([] ∈ K ←→ [] ∈ L) assumes VK L x . K ∼ L =⇒ deriv x K ∼ deriv x L shows K = L

apply (rule equal-if-bisimilar )

apply (rule bisimilar .coinduct [of R, OF hK ∼ Li]) apply (auto simp: assms)

done end

(9)

2 Regular expressions

theory Regular-Exp imports Regular-Set begin

datatype 0a rexp = Zero |

One | Atom 0a |

Plus (0a rexp) (0a rexp) | Times (0a rexp) (0a rexp) | Star (0a rexp)

primrec lang :: 0a rexp => 0a list set where lang Zero = {} |

lang One = {[]} | lang (Atom a) = {[a]} |

lang (Plus r s) = (lang r ) Un (lang s) | lang (Times r s) = conc (lang r ) (lang s) | lang (Star r ) = star (lang r )

primrec atoms :: 0a rexp ⇒ 0a set where

atoms Zero = {} | atoms One = {} | atoms (Atom a) = {a} |

atoms (Plus r s) = atoms r ∪ atoms s | atoms (Times r s) = atoms r ∪ atoms s | atoms (Star r ) = atoms r

end

3 Deciding Regular Expression Equivalence

theory Equivalence-Checking

imports Regular-Exp While-Combinator begin

This theory is based on work by Jan Rutten [1].

3.1 Term ordering

fun le-rexp :: nat rexp ⇒ nat rexp ⇒ bool where

le-rexp Zero - = True

| le-rexp - Zero = False

| le-rexp One - = True

(10)

| le-rexp - One = False

| le-rexp (Atom a) (Atom b) = (a <= b)

| le-rexp (Atom -) - = True

| le-rexp - (Atom -) = False

| le-rexp (Star r ) (Star s) = le-rexp r s

| le-rexp (Star -) - = True

| le-rexp - (Star -) = False

| le-rexp (Plus r r0) (Plus s s0) =

(if r = s then le-rexp r0s0else le-rexp r s)

| le-rexp (Plus - -) - = True

| le-rexp - (Plus - -) = False

| le-rexp (Times r r0) (Times s s0) =

(if r = s then le-rexp r0s0else le-rexp r s)

3.2 Normalizing operations

associativity, commutativity, idempotence, zero

fun nPlus :: nat rexp ⇒ nat rexp ⇒ nat rexp where

nPlus Zero r = r

| nPlus r Zero = r

| nPlus (Plus r s) t = nPlus r (nPlus s t )

| nPlus r (Plus s t ) = (if r = s then (Plus s t )

else if le-rexp r s then Plus r (Plus s t ) else Plus s (nPlus r t ))

| nPlus r s = (if r = s then r

else if le-rexp r s then Plus r s else Plus s r )

lemma lang-nPlus[simp]: lang (nPlus r s) = lang (Plus r s) by (induct r s rule: nPlus.induct ) auto

associativity, zero, one

fun nTimes :: nat rexp ⇒ nat rexp ⇒ nat rexp where

nTimes Zero - = Zero

| nTimes - Zero = Zero

| nTimes One r = r

| nTimes r One = r

| nTimes (Times r s) t = Times r (nTimes s t )

| nTimes r s = Times r s

lemma lang-nTimes[simp]: lang (nTimes r s) = lang (Times r s) by (induct r s rule: nTimes.induct ) (auto simp: conc-assoc) primrec norm :: nat rexp ⇒ nat rexp

where

(11)

norm Zero = Zero

| norm One = One

| norm (Atom a) = Atom a

| norm (Plus r s) = nPlus (norm r ) (norm s)

| norm (Times r s) = nTimes (norm r ) (norm s)

| norm (Star r ) = Star (norm r )

lemma lang-norm[simp]: lang (norm r ) = lang r by (induct r ) auto

3.3 Finality and Derivative

primrec final :: 0a rexp ⇒ bool where

final Zero = False

| final One = True

| final (Atom -) = False

| final (Plus r s) = (final r ∨ final s)

| final (Times r s) = (final r ∧ final s)

| final (Star -) = True

lemma lang-final : final r = ([] ∈ lang r ) by (induct r ) (auto simp: conc-def )

primrec ederiv :: nat ⇒ nat rexp ⇒ nat rexp where

ederiv - Zero = Zero

| ederiv - One = Zero

| ederiv a (Atom b) = (if a = b then One else Zero)

| ederiv a (Plus r s) = nPlus (ederiv a r ) (ederiv a s)

| ederiv a (Times r s) =

(let r0s = nTimes (ederiv a r ) s

in if final r then nPlus r0s (ederiv a s) else r0s)

| ederiv a (Star r ) = nTimes (ederiv a r ) (Star r ) lemma lang-ederiv : lang (ederiv a r ) = deriv a (lang r )

by (induct r ) (auto simp: Let-def deriv-conc1 deriv-conc2 lang-final ) lemma deriv-no-occurrence:

x /∈ atoms r =⇒ ederiv x r = Zero by (induct r ) auto

lemma atoms-nPlus[simp]: atoms (nPlus r s) = atoms r ∪ atoms s by (induct r s rule: nPlus.induct ) auto

lemma atoms-nTimes: atoms (nTimes r s) ⊆ atoms r ∪ atoms s by (induct r s rule: nTimes.induct ) auto

lemma atoms-norm: atoms (norm r ) ⊆ atoms r

(12)

by (induct r ) (auto dest !:subsetD [OF atoms-nTimes]) lemma atoms-ederiv : atoms (ederiv a r ) ⊆ atoms r

by (induct r ) (auto simp: Let-def dest !:subsetD [OF atoms-nTimes])

3.4 Bisimulation between regular expressions

types rexp-pair = nat rexp ∗ nat rexp types rexp-pairs = rexp-pair list definition is-bisimulation ::

nat list ⇒ rexp-pairs ⇒ bool where

is-bisimulation as ps =

(∀ (r ,s)∈ set ps. (atoms r ∪ atoms s ⊆ set as) ∧ (final r ←→ final s) ∧ (∀ a∈set as. (ederiv a r , ederiv a s) ∈ set ps))

lemma bisim-lang-eq:

assumes bisim: is-bisimulation as ps assumes (r , s) ∈ set ps

shows lang r = lang s proof −

def ps0≡ (Zero, Zero) # ps

from bisim have bisim0: is-bisimulation as ps0 by (auto simp: ps0-def is-bisimulation-def )

let ?R = λK L. (∃ (r ,s)∈set ps0. K = lang r ∧ L = lang s) show ?thesis

proof (rule language-coinduct [where R=?R]) from h(r , s) ∈ set psi

have (r , s) ∈ set ps0by (auto simp: ps0-def ) thus ?R (lang r ) (lang s) by auto

next

fix K L assume ?R K L

then obtain r s where rs: (r , s) ∈ set ps0 and KL: K = lang r L = lang s by auto with bisim0have final r ←→ final s

by (auto simp: is-bisimulation-def )

thus [] ∈ K ←→ [] ∈ L by (auto simp: lang-final KL) fix a

show ?R (deriv a K ) (deriv a L) proof cases

assume a ∈ set as with rs bisim0

have (ederiv a r , ederiv a s) ∈ set ps0 by (auto simp: is-bisimulation-def )

thus ?thesis by (force simp: KL lang-ederiv ) next

assume a /∈ set as

(13)

with bisim0rs

have a /∈ atoms r a /∈ atoms s by (auto simp: is-bisimulation-def ) then have ederiv a r = Zero ederiv a s = Zero

by (auto intro: deriv-no-occurrence) then have deriv a K = lang Zero

deriv a L = lang Zero

unfolding KL lang-ederiv [symmetric] by auto thus ?thesis by (auto simp: ps0-def )

qed qed qed

3.5 Closure computation

fun test :: rexp-pairs ∗ rexp-pairs ⇒ bool

where test (ws, ps) = (case ws of [] ⇒ False | (p,q)#- ⇒ final p = final q) fun step :: nat list ⇒ rexp-pairs ∗ rexp-pairs ⇒ rexp-pairs ∗ rexp-pairs where step as (ws,ps) =

(let

(r , s) = hd ws;

ps0= (r , s) # ps;

succs = map (λa. (ederiv a r , ederiv a s)) as;

new = filter (λp. p /∈ set ps0∪ set ws) succs in (new @ tl ws, ps0))

definition closure ::

nat list ⇒ rexp-pairs ∗ rexp-pairs

⇒ (rexp-pairs ∗ rexp-pairs) option where closure as = while-option test (step as)

definition pre-bisim :: nat list ⇒ nat rexp ⇒ nat rexp ⇒ rexp-pairs ∗ rexp-pairs ⇒ bool

where

pre-bisim as r s = (λ(ws,ps).

((r , s) ∈ set ws ∪ set ps) ∧

(∀ (r ,s)∈ set ws ∪ set ps. atoms r ∪ atoms s ⊆ set as) ∧ (∀ (r ,s)∈ set ps. (final r ←→ final s) ∧

(∀ a∈set as. (ederiv a r , ederiv a s) ∈ set ps ∪ set ws))) theorem closure-sound :

assumes result : closure as ([(r ,s)],[]) = Some([],ps) and atoms: atoms r ∪ atoms s ⊆ set as

shows lang r = lang s proof −

{ fix st have pre-bisim as r s st =⇒ test st =⇒ pre-bisim as r s (step as st ) unfolding pre-bisim-def

by (cases st ) (auto simp: split-def split : list .splits prod .splits dest !: subsetD [OF atoms-ederiv ]) }

(14)

moreover from atoms

have pre-bisim as r s ([(r ,s)],[]) by (simp add : pre-bisim-def ) ultimately have pre-bisim-ps: pre-bisim as r s ([],ps)

by (rule while-option-rule[OF - result [unfolded closure-def ]]) then have is-bisimulation as ps (r , s) ∈ set ps

by (auto simp: pre-bisim-def is-bisimulation-def test-def ) thus lang r = lang s by (rule bisim-lang-eq )

qed

3.6 The overall procedure

primrec add-atoms :: nat rexp ⇒ nat list ⇒ nat list where

add-atoms Zero = id

| add-atoms One = id

| add-atoms (Atom a) = List .insert a

| add-atoms (Plus r s) = add-atoms s o add-atoms r

| add-atoms (Times r s) = add-atoms s o add-atoms r

| add-atoms (Star r ) = add-atoms r

lemma set-add-atoms: set (add-atoms r as) = atoms r ∪ set as by (induct r arbitrary: as) auto

definition check-eqv :: nat rexp ⇒ nat rexp ⇒ bool where

check-eqv r s =

(case closure (add-atoms r (add-atoms s [])) ([(norm r , norm s)], []) of Some([],-) ⇒ True | - ⇒ False)

lemma soundness:

assumes check-eqv r s shows lang r = lang s proof −

let ?as = add-atoms r (add-atoms s [])

obtain ps where 1 : closure ?as ([(norm r ,norm s)],[]) = Some([],ps) using assms by (auto simp: check-eqv-def split :option.splits list .splits) then have lang (norm r ) = lang (norm s)

by (rule closure-sound ) (auto simp: set-add-atoms dest !: subsetD [OF atoms-norm]) thus lang r = lang s by simp

qed

lemma check-eqv (Plus One (Times (Atom 0 ) (Star (Atom 0 )))) (Star (Atom 0 )) by eval

end

(15)

4 Regular Expressions as Homogeneous Binary Re- lations

theory Relation-Interpretation imports Regular-Exp

begin

primrec rel :: (0a ⇒ (0b ∗ 0b) set ) ⇒ 0a rexp ⇒ (0b ∗ 0b) set where

rel v Zero = {} | rel v One = Id | rel v (Atom a) = v a |

rel v (Plus r s) = rel v r ∪ rel v s | rel v (Times r s) = rel v r O rel v s | rel v (Star r ) = (rel v r )ˆ∗

primrec word-rel :: (0a ⇒ (0b ∗ 0b) set ) ⇒ 0a list ⇒ (0b ∗ 0b) set where

word-rel v [] = Id

| word-rel v (a#as) = v a O word-rel v as lemma word-rel-append :

word-rel v w O word-rel v w0= word-rel v (w @ w0) by (rule sym) (induct w , auto)

lemma rel-word-rel : rel v r = (S w ∈lang r . word-rel v w ) proof (induct r )

case Times thus ?case

by (auto simp: rel-def word-rel-append conc-def rel-comp-UNION-distrib rel-comp-UNION-distrib2 ) next

case (Star r ) { fix n

have (rel v r ) ˆˆ n = (S w ∈ lang r ˆˆ n. word-rel v w ) proof (induct n)

case 0 show ?case by simp next

case (Suc n) thus ?case

unfolding relpow .simps rel-pow-commute[symmetric]

by (auto simp add : Star conc-def word-rel-append rel-comp-UNION-distrib rel-comp-UNION-distrib2 ) qed }

thus ?case unfolding rel .simps

by (force simp: rtrancl-power star-def ) qed auto

Soundness:

lemma soundness:

lang r = lang s =⇒ rel v r = rel v s

(16)

unfolding rel-word-rel by auto end

5 Proving Relation (In)equalities via Regular Ex- pressions

theory Regexp-Method

imports Equivalence-Checking Relation-Interpretation Reflection begin

primrec rel-of-regexp :: (0a ∗ 0a) set list ⇒ nat rexp ⇒ (0a ∗ 0a) set where rel-of-regexp vs Zero = {} |

rel-of-regexp vs One = Id |

rel-of-regexp vs (Atom i ) = vs ! i |

rel-of-regexp vs (Plus r s) = rel-of-regexp vs r ∪ rel-of-regexp vs s | rel-of-regexp vs (Times r s) = rel-of-regexp vs r O rel-of-regexp vs s | rel-of-regexp vs (Star r ) = (rel-of-regexp vs r )ˆ∗

lemma rel-of-regexp-rel : rel-of-regexp vs r = rel (λi . vs ! i ) r by (induct r ) auto

primrec rel-eq where

rel-eq (r , s) vs = (rel-of-regexp vs r = rel-of-regexp vs s) lemma rel-eqI : check-eqv r s =⇒ rel-eq (r , s) vs

unfolding rel-eq.simps rel-of-regexp-rel by (rule Relation-Interpretation.soundness)

(rule Equivalence-Checking.soundness)

lemmas regexp-reify = rel-of-regexp.simps rel-eq .simps lemmas regexp-unfold = trancl-unfold-left subset-Un-eq method-setup regexp = hh

let

val regexp-conv = Code-Runtime.static-holds-conv @{theory}

[@{const-name Zero}, @{const-name One}, @{const-name Atom}, @{const-name Plus},

@{const-name Times}, @{const-name Star },

@{const-name check-eqv }, @{const-name Trueprop}]

in

Scan.succeed (fn ctxt =>

SIMPLE-METHOD0(

(K (TRY (Local-Defs.unfold-tac ctxt @{thms regexp-unfold })) THEN0Reflection.genreify-tac ctxt

@{thms regexp-reify} NONE THEN0rtac @{thm rel-eqI }

THEN0CONVERSION (Conv .params-conv (1 )

(17)

(K (Conv .concl-conv (1 ) regexp-conv )) ctxt ) THEN0rtac TrueI )))

end ii

Decides relation equalities via regular expressions

Example:

lemma (r ∪ sˆ+)ˆ∗ = (r ∪ s)ˆ∗

by regexp end

References

[1] J. J. M. M. Rutten. Automata and coinduction (an exercise in coal-

gebra). In D. Sangiorgi and R. de Simone, editors, Concurrency The-

ory (CONCUR’98), volume 1466 of Lecture Notes in Computer Science,

pages 194–218. Springer, 1998.

References

Related documents

_Courteous__and _drenched_ are connected because a courteous person will share his umbrella so someone doesn’t

Bakalárska práca s názvom Riešenie úprav navrhnutého interiéru vybraného prostredia s použitím systému DAEX sa zaoberá vytvorením kuchynskej zostavy v

If the model predicted within ± 10% of observed loads the model coef fi cients were accepted as tested and validated for that catchment and were then applied using the same

Table 1: Yields (g) of insoluble cell wall and solubilised WEAX (water extractable arabinoxylan), and calculated solubilised WEBG (water extractable β -glucan) for wheat, rye

First, the merger could lead to input foreclosure, by which the upstream division of the merged firm refuses to sell, degrades quality, or raises the input prices charged to

Úvod praktické části je věnován představení společnosti, jež se stala předmětem následného průzkumu. Metodou tohoto průzkumu bylo zvoleno dotazníkové šetření

 The Human Development Index considers the economic dimension (lately not GDP but Gross national income) and is used as a better measure of social progress, than the

A Plain Old Java Object (POJO) acronym is used to emphasize that a given object is an ordinary Java Object, and not a special object. With regard to POJOs list specifically the