Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
C
colibrics
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Model registry
Operate
Terraform modules
Analyze
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
pub
colibrics
Commits
4584d5ed
Commit
4584d5ed
authored
12 years ago
by
Frama-CI
Browse files
Options
Downloads
Patches
Plain Diff
[Solve] normalize in set_sem
parent
a8ad8528
No related branches found
No related tags found
No related merge requests found
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
src/solver.ml
+14
-7
14 additions, 7 deletions
src/solver.ml
src/uninterp.ml
+0
-2
0 additions, 2 deletions
src/uninterp.ml
tests/tests_uf.ml
+91
-87
91 additions, 87 deletions
tests/tests_uf.ml
with
105 additions
and
96 deletions
src/solver.ml
+
14
−
7
View file @
4584d5ed
...
...
@@ -294,10 +294,15 @@ module Delayed = struct
let
is_repr
t
cl
=
Cl
.
equal
(
Cl
.
M
.
find
cl
t
.
env
.
repr
)
cl
let
is_normalized
t
cl
=
Cl
.
M
.
mem
cl
t
.
env
.
repr
let
add_pending_merge
(
t
:
t
)
cl
cl'
=
assert
(
is_normalized
t
cl
);
assert
(
is_normalized
t
cl'
);
Queue
.
add
(
Merge
(
cl
,
cl'
))
t
.
todo
let
add_pending_set_sem
(
type
a
)
(
t
:
t
)
(
sem
:
'
a
sem
)
cl
(
v
:
'
a
)
=
assert
(
is_normalized
t
cl
);
Queue
.
add
(
SetSem
(
sem
,
cl
,
v
))
t
.
todo
let
get_dom
t
dom
cl
=
get_dom
t
.
env
dom
cl
...
...
@@ -344,7 +349,10 @@ module Delayed = struct
Simple_vector
.
set
t
.
env
.
sem
sem
(
module
SemTable'
);
match
cl'
with
|
None
->
()
|
Some
cl'
->
add_pending_merge
t
cl
cl'
|
Some
cl'
->
(** come from invtable, can be just indexed *)
let
cl'
=
normalize
t
cl'
in
add_pending_merge
t
cl
cl'
(*
merge:
...
...
@@ -356,8 +364,7 @@ module Delayed = struct
*)
let
choose_repr
cl1
cl2
=
(* (Shuffle.shufflep (cl1,cl2)) *)
(
min
cl1
cl2
,
max
cl1
cl2
)
(
Shuffle
.
shufflep
(
cl1
,
cl2
))
let
merge_sem
t
cl1
cl2
repr_cl
=
assert
(
Cl
.
equal
repr_cl
cl1
||
Cl
.
equal
repr_cl
cl2
);
...
...
@@ -451,7 +458,9 @@ module Delayed = struct
let
set_dom
t
=
assert
false
let
rec
do_pending
t
=
try
if
Queue
.
is_empty
t
.
todo
then
Debug
.
dprintf
debug
"[Solver] @[do_pending Nothing@]@."
else
begin
begin
match
Queue
.
pop
t
.
todo
with
|
Merge
(
cl1
,
cl2
)
->
Debug
.
dprintf
debug
"[Solver] @[do_pending Merge %a %a@]@."
...
...
@@ -463,9 +472,7 @@ module Delayed = struct
set_sem_pending
t
sem
cl
v
end
;
do_pending
t
with
Queue
.
Empty
->
Debug
.
dprintf
debug
"[Solver] @[do_pending Nothing@]@."
end
let
if_cl_change
t
cl
f
=
let
events
=
{
clcallback
=
f
}
::
(
Cl
.
M
.
find_def
[]
cl
t
.
env
.
event
)
in
...
...
This diff is collapsed.
Click to expand it.
src/uninterp.ml
+
0
−
2
View file @
4584d5ed
...
...
@@ -133,7 +133,6 @@ module Registered = RegisterSem(Th)
Cl
.
print
arg
(
Th
.
print
Cl
.
print
)
s
;
Delayed
.
if_cl_change
d
arg
(
subst
s
)
and
subst
t3
d
~
old
:
t1
t2
=
Debug
.
dprintf
debug
"[Uninterp] @[subst %a[%a -> %a]@]@."
(
Th
.
print
Cl
.
print
)
t3
Cl
.
print
t1
Cl
.
print
t2
;
...
...
@@ -152,7 +151,6 @@ module Registered = RegisterSem(Th)
add_daemon
d
g
s
;
Delayed
.
set_sem
d
sem
cl3
s
let
propagate
env
=
Solver
.
if_propagate_sem
env
sem
(
fun
d
cl
s
->
...
...
This diff is collapsed.
Click to expand it.
tests/tests_uf.ml
+
91
−
87
View file @
4584d5ed
open
OUnit
let
r
=
ref
0
module
Tests
(
E
:
sig
end
)
=
struct
open
Solver
...
...
@@ -77,7 +75,6 @@ let _2level' () =
let
bigger
()
=
incr
r
;
let
env
=
new_t
()
in
Uninterp
.
propagate
env
;
let
f
=
Uninterp
.
fun1
env
"f"
in
...
...
@@ -86,13 +83,10 @@ let bigger () =
let
fa
=
!$
env
(
bf
1
)
in
let
fffa
=
!$
env
(
bf
3
)
in
let
fffffa
=
!$
env
(
bf
5
)
in
output_graph
(
Format
.
sprintf
"bigger%i_1.dot"
!
r
)
env
;
equal
env
a
fffa
;
output_graph
(
Format
.
sprintf
"bigger%i_2.dot"
!
r
)
env
;
assert_bool
"a = f(f(f(a))) => f(a) != a"
(
not
(
is_equal
env
fa
a
));
equal
env
fffffa
a
;
output_graph
(
Format
.
sprintf
"bigger%i_3.dot"
!
r
)
env
;
assert_bool
"a = f(f(f(a))) => f(f(f(f(f(a))))) = a => f(a) = a"
(
is_equal
env
fa
a
)
...
...
@@ -104,87 +98,97 @@ let congru1 = "Congru 1 arg" >::: ["refl" >:: refl; "congru" >:: congru;
"bigger"
>::
bigger
]
(* let gab = adde (g env a b) *)
(* let gaa = adde (g env a a) *)
(* let gbb = adde (g env b b) *)
(* let refl () = assert_bool "g(a,b) = g(a,b)" (is_equal env gab gab) *)
(* let congru () = assert_bool "a = b => g(a,b) = g(a,a)" *)
(* (is_equal (equal env a b) gab gaa) *)
(* let notcongru () = assert_bool "a = g(a,b) => g(a,b) != g(a,a)" *)
(* (not (is_equal (equal env a gab) gab gaa)) *)
(* let _2level () = *)
(* let ggabb = adde (g env gab b) in *)
(* (\* f(a,b) = a, show f(f(a,b),b) = a *\) *)
(* assert_bool "g(a,b) = a => g(g(a,b),b) = a" *)
(* (is_equal (equal env gab a) ggabb a) *)
(* let congru2 = "congru 2 args" >::: ["refl" >:: refl; "congru" >:: congru; *)
(* "2level" >:: _2level;] *)
(* let equal env x y = *)
(* let x = add env x in *)
(* let y = add env y in *)
(* equal env x y *)
(* let is_equal env x y = *)
(* let x = add env x in *)
(* let y = add env y in *)
(* is_equal env x y *)
(* let altergo1 = *)
(* "h(x)=x and g(a,x)=a -> g(g(a,h(x)),x)=a" >:: *)
(* fun () -> *)
(* let env = Uf.empty in *)
(* let h = Uninterp.fun1 env "h" in *)
(* let g = Uninterp.fun2 env "g" in *)
(* let x = Uninterp.cst env "x" in *)
(* let a = Uninterp.cst env "a" in *)
(* let hx = h env x in *)
(* let env = equal env hx x in *)
(* let gax, env = g env a x in *)
(* let env = equal env gax a in *)
(* let hx, env = h env x in *)
(* let gahx, env = g env a hx in *)
(* let ggahxx, env = g env gahx x in *)
(* assert_bool "" (is_equal env ggahxx a) *)
(* let altergo2 = *)
(* "f(f(f(a)))=a and f(f(f(f(f(a)))))=a and g(x,y)=x -> \ *)
(* h(g(g(x,y),y),a)=h(x,f(a))" >:: *)
(* fun () -> *)
(* let env = Uf.empty in *)
(* let f = Uninterp.fun1 env "f" in *)
(* let h = Uninterp.fun2 env "h" in *)
(* let g = Uninterp.fun2 env "g" in *)
(* let x = Uninterp.cst env "x" in *)
(* let y = Uninterp.cst env "y" in *)
(* let a = Uninterp.cst env "a" in *)
(* let rec bf env n = if n < 1 then a else (fe (bf env (n-1))) in *)
(* let fffa, env = bf env 3 in *)
(* let env = equal env fffa a in *)
(* let fffffa, env = bf env 5 in *)
(* let env = equal env fffffa a in *)
(* let gxy, env = g env x y in *)
(* let env = equal env gxy x in *)
(* let ggxyy, env = g env gxy y in *)
(* let hggxyya, env = h env ggxyy a in *)
(* let fa, env = f env a in *)
(* let hxfa, env = h env x fa in *)
(* assert_bool "" (is_equal env hggxyya hxfa) *)
(* let altergo = "altergo tests" >::: [altergo1; altergo2] *)
(* let files = ["tests/tests_altergo_qualif.split"] *)
(* let altergo = TestList (List.map Tests_lib.test_split files) *)
let
tests
=
TestList
[
basic
;
congru1
;(
*
congru2
;
altergo
*
)]
let
gab
=
!$
env
(
g
env
a
b
)
let
gaa
=
!$
env
(
g
env
a
a
)
let
gbb
=
!$
env
(
g
env
b
b
)
let
refl
()
=
assert_bool
"g(a,b) = g(a,b)"
(
is_equal
env
gab
gab
)
let
congru
()
=
let
env
=
new_handler
env
in
equal
env
a
b
;
assert_bool
"a = b => g(a,b) = g(a,a)"
(
is_equal
env
gab
gaa
)
let
notcongru
()
=
let
env
=
new_handler
env
in
equal
env
a
gab
;
assert_bool
"a = g(a,b) => g(a,b) != g(a,a)"
(
not
(
is_equal
env
gab
gaa
))
let
_2level
()
=
let
env
=
new_handler
env
in
let
ggabb
=
!$
env
(
g
env
gab
b
)
in
equal
env
gab
a
;
(* f(a,b) = a, show f(f(a,b),b) = a *)
assert_bool
"g(a,b) = a => g(g(a,b),b) = a"
(
is_equal
env
ggabb
a
)
let
congru2
=
"congru 2 args"
>:::
[
"refl"
>::
refl
;
"congru"
>::
congru
;
"2level"
>::
_2level
;]
let
equal
env
x
y
=
let
x
=
propagate
env
x
in
let
y
=
propagate
env
y
in
equal
env
x
y
let
is_equal
env
x
y
=
let
x
=
propagate
env
x
in
let
y
=
propagate
env
y
in
is_equal
env
x
y
let
altergo1
=
"h(x)=x and g(a,x)=a -> g(g(a,h(x)),x)=a"
>::
fun
()
->
let
env
=
new_t
()
in
Uninterp
.
propagate
env
;
let
h
=
Uninterp
.
fun1
env
"h"
in
let
g
=
Uninterp
.
fun2
env
"g"
in
let
x
=
Uninterp
.
cst
env
"x"
in
let
a
=
Uninterp
.
cst
env
"a"
in
let
hx
=
h
env
x
in
equal
env
hx
x
;
let
gax
=
g
env
a
x
in
equal
env
gax
a
;
let
hx
=
h
env
x
in
let
gahx
=
g
env
a
hx
in
let
ggahxx
=
g
env
gahx
x
in
assert_bool
""
(
is_equal
env
ggahxx
a
)
let
altergo2
=
"f(f(f(a)))=a and f(f(f(f(f(a)))))=a and g(x,y)=x -> \
h(g(g(x,y),y),a)=h(x,f(a))"
>::
fun
()
->
let
env
=
new_t
()
in
Uninterp
.
propagate
env
;
let
f
=
Uninterp
.
fun1
env
"f"
in
let
h
=
Uninterp
.
fun2
env
"h"
in
let
g
=
Uninterp
.
fun2
env
"g"
in
let
x
=
Uninterp
.
cst
env
"x"
in
let
y
=
Uninterp
.
cst
env
"y"
in
let
a
=
Uninterp
.
cst
env
"a"
in
let
rec
bf
n
=
if
n
<
1
then
!$
env
a
else
!$
env
(
f
env
(
bf
(
n
-
1
)))
in
let
fffa
=
bf
3
in
equal
env
fffa
a
;
let
fffffa
=
bf
5
in
equal
env
fffffa
a
;
let
gxy
=
g
env
x
y
in
equal
env
gxy
x
;
let
ggxyy
=
g
env
gxy
y
in
let
hggxyya
=
h
env
ggxyy
a
in
let
fa
=
f
env
a
in
let
hxfa
=
h
env
x
fa
in
assert_bool
""
(
is_equal
env
hggxyya
hxfa
)
let
altergo
=
"altergo tests"
>:::
[
altergo1
;
altergo2
]
let
files
=
[
"tests/tests_altergo_qualif.split"
]
(* let altergo2 = TestList (List.map Tests_lib.test_split files) *)
let
tests
=
TestList
[
basic
;
congru1
;
congru2
;
altergo
;(
*
altergo2
*
)]
end
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment