| author | wenzelm | 
| Mon, 25 Nov 2019 12:19:14 +0100 | |
| changeset 71163 | b5822f4c3fde | 
| parent 70749 | 5d06b7bb9d22 | 
| child 72458 | b44e894796d5 | 
| permissions | -rw-r--r-- | 
| 
69204
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
1  | 
(* Title: HOL/Tools/SMT/smt_replay.ML  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
2  | 
Author: Sascha Boehme, TU Muenchen  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
3  | 
Author: Jasmin Blanchette, TU Muenchen  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
4  | 
Author: Mathias Fleury, MPII  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
5  | 
|
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
6  | 
Shared library for parsing and replay.  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
7  | 
*)  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
8  | 
|
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
9  | 
signature SMT_REPLAY =  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
10  | 
sig  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
11  | 
(*theorem nets*)  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
12  | 
  val thm_net_of: ('a -> thm) -> 'a list -> 'a Net.net
 | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
13  | 
val net_instances: (int * thm) Net.net -> cterm -> (int * thm) list  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
14  | 
|
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
15  | 
(*proof combinators*)  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
16  | 
val under_assumption: (thm -> thm) -> cterm -> thm  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
17  | 
val discharge: thm -> thm -> thm  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
18  | 
|
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
19  | 
(*a faster COMP*)  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
20  | 
type compose_data = cterm list * (cterm -> cterm list) * thm  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
21  | 
val precompose: (cterm -> cterm list) -> thm -> compose_data  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
22  | 
val precompose2: (cterm -> cterm * cterm) -> thm -> compose_data  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
23  | 
val compose: compose_data -> thm -> thm  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
24  | 
|
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
25  | 
(*simpset*)  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
26  | 
val add_simproc: Simplifier.simproc -> Context.generic -> Context.generic  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
27  | 
val make_simpset: Proof.context -> thm list -> simpset  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
28  | 
|
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
29  | 
(*assertion*)  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
30  | 
  val add_asserted:  ('a * ('b * thm) -> 'c -> 'c) ->
 | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
31  | 
    'c -> ('d -> 'a * 'e * term * 'b) -> ('e -> bool) -> Proof.context -> thm list ->
 | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
32  | 
(int * thm) list -> 'd list -> Proof.context ->  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
33  | 
    ((int * ('a * thm)) list * thm list) * (Proof.context * 'c)
 | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
34  | 
|
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
35  | 
(*statistics*)  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
36  | 
val pretty_statistics: string -> int -> int list Symtab.table -> Pretty.T  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
37  | 
val intermediate_statistics: Proof.context -> Timing.start -> int -> int -> unit  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
38  | 
|
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
39  | 
(*theorem transformation*)  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
40  | 
val varify: Proof.context -> thm -> thm  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
41  | 
val params_of: term -> (string * typ) list  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
42  | 
end;  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
43  | 
|
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
44  | 
structure SMT_Replay : SMT_REPLAY =  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
45  | 
struct  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
46  | 
|
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
47  | 
(* theorem nets *)  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
48  | 
|
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
49  | 
fun thm_net_of f xthms =  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
50  | 
let fun insert xthm = Net.insert_term (K false) (Thm.prop_of (f xthm), xthm)  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
51  | 
in fold insert xthms Net.empty end  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
52  | 
|
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
53  | 
fun maybe_instantiate ct thm =  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
54  | 
try Thm.first_order_match (Thm.cprop_of thm, ct)  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
55  | 
|> Option.map (fn inst => Thm.instantiate inst thm)  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
56  | 
|
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
57  | 
local  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
58  | 
fun instances_from_net match f net ct =  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
59  | 
let  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
60  | 
val lookup = if match then Net.match_term else Net.unify_term  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
61  | 
val xthms = lookup net (Thm.term_of ct)  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
62  | 
fun select ct = map_filter (f (maybe_instantiate ct)) xthms  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
63  | 
fun select' ct =  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
64  | 
let val thm = Thm.trivial ct  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
65  | 
in map_filter (f (try (fn rule => rule COMP thm))) xthms end  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
66  | 
in (case select ct of [] => select' ct | xthms' => xthms') end  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
67  | 
in  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
68  | 
|
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
69  | 
fun net_instances net =  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
70  | 
instances_from_net false (fn f => fn (i, thm) => Option.map (pair i) (f thm))  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
71  | 
net  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
72  | 
|
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
73  | 
end  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
74  | 
|
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
75  | 
|
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
76  | 
(* proof combinators *)  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
77  | 
|
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
78  | 
fun under_assumption f ct =  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
79  | 
let val ct' = SMT_Util.mk_cprop ct in Thm.implies_intr ct' (f (Thm.assume ct')) end  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
80  | 
|
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
81  | 
fun discharge p pq = Thm.implies_elim pq p  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
82  | 
|
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
83  | 
|
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
84  | 
(* a faster COMP *)  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
85  | 
|
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
86  | 
type compose_data = cterm list * (cterm -> cterm list) * thm  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
87  | 
|
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
88  | 
fun list2 (x, y) = [x, y]  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
89  | 
|
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
90  | 
fun precompose f rule : compose_data = (f (Thm.cprem_of rule 1), f, rule)  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
91  | 
fun precompose2 f rule : compose_data = precompose (list2 o f) rule  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
92  | 
|
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
93  | 
fun compose (cvs, f, rule) thm =  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
94  | 
discharge thm  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
95  | 
(Thm.instantiate ([], map (dest_Var o Thm.term_of) cvs ~~ f (Thm.cprop_of thm)) rule)  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
96  | 
|
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
97  | 
|
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
98  | 
(* simpset *)  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
99  | 
|
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
100  | 
local  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
101  | 
  val antisym_le1 = mk_meta_eq @{thm order_class.antisym_conv}
 | 
| 
70749
 
5d06b7bb9d22
More type class generalisations. Note that linorder_antisym_conv1 and linorder_antisym_conv2 no longer exist.
 
paulson <lp15@cam.ac.uk> 
parents: 
70320 
diff
changeset
 | 
102  | 
  val antisym_le2 = mk_meta_eq @{thm order_class.antisym_conv2}
 | 
| 
 
5d06b7bb9d22
More type class generalisations. Note that linorder_antisym_conv1 and linorder_antisym_conv2 no longer exist.
 
paulson <lp15@cam.ac.uk> 
parents: 
70320 
diff
changeset
 | 
103  | 
  val antisym_less1 = mk_meta_eq @{thm order_class.antisym_conv1}
 | 
| 
69204
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
104  | 
  val antisym_less2 = mk_meta_eq @{thm linorder_class.antisym_conv3}
 | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
105  | 
|
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
106  | 
fun eq_prop t thm = HOLogic.mk_Trueprop t aconv Thm.prop_of thm  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
107  | 
fun dest_binop ((c as Const _) $ t $ u) = (c, t, u)  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
108  | 
    | dest_binop t = raise TERM ("dest_binop", [t])
 | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
109  | 
|
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
110  | 
fun prove_antisym_le ctxt ct =  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
111  | 
let  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
112  | 
val (le, r, s) = dest_binop (Thm.term_of ct)  | 
| 69593 | 113  | 
val less = Const (\<^const_name>\<open>less\<close>, Term.fastype_of le)  | 
| 
69204
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
114  | 
val prems = Simplifier.prems_of ctxt  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
115  | 
in  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
116  | 
(case find_first (eq_prop (le $ s $ r)) prems of  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
117  | 
NONE =>  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
118  | 
find_first (eq_prop (HOLogic.mk_not (less $ r $ s))) prems  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
119  | 
|> Option.map (fn thm => thm RS antisym_less1)  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
120  | 
| SOME thm => SOME (thm RS antisym_le1))  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
121  | 
end  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
122  | 
handle THM _ => NONE  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
123  | 
|
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
124  | 
fun prove_antisym_less ctxt ct =  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
125  | 
let  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
126  | 
val (less, r, s) = dest_binop (HOLogic.dest_not (Thm.term_of ct))  | 
| 69593 | 127  | 
val le = Const (\<^const_name>\<open>less_eq\<close>, Term.fastype_of less)  | 
| 
69204
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
128  | 
val prems = Simplifier.prems_of ctxt  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
129  | 
in  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
130  | 
(case find_first (eq_prop (le $ r $ s)) prems of  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
131  | 
NONE =>  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
132  | 
find_first (eq_prop (HOLogic.mk_not (less $ s $ r))) prems  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
133  | 
|> Option.map (fn thm => thm RS antisym_less2)  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
134  | 
| SOME thm => SOME (thm RS antisym_le2))  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
135  | 
end  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
136  | 
handle THM _ => NONE  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
137  | 
|
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
138  | 
val basic_simpset =  | 
| 69593 | 139  | 
simpset_of (put_simpset HOL_ss \<^context>  | 
| 
69204
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
140  | 
      addsimps @{thms field_simps times_divide_eq_right times_divide_eq_left arith_special
 | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
141  | 
arith_simps rel_simps array_rules z3div_def z3mod_def NO_MATCH_def}  | 
| 69593 | 142  | 
addsimprocs [\<^simproc>\<open>numeral_divmod\<close>,  | 
143  | 
Simplifier.make_simproc \<^context> "fast_int_arith"  | 
|
144  | 
         {lhss = [\<^term>\<open>(m::int) < n\<close>, \<^term>\<open>(m::int) \<le> n\<close>, \<^term>\<open>(m::int) = n\<close>],
 | 
|
| 
69204
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
145  | 
proc = K Lin_Arith.simproc},  | 
| 69593 | 146  | 
Simplifier.make_simproc \<^context> "antisym_le"  | 
147  | 
         {lhss = [\<^term>\<open>(x::'a::order) \<le> y\<close>],
 | 
|
| 
69204
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
148  | 
proc = K prove_antisym_le},  | 
| 69593 | 149  | 
Simplifier.make_simproc \<^context> "antisym_less"  | 
150  | 
         {lhss = [\<^term>\<open>\<not> (x::'a::linorder) < y\<close>],
 | 
|
| 
69204
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
151  | 
proc = K prove_antisym_less}])  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
152  | 
|
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
153  | 
structure Simpset = Generic_Data  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
154  | 
(  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
155  | 
type T = simpset  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
156  | 
val empty = basic_simpset  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
157  | 
val extend = I  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
158  | 
val merge = Simplifier.merge_ss  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
159  | 
)  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
160  | 
in  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
161  | 
|
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
162  | 
fun add_simproc simproc context =  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
163  | 
Simpset.map (simpset_map (Context.proof_of context)  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
164  | 
(fn ctxt => ctxt addsimprocs [simproc])) context  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
165  | 
|
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
166  | 
fun make_simpset ctxt rules =  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
167  | 
simpset_of (put_simpset (Simpset.get (Context.Proof ctxt)) ctxt addsimps rules)  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
168  | 
|
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
169  | 
end  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
170  | 
|
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
171  | 
local  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
172  | 
  val remove_trigger = mk_meta_eq @{thm trigger_def}
 | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
173  | 
  val remove_fun_app = mk_meta_eq @{thm fun_app_def}
 | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
174  | 
|
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
175  | 
fun rewrite_conv _ [] = Conv.all_conv  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
176  | 
| rewrite_conv ctxt eqs = Simplifier.full_rewrite (empty_simpset ctxt addsimps eqs)  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
177  | 
|
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
178  | 
  val rewrite_true_rule = @{lemma "True \<equiv> \<not> False" by simp}
 | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
179  | 
  val prep_rules = [@{thm Let_def}, remove_trigger, remove_fun_app, rewrite_true_rule]
 | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
180  | 
|
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
181  | 
fun rewrite _ [] = I  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
182  | 
| rewrite ctxt eqs = Conv.fconv_rule (rewrite_conv ctxt eqs)  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
183  | 
|
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
184  | 
fun lookup_assm assms_net ct =  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
185  | 
net_instances assms_net ct  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
186  | 
|> map (fn ithm as (_, thm) => (ithm, Thm.cprop_of thm aconvc ct))  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
187  | 
in  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
188  | 
|
| 
70320
 
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
 
wenzelm 
parents: 
69593 
diff
changeset
 | 
189  | 
fun add_asserted tab_update tab_empty p_extract cond outer_ctxt rewrite_rules assms steps ctxt0 =  | 
| 
69204
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
190  | 
let  | 
| 
70320
 
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
 
wenzelm 
parents: 
69593 
diff
changeset
 | 
191  | 
val eqs = map (rewrite ctxt0 [rewrite_true_rule]) rewrite_rules  | 
| 
69204
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
192  | 
val eqs' = union Thm.eq_thm eqs prep_rules  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
193  | 
|
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
194  | 
val assms_net =  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
195  | 
assms  | 
| 
70320
 
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
 
wenzelm 
parents: 
69593 
diff
changeset
 | 
196  | 
|> map (apsnd (rewrite ctxt0 eqs'))  | 
| 
69204
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
197  | 
|> map (apsnd (Conv.fconv_rule Thm.eta_conversion))  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
198  | 
|> thm_net_of snd  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
199  | 
|
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
200  | 
fun revert_conv ctxt = rewrite_conv ctxt eqs' then_conv Thm.eta_conversion  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
201  | 
|
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
202  | 
fun assume thm ctxt =  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
203  | 
let  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
204  | 
val ct = Thm.cprem_of thm 1  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
205  | 
val (thm', ctxt') = yield_singleton Assumption.add_assumes ct ctxt  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
206  | 
in (thm' RS thm, ctxt') end  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
207  | 
|
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
208  | 
fun add1 id fixes thm1 ((i, th), exact) ((iidths, thms), (ctxt, ptab)) =  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
209  | 
let  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
210  | 
val (thm, ctxt') = if exact then (Thm.implies_elim thm1 th, ctxt) else assume thm1 ctxt  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
211  | 
val thms' = if exact then thms else th :: thms  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
212  | 
in (((i, (id, th)) :: iidths, thms'), (ctxt', tab_update (id, (fixes, thm)) ptab)) end  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
213  | 
|
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
214  | 
fun add step  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
215  | 
(cx as ((iidths, thms), (ctxt, ptab))) =  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
216  | 
let val (id, rule, concl, fixes) = p_extract step in  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
217  | 
if (*Z3_Proof.is_assumption rule andalso rule <> Z3_Proof.Hypothesis*) cond rule then  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
218  | 
let  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
219  | 
val ct = Thm.cterm_of ctxt concl  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
220  | 
val thm1 = Thm.trivial ct |> Conv.fconv_rule (Conv.arg1_conv (revert_conv outer_ctxt))  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
221  | 
val thm2 = singleton (Variable.export ctxt outer_ctxt) thm1  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
222  | 
in  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
223  | 
(case lookup_assm assms_net (Thm.cprem_of thm2 1) of  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
224  | 
[] =>  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
225  | 
let val (thm, ctxt') = assume thm1 ctxt  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
226  | 
in ((iidths, thms), (ctxt', tab_update (id, (fixes, thm)) ptab)) end  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
227  | 
| ithms => fold (add1 id fixes thm1) ithms cx)  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
228  | 
end  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
229  | 
else  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
230  | 
cx  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
231  | 
end  | 
| 
70320
 
59258a3192bf
misc tuning and clarification, notably wrt. flow of context;
 
wenzelm 
parents: 
69593 
diff
changeset
 | 
232  | 
in fold add steps (([], []), (ctxt0, tab_empty)) end  | 
| 
69204
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
233  | 
|
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
234  | 
end  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
235  | 
|
| 69593 | 236  | 
fun params_of t = Term.strip_qnt_vars \<^const_name>\<open>Pure.all\<close> t  | 
| 
69204
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
237  | 
|
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
238  | 
fun varify ctxt thm =  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
239  | 
let  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
240  | 
val maxidx = Thm.maxidx_of thm + 1  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
241  | 
val vs = params_of (Thm.prop_of thm)  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
242  | 
val vars = map_index (fn (i, (n, T)) => Var ((n, i + maxidx), T)) vs  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
243  | 
in Drule.forall_elim_list (map (Thm.cterm_of ctxt) vars) thm end  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
244  | 
|
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
245  | 
fun intermediate_statistics ctxt start total =  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
246  | 
SMT_Config.statistics_msg ctxt (fn current =>  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
247  | 
"Reconstructed " ^ string_of_int current ^ " of " ^ string_of_int total ^ " steps in " ^  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
248  | 
string_of_int (Time.toMilliseconds (#elapsed (Timing.result start))) ^ " ms")  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
249  | 
|
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
250  | 
fun pretty_statistics solver total stats =  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
251  | 
let  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
252  | 
fun mean_of is =  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
253  | 
let  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
254  | 
val len = length is  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
255  | 
val mid = len div 2  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
256  | 
in if len mod 2 = 0 then (nth is (mid - 1) + nth is mid) div 2 else nth is mid end  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
257  | 
fun pretty_item name p = Pretty.item (Pretty.separate ":" [Pretty.str name, p])  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
258  | 
fun pretty (name, milliseconds) = pretty_item name (Pretty.block (Pretty.separate "," [  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
259  | 
Pretty.str (string_of_int (length milliseconds) ^ " occurrences") ,  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
260  | 
Pretty.str (string_of_int (mean_of milliseconds) ^ " ms mean time"),  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
261  | 
Pretty.str (string_of_int (fold Integer.max milliseconds 0) ^ " ms maximum time"),  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
262  | 
Pretty.str (string_of_int (fold Integer.add milliseconds 0) ^ " ms total time")]))  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
263  | 
in  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
264  | 
Pretty.big_list (solver ^ " proof reconstruction statistics:") (  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
265  | 
pretty_item "total time" (Pretty.str (string_of_int total ^ " ms")) ::  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
266  | 
map pretty (Symtab.dest stats))  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
267  | 
end  | 
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
268  | 
|
| 
 
d5ab1636660b
split SMT reconstruction into library
 
fleury <Mathias.Fleury@mpi-inf.mpg.de> 
parents:  
diff
changeset
 | 
269  | 
end;  |