Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
Rick Smetsers
z3gi
Commits
450a8c2e
Commit
450a8c2e
authored
Jul 03, 2017
by
Rick Smetsers
Browse files
DFA encoding
parent
49f05eb4
Changes
2
Hide whitespace changes
Inline
Side-by-side
z3gi/define/fa.py
View file @
450a8c2e
...
@@ -41,6 +41,15 @@ class MealyMachine(FSM):
...
@@ -41,6 +41,15 @@ class MealyMachine(FSM):
mealy
=
builder
.
build_mealy
(
model
)
mealy
=
builder
.
build_mealy
(
model
)
return
mealy
return
mealy
class
Mapper
(
object
):
def
__init__
(
self
,
fa
):
self
.
Element
=
z3
.
DeclareSort
(
'Element'
)
self
.
start
=
self
.
element
(
0
)
self
.
map
=
z3
.
Function
(
'map'
,
self
.
Element
,
fa
.
Location
)
def
element
(
self
,
name
):
return
z3
.
Const
(
"n"
+
str
(
name
),
self
.
Element
)
class
MealyMachineBuilder
(
object
):
class
MealyMachineBuilder
(
object
):
def
__init__
(
self
,
mm
:
MealyMachine
):
def
__init__
(
self
,
mm
:
MealyMachine
):
...
...
z3gi/encode/fa.py
View file @
450a8c2e
import
itertools
import
itertools
from
define.fa
import
DFA
,
MealyMachine
,
Mapper
from
encode
import
Encoder
from
encode
import
Encoder
from
utils
import
Tree
from
utils
import
Tree
from
model.fa
import
MealyMachine
from
model.fa
import
MealyMachine
import
z3
import
z3
class
DFAEncoder
(
Encoder
):
def
__init__
(
self
,
labels
):
self
.
tree
=
Tree
(
itertools
.
count
(
0
))
self
.
cache
=
{}
self
.
labels
=
set
()
def
add
(
self
,
trace
):
seq
,
accept
=
trace
node
=
self
.
tree
[
seq
]
self
.
cache
[
node
]
=
accept
self
.
labels
.
update
(
seq
)
def
build
(
self
,
num_states
):
dfa
=
DFA
(
self
.
labels
,
num_states
)
mapper
=
Mapper
(
dfa
)
constraints
=
self
.
axioms
(
dfa
,
mapper
)
constraints
+=
self
.
node_constraints
(
dfa
,
mapper
)
constraints
+=
self
.
transition_constraints
(
dfa
,
mapper
)
return
dfa
,
constraints
def
axioms
(
self
,
dfa
:
DFA
,
mapper
:
Mapper
):
return
[]
def
node_constraints
(
self
,
dfa
,
mapper
):
constraints
=
[]
for
node
,
accept
in
self
.
cache
:
n
=
mapper
.
element
(
node
.
id
)
constraints
.
append
(
dfa
.
output
(
mapper
.
map
(
n
))
==
accept
)
return
constraints
def
transition_constraints
(
self
,
dfa
,
mapper
):
constraints
=
[
dfa
.
start
==
mapper
.
map
(
mapper
.
start
)]
for
node
,
label
,
child
in
self
.
tree
.
transitions
():
n
=
mapper
.
element
(
node
.
id
)
l
=
dfa
.
labels
[
label
]
c
=
mapper
.
element
(
child
.
id
)
constraints
.
append
(
dfa
.
transition
(
mapper
.
map
(
n
),
l
)
==
mapper
.
map
(
c
))
return
constraints
class
MealyEncoder
(
Encoder
):
class
MealyEncoder
(
Encoder
):
def
__init__
(
self
,
input_labels
,
output_labels
):
def
__init__
(
self
,
input_labels
,
output_labels
):
self
.
tree
=
Tree
(
itertools
.
count
(
0
))
self
.
tree
=
Tree
(
itertools
.
count
(
0
))
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment