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