1233336Sgonzostructure temporal_deep_simplificationsLib :> temporal_deep_simplificationsLib =
2233336Sgonzostruct
3233336Sgonzo
4233336Sgonzo(*
5233336Sgonzoquietdec := true;
6233336Sgonzo
7233336Sgonzoval home_dir = (concat Globals.HOLDIR "/examples/temporal_deep/");
8233336SgonzoloadPath := (concat home_dir "src/deep_embeddings") ::
9233336Sgonzo            (concat home_dir "src/tools") :: !loadPath;
10233336Sgonzo
11233336Sgonzomap load
12233336Sgonzo ["congLib", "temporal_deep_simplificationsLibTheory",
13233336Sgonzo  "prop_logicTheory", "xprop_logicTheory", "full_ltlTheory", "Travrules",
14233336Sgonzo  "congToolsLib", "Traverse", "tuerk_tacticsLib"];
15233336Sgonzo*)
16233336Sgonzo
17233336Sgonzoopen HolKernel boolLib bossLib temporal_deep_simplificationsLibTheory
18233336Sgonzo  congLib prop_logicTheory xprop_logicTheory full_ltlTheory Travrules congToolsLib
19233336Sgonzo  Traverse tuerk_tacticsLib
20233336Sgonzo
21233336Sgonzo(*
22233336Sgonzoshow_assums := false;
23233336Sgonzoshow_assums := true;
24233336Sgonzoshow_types := true;
25233336Sgonzoshow_types := false;
26233336Sgonzoquietdec := false;
27233336Sgonzo*)
28233336Sgonzo
29233336Sgonzo(* Works but much too slow. However, I'm not sure, if it is really usefull
30233336Sgonzo
31233336Sgonzofun prop_logic_equivalent_and_conv t =
32233336Sgonzo  let
33233336Sgonzo    val (func, args) = dest_comb t
34233336Sgonzo    val _ = if same_const func ``P_AND:'a prop_logic # 'a prop_logic -> 'a prop_logic`` then T else raise ERR "NOT_APPLICALBE" "";
35233336Sgonzo
36233336Sgonzo    val l = rand (rator (args));
37233336Sgonzo    val r = rand(args);
38233336Sgonzo
39233336Sgonzo    val l_is_neg = can (match_term ``(P_NOT x):'a prop_logic``) l
40233336Sgonzo    val replacement = if l_is_neg then ``P_FALSE:'a prop_logic`` else
41233336Sgonzo                      ``P_TRUE:'a prop_logic``;
42233336Sgonzo    val t_type = hd (snd (dest_type (type_of t)));
43233336Sgonzo    val replacement = inst [alpha |-> t_type] replacement;
44233336Sgonzo    val replacement_lhs = if l_is_neg then (rand l) else l;
45233336Sgonzo
46233336Sgonzo    val new_r = subst [replacement_lhs |-> replacement] r
47233336Sgonzo    val _ = if (new_r = r) then raise UNCHANGED else T;
48233336Sgonzo
49233336Sgonzo    val resultTerm = ``PROP_LOGIC_EQUIVALENT (x:'a prop_logic) (P_AND (y, z))``
50233336Sgonzo    val resultTerm = inst [alpha |-> t_type] resultTerm;
51233336Sgonzo    val resultTerm = subst [mk_var("x", type_of t) |-> t,
52233336Sgonzo                            mk_var("y", type_of t) |-> l,
53233336Sgonzo                            mk_var("z", type_of t) |-> new_r] resultTerm
54233336Sgonzo    val thm = prove (resultTerm,
55233336Sgonzo      REWRITE_TAC[PROP_LOGIC_EQUIVALENT_def, P_SEM_THM] THEN
56233336Sgonzo                  REPEAT GEN_TAC THEN
57233336Sgonzo                  REPEAT BOOL_EQ_STRIP_TAC);
58233336Sgonzo  in
59233336Sgonzo    thm
60233336Sgonzo  end;
61233336Sgonzo
62233336Sgonzo
63233336Sgonzofun prop_logic_equivalent_or_conv t =
64233336Sgonzo  let
65233336Sgonzo    val (func, args) = dest_comb t
66233336Sgonzo    val _ = if same_const func ``P_OR:'a prop_logic # 'a prop_logic -> 'a prop_logic`` then T else raise ERR "NOT_APPLICALBE" "";
67233336Sgonzo
68233336Sgonzo    val l = rand (rator (args));
69233336Sgonzo    val r = rand(args);
70233336Sgonzo
71233336Sgonzo    val l_is_neg = can (match_term ``(P_NOT x):'a prop_logic``) l
72233336Sgonzo    val replacement = if l_is_neg then ``P_TRUE:'a prop_logic`` else
73233336Sgonzo                      ``P_FALSE:'a prop_logic``;
74265999Sian    val t_type = hd (snd (dest_type (type_of t)));
75233336Sgonzo    val replacement = inst [alpha |-> t_type] replacement;
76233336Sgonzo    val replacement_lhs = if l_is_neg then (rand l) else l;
77233336Sgonzo    val new_r = subst [replacement_lhs |-> replacement] r
78233336Sgonzo    val _ = if (new_r = r) then raise UNCHANGED else T;
79233336Sgonzo
80233336Sgonzo
81233336Sgonzo    val resultTerm = ``PROP_LOGIC_EQUIVALENT (x:'a prop_logic) (P_OR (y, z))``
82233336Sgonzo    val resultTerm = inst [alpha |-> t_type] resultTerm;
83233336Sgonzo    val resultTerm = subst [mk_var("x", type_of t) |-> t,
84233336Sgonzo                            mk_var("y", type_of t) |-> l,
85233336Sgonzo                            mk_var("z", type_of t) |-> new_r] resultTerm
86233336Sgonzo    val thm = prove (resultTerm,
87233336Sgonzo      REWRITE_TAC[PROP_LOGIC_EQUIVALENT_def, P_SEM_THM] THEN
88233336Sgonzo                  REPEAT GEN_TAC THEN
89233336Sgonzo                  REPEAT BOOL_EQ_STRIP_TAC);
90233336Sgonzo  in
91233336Sgonzo    thm
92233336Sgonzo  end;
93233336Sgonzo
94233336Sgonzo
95233336Sgonzoexception reducer_empty_context;
96233336Sgonzofun simple_conv_reducer conv' =
97233336Sgonzo  let
98233336Sgonzo      fun addcontext (context,thms) = reducer_empty_context
99233336Sgonzo      fun apply {solver,conv, context,stack,relation} tm = conv' tm;
100233336Sgonzo  in REDUCER {addcontext=addcontext, apply=apply,
101233336Sgonzo              initial=reducer_empty_context}
102233336Sgonzo  end;
103233336Sgonzo
104233336Sgonzo*)
105233336Sgonzo
106233336Sgonzo
107233336Sgonzoval prop_logic_equivalent_preorder =
108233336Sgonzo    mk_preorder (PROP_LOGIC_EQUIVALENT_TRANS, PROP_LOGIC_EQUIVALENT_REFL);
109233336Sgonzo
110233336Sgonzoval xprop_logic_equivalent_preorder =
111233336Sgonzo    mk_preorder (XPROP_LOGIC_EQUIVALENT_TRANS, XPROP_LOGIC_EQUIVALENT_REFL);
112233336Sgonzo
113233336Sgonzo
114233336Sgonzoval ltl_equivalent_preorder =
115233336Sgonzo    mk_preorder (LTL_EQUIVALENT_TRANS, LTL_EQUIVALENT_REFL);
116233336Sgonzo
117233336Sgonzo
118233336Sgonzoval prop_logic_CS = merge_cs [CSFRAG
119233336Sgonzo   {rewrs  = [PROP_LOGIC_EQUIVALENT_rewrites,
120233336Sgonzo      PROP_LOGIC_EQUIVALENT___EXISTS___rewrites],
121233336Sgonzo    relations = [prop_logic_equivalent_preorder],
122233336Sgonzo    dprocs = [],
123233336Sgonzo    congs  = [PROP_LOGIC_EQUIVALENT_congs, PROP_LOGIC_EQUIVALENT_list_congs]},
124233336Sgonzo
125233336Sgonzo    mk_list_as_set_congruence_relation_cs PROP_LOGIC_EQUIVALENT_LIST_AS_SET_def prop_logic_equivalent_preorder];
126233336Sgonzo
127233336Sgonzoval prop_logic_nnf_CS = add_csfrag_rewrites prop_logic_CS [PROP_LOGIC_EQUIVALENT_nnf_rewrites];
128233336Sgonzo
129233336Sgonzoval prop_logic_dnf_CS = add_csfrag_rewrites prop_logic_nnf_CS [PROP_LOGIC_EQUIVALENT_dnf_rewrites, P_EQUIV_def, P_IMPL_def, P_COND_def];
130233336Sgonzo
131val prop_logic_cs = mk_congset [prop_logic_CS];
132val prop_logic_nnf_cs = mk_congset [prop_logic_nnf_CS];
133val prop_logic_dnf_cs = mk_congset [prop_logic_dnf_CS];
134
135
136
137
138
139
140val xprop_logic_CS = merge_cs [CSFRAG
141   {rewrs  = [XPROP_LOGIC_EQUIVALENT_rewrites,
142              XPROP_LOGIC_EQUIVALENT___EXISTS___rewrites],
143    relations = [xprop_logic_equivalent_preorder],
144    dprocs = [],
145    congs  = [XPROP_LOGIC_EQUIVALENT_congs, XPROP_LOGIC_EQUIVALENT_list_congs]},
146
147    mk_list_as_set_congruence_relation_cs XPROP_LOGIC_EQUIVALENT_LIST_AS_SET_def xprop_logic_equivalent_preorder];
148
149val xprop_logic_nnf_CS = add_csfrag_rewrites xprop_logic_CS [XPROP_LOGIC_EQUIVALENT_nnf_rewrites];
150
151val xprop_logic_dnf_CS = add_csfrag_rewrites xprop_logic_nnf_CS [XPROP_LOGIC_EQUIVALENT_dnf_rewrites, XP_EQUIV_def, XP_IMPL_def, XP_COND_def];
152
153
154val xprop_logic_cs = mk_congset [xprop_logic_CS];
155val xprop_logic_nnf_cs = mk_congset [xprop_logic_nnf_CS];
156val xprop_logic_dnf_cs = mk_congset [xprop_logic_dnf_CS];
157
158
159
160
161
162
163
164
165
166
167val ltl_CS = CSFRAG
168   {rewrs  = [LTL_EQUIVALENT_bool_rewrites, LTL_EQUIVALENT_true_false_rewrites,
169      GSYM LTL_TRUE_def, GSYM LTL_FALSE_def, LTL_EQUIVALENT_homogeneous_conj_disj_rewrites],
170    relations = [ltl_equivalent_preorder],
171    dprocs = [],
172    congs  = [LTL_EQUIVALENT_congs]};
173
174val ltl_nnf_CS = add_csfrag_rewrites ltl_CS [LTL_EQUIVALENT_nnf_rewrites, LTL_SWHILE_def,
175LTL_WHILE_def, LTL_PSWHILE_def, LTL_PWHILE_def];
176
177
178val ltl_cs = cs_addfrag prop_logic_cs ltl_CS;
179val ltl_nnf_cs = cs_addfrag prop_logic_nnf_cs ltl_nnf_CS;
180
181end
182