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
why3
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
122
Issues
122
List
Boards
Labels
Service Desk
Milestones
Merge Requests
15
Merge Requests
15
Operations
Operations
Incidents
Packages & Registries
Packages & Registries
Container Registry
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Why3
why3
Commits
8a427f54
Commit
8a427f54
authored
Dec 06, 2018
by
Sylvain Dailler
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
destruct: first step simplification
parent
255164f9
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
30 additions
and
58 deletions
+30
-58
examples/bts/231_destruct/why3session.xml
examples/bts/231_destruct/why3session.xml
+12
-32
examples/bts/231_destruct/why3shapes.gz
examples/bts/231_destruct/why3shapes.gz
+0
-0
src/transform/destruct.ml
src/transform/destruct.ml
+18
-26
No files found.
examples/bts/231_destruct/why3session.xml
View file @
8a427f54
...
...
@@ -52,19 +52,23 @@
</theory>
<theory
name=
"Unsoundness"
>
<goal
name=
"t1"
>
<transf
name=
"destruct_rec"
arg1=
"H"
>
<goal
name=
"t1.0"
>
<transf
name=
"destruct_rec"
arg1=
"H1"
>
<goal
name=
"t1.0.0"
expl=
"destruct premise"
>
</goal>
<goal
name=
"t1.0.1"
>
</goal>
</transf>
</goal>
</transf>
</goal>
</theory>
<theory
name=
"Incompleteness"
>
<goal
name=
"t1"
>
<transf
name=
"destruct_rec"
arg1=
"H"
>
<goal
name=
"t1.0"
expl=
"destruct premise"
>
<proof
prover=
"0"
><result
status=
"unknown"
time=
"0.00"
/></proof>
</goal>
<goal
name=
"t1.1"
expl=
"destruct premise"
>
<proof
prover=
"0"
><result
status=
"unknown"
time=
"0.00"
/></proof>
</goal>
<goal
name=
"t1.2"
proved=
"true"
>
<proof
prover=
"0"
><result
status=
"valid"
time=
"0.00"
/></proof>
<goal
name=
"t1.0"
>
<proof
prover=
"0"
obsolete=
"true"
><result
status=
"valid"
time=
"0.00"
/></proof>
</goal>
</transf>
</goal>
...
...
@@ -141,29 +145,5 @@
</transf>
</goal>
</theory>
<theory
name=
"Tsurfail"
>
<goal
name=
"t"
>
<transf
name=
"destruct_rec"
arg1=
"H"
>
<goal
name=
"t.0"
expl=
"destruct premise"
>
</goal>
<goal
name=
"t.1"
expl=
"destruct premise"
>
</goal>
<goal
name=
"t.2"
>
</goal>
</transf>
</goal>
</theory>
<theory
name=
"Tfail"
>
<goal
name=
"G"
>
<transf
name=
"destruct_rec"
arg1=
"H"
>
<goal
name=
"G.0"
expl=
"destruct premise"
>
</goal>
<goal
name=
"G.1"
expl=
"destruct premise"
>
</goal>
<goal
name=
"G.2"
>
</goal>
</transf>
</goal>
</theory>
</file>
</why3session>
examples/bts/231_destruct/why3shapes.gz
View file @
8a427f54
No preview for this file type
src/transform/destruct.ml
View file @
8a427f54
...
...
@@ -149,24 +149,22 @@ let destruct_term ~recursive (t: term) =
l
.
ls_constr
<>
0
in
(* Check if a new goal is created in the branch *)
let
contains_goal
l
=
List
.
exists
(
fun
x
->
match
x
with
|
Goal_term
_
->
true
|
_
->
false
)
l
in
(* Main function *)
let
rec
destruct_term
(
t
:
term
)
=
let
destruct_term_exception
t
=
(* Main recursive function:
[toplevel] when true, removing implications is allowed. Become false as
soon as we destruct non-implication construct
*)
let
rec
destruct_term
~
toplevel
(
t
:
term
)
=
let
destruct_term_exception
~
toplevel
t
=
if
not
recursive
then
[[
Axiom_term
t
]]
else
match
destruct_term
t
with
match
destruct_term
~
toplevel
t
with
|
exception
_
->
[[
Axiom_term
t
]]
|
l
->
l
in
match
t
.
t_node
with
|
Tbinop
(
Tand
,
t1
,
t2
)
->
let
l1
=
destruct_term_exception
t1
in
let
l2
=
destruct_term_exception
t2
in
let
l1
=
destruct_term_exception
~
toplevel
:
false
t1
in
let
l2
=
destruct_term_exception
~
toplevel
:
false
t2
in
(* For each parallel branch of l1 we have to append *all* parallel
branch of l2 which are not new goals. In case of new goals, we are
not allowed to use the left/right conclusions to prove the goal.
...
...
@@ -177,25 +175,19 @@ let destruct_term ~recursive (t: term) =
(* TODO efficiency: this is not expected to work on very large terms
with tons of Tand/Tor. *)
List
.
fold_left
(
fun
par_acc
seq_list1
->
if
contains_goal
seq_list1
then
par_acc
@
[
seq_list1
]
else
List
.
fold_left
(
fun
par_acc
seq_list2
->
if
contains_goal
seq_list2
then
par_acc
@
[
seq_list2
]
else
par_acc
@
[
seq_list1
@
seq_list2
])
par_acc
l2
List
.
fold_left
(
fun
par_acc
seq_list2
->
par_acc
@
[
seq_list1
@
seq_list2
])
par_acc
l2
)
[]
l1
|
Tbinop
(
Tor
,
t1
,
t2
)
->
let
l1
=
destruct_term_exception
t1
in
let
l2
=
destruct_term_exception
t2
in
let
l1
=
destruct_term_exception
~
toplevel
:
false
t1
in
let
l2
=
destruct_term_exception
~
toplevel
:
false
t2
in
(* The two branch are completely disjoint. We just concatenate them to
ensure they are done in parallel *)
l1
@
l2
|
Tbinop
(
Timplies
,
t1
,
t2
)
->
|
Tbinop
(
Timplies
,
t1
,
t2
)
when
toplevel
->
(* The premises is converted to a goal. The rest is recursively
destructed in parallel. *)
let
l2
=
destruct_term_exception
t2
in
let
l2
=
destruct_term_exception
~
toplevel
t2
in
[
Goal_term
t1
]
::
l2
|
Tquant
(
Texists
,
tb
)
->
let
(
vsl
,
tr
,
te
)
=
Term
.
t_open_quant
tb
in
...
...
@@ -209,7 +201,7 @@ let destruct_term ~recursive (t: term) =
let
new_t
=
t_quant_close
Texists
tl
tr
part_t
in
(* The recursive call is done after new symbols are introduced so we
readd the new decls to every generated list. *)
let
l_t
=
destruct_term_exception
new_t
in
let
l_t
=
destruct_term_exception
~
toplevel
:
false
new_t
in
List
.
map
(
fun
x
->
Param
x_decl
::
x
)
l_t
with
|
Ty
.
TypeMismatch
(
ty1
,
ty2
)
->
...
...
@@ -237,7 +229,7 @@ let destruct_term ~recursive (t: term) =
|
Tnot
{
t_node
=
Tapp
(
ls
,
[{
t_node
=
Tapp
(
cs1
,
_
);
_
};
{
t_node
=
Tapp
(
cs2
,
_
);
_
}]);
_
}
when
ls_equal
ls
ps_equ
&&
is_constructor
cs1
&&
is_constructor
cs2
->
(* Cs1 [l1]
<>
Cs2 [l2] *)
(* Cs1 [l1]
=
Cs2 [l2] *)
if
ls_equal
cs1
cs2
then
[[
Axiom_term
t
]]
else
...
...
@@ -245,7 +237,7 @@ let destruct_term ~recursive (t: term) =
[[]]
|
_
->
raise
(
Arg_trans
(
"destruct"
))
in
destruct_term
t
destruct_term
~
toplevel
:
true
t
(* Destruct the head term of an hypothesis if it is either
conjunction, disjunction or exists *)
...
...
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