Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
libcaml-grew
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
3
Issues
3
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
Operations
Operations
Incidents
Packages & Registries
Packages & Registries
Container Registry
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
grew
libcaml-grew
Commits
645e0bae
Commit
645e0bae
authored
Jul 12, 2017
by
Bruno Guillaume
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
New strategies
parent
0d7a7dcb
Changes
10
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
310 additions
and
30 deletions
+310
-30
src/grew_ast.ml
src/grew_ast.ml
+0
-2
src/grew_ast.mli
src/grew_ast.mli
+0
-2
src/grew_grs.ml
src/grew_grs.ml
+213
-3
src/grew_grs.mli
src/grew_grs.mli
+2
-0
src/grew_lexer.mll
src/grew_lexer.mll
+2
-2
src/grew_parser.mly
src/grew_parser.mly
+3
-3
src/grew_rule.ml
src/grew_rule.ml
+73
-16
src/grew_rule.mli
src/grew_rule.mli
+12
-2
src/libgrew.ml
src/libgrew.ml
+4
-0
src/libgrew.mli
src/libgrew.mli
+1
-0
No files found.
src/grew_ast.ml
View file @
645e0bae
...
...
@@ -483,9 +483,7 @@ module New_ast = struct
|
Iter
of
strat
(* a strategy to apply iteratively *)
|
If
of
strat
*
strat
*
strat
(* choose a stragegy with a test *)
(* syntactic sugar *)
|
Empty
(* ≜ Seq [] *)
|
Try
of
strat
(* ≜ If (S, S, Empty): pick one normal form a the given strategy; return input if nf *)
|
Rules
of
Ast
.
node_ident
(* ≜ Alt (rules defined in the top level of the package with the given name *)
type
decl
=
|
Features
of
Ast
.
feature_spec
list
...
...
src/grew_ast.mli
View file @
645e0bae
...
...
@@ -254,9 +254,7 @@ module New_ast : sig
|
Iter
of
strat
(* a strategy to apply iteratively *)
|
If
of
strat
*
strat
*
strat
(* choose a stragegy with a test *)
(* syntactic sugar *)
|
Empty
(* ≜ Seq [] *)
|
Try
of
strat
(* ≜ If (S, S, Empty): pick one normal form a the given strategy; return input if nf *)
|
Rules
of
Ast
.
node_ident
(* ≜ Alt (rules defined in the top level of the package with the given name *)
type
decl
=
|
Features
of
Ast
.
feature_spec
list
...
...
src/grew_grs.ml
View file @
645e0bae
...
...
@@ -324,7 +324,7 @@ module Grs = struct
let
modul
=
try
List
.
find
(
fun
m
->
m
.
Modul
.
name
=
name
)
grs
.
modules
with
Not_found
->
Error
.
build
"No module or strategy named '%s'"
name
in
Rule
.
conf_one_step
?
domain
:
grs
.
domain
name
inst
modul
.
Modul
.
rules
Rule
.
conf_one_step
?
domain
:
grs
.
domain
inst
modul
.
Modul
.
rules
end
(* Union of strategies *)
|
Ast
.
Plus
[]
->
None
(* the list can be empty in a recursive call! *)
...
...
@@ -378,7 +378,7 @@ module Grs = struct
let
modul
=
try
List
.
find
(
fun
m
->
m
.
Modul
.
name
=
name
)
grs
.
modules
with
Not_found
->
Error
.
build
"No module or strategy named '%s'"
name
in
Rule
.
one_step
?
domain
:
grs
.
domain
name
inst
modul
.
Modul
.
rules
Rule
.
one_step
?
domain
:
grs
.
domain
inst
modul
.
Modul
.
rules
end
(* Union of strategies *)
|
Ast
.
Plus
strat_list
->
...
...
@@ -514,7 +514,7 @@ module Grs = struct
begin
printf
"%s one_step (module=%s)...%!"
(
String
.
make
(
2
*
(
max
0
!
indent
))
'
'
)
modul
.
Modul
.
name
;
let
domain
=
get_domain
grs
in
match
Instance_set
.
elements
(
Rule
.
one_step
?
domain
modul
.
Modul
.
name
instance
modul
.
Modul
.
rules
)
with
match
Instance_set
.
elements
(
Rule
.
one_step
?
domain
instance
modul
.
Modul
.
rules
)
with
|
[]
->
printf
"0
\n
%!"
;
let
res
=
Libgrew_types
.
Empty
in
decr
indent
;
res
|
instance_list
->
printf
"%d
\n
%!"
(
List
.
length
instance_list
);
Libgrew_types
.
Node
...
...
@@ -589,6 +589,28 @@ module Grs = struct
end
(* module Grs *)
module
New_grs
=
struct
type
decl
=
...
...
@@ -596,6 +618,7 @@ module New_grs = struct
|
Strategy
of
string
*
New_ast
.
strat
|
Package
of
string
*
decl
list
type
t
=
{
filename
:
string
;
domain
:
Domain
.
t
option
;
...
...
@@ -668,4 +691,191 @@ module New_grs = struct
domain
;
decls
;
}
(* The type [pointed] is a zipper style data structure for resolving names x.y.z *)
type
pointed
=
|
Top
of
decl
list
|
Pack
of
(
decl
list
*
pointed
)
(* (content, mother package) *)
let
top
grs
=
Top
grs
.
decls
let
decl_list
=
function
|
Top
dl
->
dl
|
Pack
(
dl
,
_
)
->
dl
let
down
pointed
name
=
let
rec
loop
=
function
|
[]
->
None
|
Package
(
n
,
dl
)
::
_
when
n
=
name
->
Some
(
Pack
(
dl
,
pointed
))
|
_
::
t
->
loop
t
in
loop
(
decl_list
pointed
)
(* search for a decl named [name] defined in the working directory [wd] in [grs] *)
let
rec
search_at
pointed
path
=
match
path
with
|
[]
->
None
|
[
one
]
->
(
try
let
item
=
List
.
find
(* ?? rule and strategy with the same name ?? *)
(
function
|
Strategy
(
s
,_
)
when
s
=
one
->
true
|
Rule
r
when
Rule
.
get_name
r
=
one
->
true
|
Package
(
p
,_
)
when
p
=
one
->
true
|
_
->
false
)
(
decl_list
pointed
)
in
Some
(
item
,
pointed
)
with
Not_found
->
None
)
|
head
::
tail
->
match
down
pointed
head
with
|
None
->
None
|
Some
new_p
->
search_at
new_p
tail
(* search for the path in current location and recursively on mother structure *)
let
rec
search_from
pointed
path
=
match
search_at
pointed
path
with
|
Some
r_or_s
->
Some
r_or_s
|
None
->
(
match
pointed
with
|
Top
_
->
None
|
Pack
(
_
,
mother
)
->
search_from
mother
path
)
let
rec
intern_simple_rewrite
pointed
strat_name
instance
=
let
path
=
Str
.
split
(
Str
.
regexp
"
\\
."
)
strat_name
in
match
search_from
pointed
path
with
|
None
->
Error
.
build
"Simple rewrite, cannot find strat %s"
strat_name
|
Some
(
Rule
r
,_
)
->
Rule
.
apply
r
instance
|
Some
(
Package
(
_
,
decl_list
)
,
_
)
->
pack_rewrite
decl_list
instance
|
Some
(
Strategy
(
_
,
ast_strat
)
,
new_pointed
)
->
strat_simple_rewrite
new_pointed
ast_strat
instance
and
det_intern_simple_rewrite
pointed
strat_name
instance
=
let
path
=
Str
.
split
(
Str
.
regexp
"
\\
."
)
strat_name
in
match
search_from
pointed
path
with
|
None
->
Error
.
build
"Simple rewrite, cannot find strat %s"
strat_name
|
Some
(
Rule
r
,_
)
->
Rule
.
det_apply
r
instance
|
Some
(
Package
(
_
,
decl_list
)
,
_
)
->
det_pack_rewrite
decl_list
instance
|
Some
(
Strategy
(
_
,
ast_strat
)
,
new_pointed
)
->
det_strat_simple_rewrite
new_pointed
ast_strat
instance
and
pack_rewrite
decl_list
instance
=
List
.
fold_left
(
fun
acc
decl
->
match
decl
with
|
Rule
r
->
Instance_set
.
union
acc
(
Rule
.
apply
r
instance
)
|
_
->
acc
)
Instance_set
.
empty
decl_list
and
det_pack_rewrite
decl_list
instance
=
let
rec
loop
=
function
|
[]
->
None
|
Rule
r
::
tail_decl
->
(
match
Rule
.
det_apply
r
instance
with
|
None
->
loop
tail_decl
|
Some
x
->
Some
x
)
|
_
::
tail_decl
->
loop
tail_decl
in
loop
decl_list
and
strat_simple_rewrite
pointed
strat
instance
=
match
strat
with
|
New_ast
.
Ref
subname
->
intern_simple_rewrite
pointed
subname
instance
|
New_ast
.
Pick
strat
->
begin
match
det_strat_simple_rewrite
pointed
strat
instance
with
|
None
->
Grew_rule
.
Instance_set
.
empty
|
Some
x
->
Instance_set
.
singleton
x
end
|
New_ast
.
Alt
[]
->
Grew_rule
.
Instance_set
.
empty
|
New_ast
.
Alt
strat_list
->
List
.
fold_left
(
fun
acc
strat
->
Instance_set
.
union
acc
(
strat_simple_rewrite
pointed
strat
instance
)
)
Instance_set
.
empty
strat_list
|
New_ast
.
Seq
[]
->
Instance_set
.
singleton
instance
|
New_ast
.
Seq
(
head_strat
::
tail_strat
)
->
let
first_strat
=
strat_simple_rewrite
pointed
head_strat
instance
in
Instance_set
.
fold
(
fun
instance
acc
->
Instance_set
.
union
acc
(
strat_simple_rewrite
pointed
(
New_ast
.
Seq
tail_strat
)
instance
)
)
first_strat
Instance_set
.
empty
|
New_ast
.
Iter
strat
->
let
one_step
=
strat_simple_rewrite
pointed
strat
instance
in
if
Instance_set
.
is_empty
one_step
then
Instance_set
.
singleton
instance
else
Instance_set
.
fold
(
fun
instance
acc
->
Instance_set
.
union
acc
(
strat_simple_rewrite
pointed
(
New_ast
.
Iter
strat
)
instance
)
)
one_step
Instance_set
.
empty
|
New_ast
.
Try
strat
->
begin
let
one_step
=
strat_simple_rewrite
pointed
strat
instance
in
if
Instance_set
.
is_empty
one_step
then
Instance_set
.
singleton
instance
else
one_step
end
|
New_ast
.
If
(
s
,
s1
,
s2
)
->
begin
match
det_strat_simple_rewrite
pointed
s
instance
with
|
None
->
strat_simple_rewrite
pointed
s1
instance
|
Some
_
->
strat_simple_rewrite
pointed
s2
instance
end
and
det_strat_simple_rewrite
pointed
strat
instance
=
match
strat
with
|
New_ast
.
Ref
subname
->
det_intern_simple_rewrite
pointed
subname
instance
|
New_ast
.
Pick
strat
->
det_strat_simple_rewrite
pointed
strat
instance
|
New_ast
.
Alt
[]
->
None
|
New_ast
.
Alt
strat_list
->
let
rec
loop
=
function
|
[]
->
None
|
head_strat
::
tail_strat
->
match
det_strat_simple_rewrite
pointed
head_strat
instance
with
|
None
->
loop
tail_strat
|
Some
x
->
Some
x
in
loop
strat_list
|
New_ast
.
Seq
[]
->
Some
instance
|
New_ast
.
Seq
(
head_strat
::
tail_strat
)
->
begin
match
det_strat_simple_rewrite
pointed
head_strat
instance
with
|
None
->
None
|
Some
inst
->
det_strat_simple_rewrite
pointed
(
New_ast
.
Seq
tail_strat
)
inst
end
|
New_ast
.
Iter
strat
->
begin
match
det_strat_simple_rewrite
pointed
strat
instance
with
|
None
->
Some
instance
|
Some
inst
->
det_strat_simple_rewrite
pointed
(
New_ast
.
Iter
strat
)
inst
end
|
New_ast
.
Try
strat
->
begin
match
det_strat_simple_rewrite
pointed
strat
instance
with
|
None
->
Some
instance
|
Some
i
->
Some
i
end
|
New_ast
.
If
(
s
,
s1
,
s2
)
->
begin
match
det_strat_simple_rewrite
pointed
s
instance
with
|
None
->
det_strat_simple_rewrite
pointed
s1
instance
|
Some
_
->
det_strat_simple_rewrite
pointed
s2
instance
end
let
simple_rewrite
grs
name
graph
=
let
instance
=
Instance
.
from_graph
graph
in
let
set
=
intern_simple_rewrite
(
top
grs
)
name
instance
in
List
.
map
(
fun
inst
->
inst
.
Instance
.
graph
)
(
Instance_set
.
elements
set
)
end
src/grew_grs.mli
View file @
645e0bae
...
...
@@ -121,4 +121,6 @@ module New_grs : sig
val
dump
:
t
->
unit
val
domain
:
t
->
Domain
.
t
option
val
simple_rewrite
:
t
->
string
->
G_graph
.
t
->
G_graph
.
t
list
end
\ No newline at end of file
src/grew_lexer.mll
View file @
645e0bae
...
...
@@ -188,9 +188,9 @@ and standard target = parse
|
"Seq"
{
SEQ
}
|
"Iter"
{
ITER
}
|
"If"
{
IF
}
|
"Empty"
{
EMPTY
}
|
"Try"
{
TRY
}
|
"Rules"
{
RULES
}
|
"Emty"
{
EMPTY
}
|
"Onf"
{
ONF
}
|
"graph"
{
GRAPH
}
...
...
src/grew_parser.mly
View file @
645e0bae
...
...
@@ -101,9 +101,9 @@ let localize t = (t,get_loc ())
%
token
SEQ
/*
Seq
*/
%
token
ITER
/*
Iter
*/
%
token
IF
/*
If
*/
%
token
ONF
/*
Onf
*/
%
token
EMPTY
/*
Empty
*/
%
token
TRY
/*
Try
*/
%
token
RULES
/*
Rules
*/
%
token
<
string
>
DOLLAR_ID
/*
$
id
*/
%
token
<
string
>
AROBAS_ID
/*
@
id
*/
...
...
@@ -769,7 +769,7 @@ strat_desc:
|
SEQ
LPAREN
sl
=
separated_list_final_opt
(
COMA
,
strat_desc
)
RPAREN
{
New_ast
.
Seq
sl
}
|
ITER
LPAREN
s
=
strat_desc
RPAREN
{
New_ast
.
Iter
s
}
|
IF
LPAREN
s1
=
strat_desc
COMA
s2
=
strat_desc
COMA
s3
=
strat_desc
RPAREN
{
New_ast
.
If
(
s1
,
s2
,
s3
)
}
|
EMPTY
{
New_ast
.
Empty
}
|
TRY
LPAREN
s
=
strat_desc
RPAREN
{
New_ast
.
Try
s
}
|
RULES
LPAREN
id
=
node_id
RPAREN
{
New_ast
.
Rules
id
}
|
ONF
LPAREN
s
=
strat_desc
RPAREN
{
New_ast
.
Pick
(
New_ast
.
Iter
s
)
}
|
EMPTY
{
New_ast
.
Seq
[]
}
%%
src/grew_rule.ml
View file @
645e0bae
...
...
@@ -1064,7 +1064,7 @@ module Rule = struct
(* ---------------------------------------------------------------------- *)
(** [apply_rule instance matching rule] returns a new instance after the application of the rule *)
let
apply_rule
?
domain
modul_name
instance
matching
rule
=
let
apply_rule
?
domain
instance
matching
rule
=
(* Timeout check *)
(
try
Timeout
.
check
()
with
Timeout
.
Stop
->
Error
.
run
"Time out"
);
...
...
@@ -1155,37 +1155,41 @@ module Rule = struct
List
.
map
fst
filtered_matching_list
(* ---------------------------------------------------------------------- *)
(** [one_step ?domain
modul_name
instance rules] computes the list of one-step reduct with rules *)
let
one_step
?
domain
modul_name
instance
rules
=
(** [one_step ?domain instance rules] computes the list of one-step reduct with rules *)
let
one_step
?
domain
instance
rules
=
(* limit the rewriting depth to avoid looping rewriting *)
if
List
.
length
instance
.
Instance
.
rules
>=
!
max_depth_non_det
then
if
!
debug_loop
then
Instance_set
.
empty
else
Error
.
run
"
[Module %s]
max depth %d reached, last rules applied: …, %s"
modul_name
!
max_depth_non_det
(
List_
.
rev_to_string
(
fun
x
->
x
)
", "
(
List_
.
cut
5
instance
.
Instance
.
rules
))
else
Error
.
run
"max depth %d reached, last rules applied: …, %s"
!
max_depth_non_det
(
List_
.
rev_to_string
(
fun
x
->
x
)
", "
(
List_
.
cut
5
instance
.
Instance
.
rules
))
else
List
.
fold_left
(
fun
acc
rule
->
let
matching_list
=
match_in_graph
?
domain
?
param
:
rule
.
param
rule
.
pattern
instance
.
Instance
.
graph
in
List
.
fold_left
(
fun
acc1
matching
->
Instance_set
.
add
(
apply_rule
?
domain
modul_name
instance
matching
rule
)
acc1
Instance_set
.
add
(
apply_rule
?
domain
instance
matching
rule
)
acc1
)
acc
matching_list
)
Instance_set
.
empty
rules
(* ---------------------------------------------------------------------- *)
(** [conf_one_step ?domain modul_name instance rules] computes one Some (one-step reduct) with rules, None if no rule apply *)
let
rec
conf_one_step
?
domain
modul_name
(
instance
:
Instance
.
t
)
rules
=
let
rec
conf_one_step
?
domain
(
instance
:
Instance
.
t
)
rules
=
(* limit the rewriting depth to avoid looping rewriting *)
if
List
.
length
instance
.
Instance
.
rules
>=
!
max_depth_det
then
if
!
debug_loop
then
None
else
Error
.
run
"
[Module %s]
max depth %d reached, last rules applied: …, %s"
modul_name
!
max_depth_det
(
List_
.
rev_to_string
(
fun
x
->
x
)
", "
(
List_
.
cut
5
instance
.
Instance
.
rules
))
else
Error
.
run
"max depth %d reached, last rules applied: …, %s"
!
max_depth_det
(
List_
.
rev_to_string
(
fun
x
->
x
)
", "
(
List_
.
cut
5
instance
.
Instance
.
rules
))
else
match
rules
with
|
[]
->
None
...
...
@@ -1208,8 +1212,8 @@ module Rule = struct
fulfill
?
domain
(
pos
.
graph
,
neg
.
graph
)
instance
.
Instance
.
graph
new_partial_matching
)
negs
)
matching_list
in
Some
(
apply_rule
?
domain
modul_name
instance
first_matching_where_all_witout_are_fulfilled
rule
)
with
Not_found
->
(* try another rule *)
conf_one_step
?
domain
modul_name
instance
rule_tail
Some
(
apply_rule
?
domain
instance
first_matching_where_all_witout_are_fulfilled
rule
)
with
Not_found
->
(* try another rule *)
conf_one_step
?
domain
instance
rule_tail
(* ---------------------------------------------------------------------- *)
(** filter nfs being equal *)
...
...
@@ -1233,7 +1237,7 @@ module Rule = struct
let
(
new_to_do_set
,
new_nf_set
)
=
Instance_set
.
fold
(
fun
v
(
to_do_set_acc
,
nf_set_acc
)
->
match
Instance_set
.
elements
(
one_step
?
domain
modul_name
v
rules
)
with
match
Instance_set
.
elements
(
one_step
?
domain
v
rules
)
with
|
[]
->
(
to_do_set_acc
,
Instance_set
.
add
(
Instance
.
rev_steps
v
)
nf_set_acc
)
|
step_of_v
->
(
List
.
fold_left
(
fun
acc
v1
->
Instance_set
.
add
v1
acc
)
to_do_set_acc
step_of_v
,
nf_set_acc
)
)
...
...
@@ -1250,14 +1254,67 @@ module Rule = struct
reduced_nfs
(* ---------------------------------------------------------------------- *)
let
rec
conf_normalize
?
domain
modul_name
instance
rules
=
match
conf_one_step
?
domain
modul_name
instance
rules
with
|
Some
new_instance
->
conf_normalize
?
domain
modul_name
new_instance
rules
let
rec
conf_normalize
?
domain
instance
rules
=
match
conf_one_step
?
domain
instance
rules
with
|
Some
new_instance
->
conf_normalize
?
domain
new_instance
rules
|
None
->
Instance
.
rev_steps
instance
(* ---------------------------------------------------------------------- *)
let
normalize
?
domain
modul_name
?
(
deterministic
=
false
)
rules
instance
=
if
deterministic
then
Instance_set
.
singleton
(
conf_normalize
?
domain
modul_name
instance
rules
)
then
Instance_set
.
singleton
(
conf_normalize
?
domain
instance
rules
)
else
normalize_instance
?
domain
modul_name
instance
rules
let
apply
?
domain
rule
instance
=
(* limit the rewriting depth to avoid looping rewriting *)
if
List
.
length
instance
.
Instance
.
rules
>=
!
max_depth_non_det
then
if
!
debug_loop
then
Instance_set
.
empty
else
Error
.
run
"max depth %d reached, last rules applied: …, %s"
!
max_depth_non_det
(
List_
.
rev_to_string
(
fun
x
->
x
)
", "
(
List_
.
cut
5
instance
.
Instance
.
rules
))
else
let
matching_list
=
match_in_graph
?
domain
?
param
:
rule
.
param
rule
.
pattern
instance
.
Instance
.
graph
in
List
.
fold_left
(
fun
acc
matching
->
Instance_set
.
add
(
apply_rule
?
domain
instance
matching
rule
)
acc
)
Instance_set
.
empty
matching_list
let
rec
det_apply
?
domain
rule
instance
=
(* limit the rewriting depth to avoid looping rewriting *)
if
List
.
length
instance
.
Instance
.
rules
>=
!
max_depth_det
then
if
!
debug_loop
then
None
else
Error
.
run
"max depth %d reached, last rules applied: …, %s"
!
max_depth_det
(
List_
.
rev_to_string
(
fun
x
->
x
)
", "
(
List_
.
cut
5
instance
.
Instance
.
rules
))
else
let
(
pos
,
negs
)
=
rule
.
pattern
in
(* get the list of partial matching for positive part of the pattern *)
let
matching_list
=
extend_matching
?
domain
(
pos
.
graph
,
P_graph
.
empty
)
instance
.
Instance
.
graph
(
init
rule
.
param
pos
)
in
try
let
(
first_matching_where_all_witout_are_fulfilled
,_
)
=
List
.
find
(
fun
(
sub
,
already_matched_gids
)
->
List
.
for_all
(
fun
neg
->
let
new_partial_matching
=
update_partial
pos
.
graph
neg
(
sub
,
already_matched_gids
)
in
fulfill
?
domain
(
pos
.
graph
,
neg
.
graph
)
instance
.
Instance
.
graph
new_partial_matching
)
negs
)
matching_list
in
Some
(
apply_rule
?
domain
instance
first_matching_where_all_witout_are_fulfilled
rule
)
with
Not_found
->
None
end
(* module Rule *)
src/grew_rule.mli
View file @
645e0bae
...
...
@@ -94,8 +94,8 @@ module Rule : sig
Instance
.
t
->
Instance_set
.
t
val
one_step
:
?
domain
:
Domain
.
t
->
string
->
Instance
.
t
->
t
list
->
Instance_set
.
t
val
conf_one_step
:
?
domain
:
Domain
.
t
->
string
->
Instance
.
t
->
t
list
->
Instance
.
t
option
val
one_step
:
?
domain
:
Domain
.
t
->
Instance
.
t
->
t
list
->
Instance_set
.
t
val
conf_one_step
:
?
domain
:
Domain
.
t
->
Instance
.
t
->
t
list
->
Instance
.
t
option
(** the type matching encodes the graph morphism from a pattern to a graph *)
(* NB: it was made public for the grep mode *)
...
...
@@ -117,4 +117,14 @@ module Rule : sig
(** [match_deco rule matching] builds the decoration of the [graph] illustrating the given [matching] of the [rule] *)
(* NB: it can be computed independly from the graph itself! *)
val
match_deco
:
pattern
->
matching
->
G_deco
.
t
val
apply
:
?
domain
:
Domain
.
t
->
t
->
Instance
.
t
->
Instance_set
.
t
val
det_apply
:
?
domain
:
Domain
.
t
->
t
->
Instance
.
t
->
Instance
.
t
option
end
(* module Rule *)
src/libgrew.ml
View file @
645e0bae
...
...
@@ -321,6 +321,10 @@ module Rewrite = struct
let
simple_rewrite
~
gr
~
grs
~
strat
=
handle
~
name
:
"Rewrite.simple_rewrite"
(
fun
()
->
Grew_grs
.
Grs
.
simple_rewrite
grs
strat
gr
)
()
let
new_simple_rewrite
~
gr
~
grs
~
strat
=
handle
~
name
:
"Rewrite.new_simple_rewrite"
(
fun
()
->
Grew_grs
.
New_grs
.
simple_rewrite
grs
strat
gr
)
()
let
is_empty
rh
=
handle
~
name
:
"Rewrite.is_empty"
(
fun
()
->
Grew_grs
.
Rewrite_history
.
is_empty
rh
)
()
...
...
src/libgrew.mli
View file @
645e0bae
...
...
@@ -165,6 +165,7 @@ module Rewrite: sig
val
rewrite
:
gr
:
Graph
.
t
->
grs
:
Grs
.
t
->
seq
:
string
->
history
val
simple_rewrite
:
gr
:
Graph
.
t
->
grs
:
Grs
.
t
->
strat
:
string
->
Graph
.
t
list
val
new_simple_rewrite
:
gr
:
Graph
.
t
->
grs
:
New_grs
.
t
->
strat
:
string
->
Graph
.
t
list
val
is_empty
:
history
->
bool
...
...
Write
Preview
Markdown
is supported
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