|
| 1 | + |
| 2 | +:- dynamic(maybe_optimize_prolog_term/4). |
| 3 | +:- dynamic(maybe_optimize_prolog_assertion/4). |
| 4 | + |
| 5 | +try_optimize_prolog(Y,Convert,Optimized):- fail, |
| 6 | + once(catch_warn(maybe_optimize_prolog_assertion(Y,[],Convert,OptimizedM))),Convert\=@=OptimizedM,!, |
| 7 | + try_optimize_prolog(Y, OptimizedM,Optimized). |
| 8 | +try_optimize_prolog(_,Optimized,Optimized). |
| 9 | + |
| 10 | + |
| 11 | +try_harder_optimize_prolog(Y,Convert,Optimized):- fail, |
| 12 | + once(catch_warn(maybe_optimize_prolog_assertion(Y,[],Convert,OptimizedM))),Convert\=@=OptimizedM,!, |
| 13 | + try_harder_optimize_prolog(OptimizedM,Optimized). |
| 14 | +try_harder_optimize_prolog(_,Optimized,Optimized). |
| 15 | + |
| 16 | +/* |
| 17 | +try_optimize_prolog(Y,Convert,Optimized):- |
| 18 | + catch_warn(maybe_optimize_prolog_assertion(Y,[],Convert,MaybeOptimized)), |
| 19 | + actual_change(Convert,MaybeOptimized),!, |
| 20 | + try_optimize_prolog(Y,MaybeOptimized,Optimized). |
| 21 | +*/ |
| 22 | + |
| 23 | +optimize_prolog_term(_,_,Converted,Optimized):- \+ compound(Converted),!,Converted=Optimized. |
| 24 | +optimize_prolog_term(Y,FL,Converted,Optimized):- |
| 25 | + copy_term(Converted,ConvertedC), |
| 26 | + maybe_optimize_prolog_term(Y,FL,Converted,Optimized), |
| 27 | + \+ ((ConvertedC\=@=ConvertedC, |
| 28 | + (debug_info(double_sided_unification,t(ConvertedC\=@=ConvertedC)))),ignore((trace,throw(double_sided_unification)))),!. |
| 29 | +optimize_prolog_term(Y,FL,Converted,Optimized):- is_list(Converted), |
| 30 | + maplist(optimize_prolog_term(Y,[list()|FL]),Converted,Optimized),!. |
| 31 | +optimize_prolog_term(Y,FL,Converted,Optimized):- |
| 32 | + compound_name_arguments(Converted,F,Args), |
| 33 | + maplist(optimize_prolog_term(Y,[F|FL]),Args,OArgs), |
| 34 | + compound_name_arguments(Optimized,F,OArgs), !. |
| 35 | +optimize_prolog_term(_,_,Prolog,Prolog). |
| 36 | + |
| 37 | + |
| 38 | +actual_change(Body,BodyNew):- copy_term(Body+BodyNew,BodyC+BodyNewC,_), BodyC\=@=BodyNewC. |
| 39 | + |
| 40 | +maybe_optimize_prolog_assertion(Y,Stack,Cmpd,(:-BodyNew)):- compound(Cmpd),(:-Body)=Cmpd,compound(Body),!, |
| 41 | + maybe_optimize_prolog_assertion(Y,Stack,(cl:-Body),(cl:-BodyNew)). |
| 42 | + |
| 43 | +maybe_optimize_prolog_assertion(_,_,CmpdIn,(Cl:-BodyNew)):- |
| 44 | + compound(CmpdIn),subst_vars(CmpdIn,Cmpd), |
| 45 | + (Cl:-Body)=Cmpd,compound(Body),%copy_term(Body,BodyC), |
| 46 | + must_optimize_whole_body(Cl,Body,BodyNew). |
| 47 | + |
| 48 | +must_optimize_whole_body(Head, Body, BodyNew) :- %fail, |
| 49 | + term_variables(Body, Vars), |
| 50 | + member(Var,Vars), |
| 51 | + % Count variable usage across full term (Includes Head) |
| 52 | + var_count_in_term(Head+Body,Var,Count), |
| 53 | + %copy_term(Body,BodyC), |
| 54 | + inline_var_maybe(Var, Count, Body, BodyNew), Body \=@= BodyNew, !. |
| 55 | + |
| 56 | +must_optimize_whole_body(_Cl, Body, BodyNew) :- fail, |
| 57 | + sub_term_safely(Sub, Body), compound(Sub), Sub = (L = R), |
| 58 | + L==R, subst001(Body, Sub , true, BodyNew), !. |
| 59 | + |
| 60 | +must_optimize_whole_body(Cl, Body, BodyNew) :- % fail, |
| 61 | + optimize_body(Cl, Body, BodyNew). |
| 62 | + |
| 63 | + |
| 64 | + |
| 65 | + |
| 66 | +must_optimize_body(A,B,CC):- once(optimize_body(A,B,C)), C \=@= B,!, must_optimize_body(A,C,CC). |
| 67 | +must_optimize_body(_,B,C):- B =C. |
| 68 | + |
| 69 | +optimize_body(_HB,Body,Body):- skip_mizer,!. |
| 70 | +optimize_body(_HB,Body,BodyNew):- is_nsVar(Body),!,Body=BodyNew. |
| 71 | +%optimize_body( HB,u_assign(VT,R),u_assign(VT,R)):-!, must_optimize_body(HB,VT,VTT). |
| 72 | +optimize_body( HB,with_space(V,T),with_space(V,TT)):-!, must_optimize_body(HB,T,TT). |
| 73 | +optimize_body( HB,call(T),call(TT)):-!, must_optimize_body(HB,T,TT). |
| 74 | +optimize_body( HB,rtrace_on_error(T),rtrace_on_error(TT)):-!, must_optimize_body(HB,T,TT). |
| 75 | +optimize_body( HB,limit(V,T),limit(V,TT)):-!, must_optimize_body(HB,T,TT). |
| 76 | +optimize_body( HB,findall_ne(V,T,R),findall_ne(V,TT,R)):-!, |
| 77 | + expand_to_hb(HB,H,_), must_optimize_body((H:-findall_ne(V,T,R)),T,TT). |
| 78 | +optimize_body( HB,findall(V,T,R),findall(V,TT,R)):-!, |
| 79 | + expand_to_hb(HB,H,_), |
| 80 | + must_optimize_body((H:-findall(V,T,R)),T,TT). |
| 81 | +optimize_body( HB,loonit_assert_source_tf(V,T,R3,R4), |
| 82 | + loonit_assert_source_tf(V,TT,R3,R4)):-!, |
| 83 | + must_optimize_body(HB,T,TT). |
| 84 | +optimize_body( HB,loonit_assert_source_empty(V,X,Y,T,R3,R4), |
| 85 | + loonit_assert_source_empty(V,X,Y,TT,R3,R4)):-!, |
| 86 | + must_optimize_body(HB,T,TT). |
| 87 | + |
| 88 | +optimize_body( HB,(B1*->B2;B3),(BN1*->BN2;BN3)):-!, must_optimize_body(HB,B1,BN1), optimize_body(HB,B2,BN2), optimize_body(HB,B3,BN3). |
| 89 | +optimize_body( HB,(B1->B2;B3),(BN1->BN2;BN3)):-!, must_optimize_body(HB,B1,BN1), must_optimize_body(HB,B2,BN2), must_optimize_body(HB,B3,BN3). |
| 90 | +optimize_body( HB,(B1:-B2),(BN1:-BN2)):-!, optimize_body(HB,B1,BN1), optimize_body(HB,B2,BN2). |
| 91 | +optimize_body( HB,(B1*->B2),(BN1*->BN2)):-!, must_optimize_body(HB,B1,BN1), optimize_body(HB,B2,BN2). |
| 92 | +optimize_body( HB,(B1->B2),(BN1*->BN2)):-!, must_optimize_body(HB,B1,BN1), optimize_body(HB,B2,BN2). |
| 93 | +optimize_body( HB,(B1;B2),(BN1;BN2)):-!, optimize_body(HB,B1,BN1), optimize_body(HB,B2,BN2). |
| 94 | +optimize_body( HB,(B1,B2),(BN1)):- optimize_conjuncts(HB,(B1,B2),BN1). |
| 95 | +%optimize_body(_HB,==(Var, C), Var=C):- self_eval(C),!. |
| 96 | +optimize_body( HB,u_assign(A,B),R):- optimize_u_assign_1(HB,A,B,R),!. |
| 97 | +optimize_body( HB,eval(A,B),R):- optimize_u_assign_1(HB,A,B,R),!. |
| 98 | +%optimize_body(_HB,u_assign(A,B),u_assign(AA,B)):- p2s(A,AA),!. |
| 99 | +optimize_body(_HB,Body,BodyNew):- optimize_body_unit(Body,BodyNew). |
| 100 | + |
| 101 | +optimize_body_unit(I,O):- |
| 102 | + copy_term(I,II), |
| 103 | + optimize_unit1(I,Opt),I=@=II,!, |
| 104 | + optimize_body_unit(Opt,O). |
| 105 | +optimize_body_unit(O,O). |
| 106 | + |
| 107 | + |
| 108 | +ok_to_append('$VAR'):- !, fail. |
| 109 | +ok_to_append(_). |
| 110 | + |
| 111 | +number_wang(A,B,C):- |
| 112 | + (numeric(C);numeric(A);numeric(B)),!, |
| 113 | + maplist(numeric_or_var,[A,B,C]), |
| 114 | + maplist(decl_numeric,[A,B,C]),!. |
| 115 | + |
| 116 | + |
| 117 | + |
| 118 | +optimize_u_assign_1(_,Var,_,_):- is_nsVar(Var),!,fail. |
| 119 | + |
| 120 | + |
| 121 | +optimize_u_assign_1(_HB,[H|T],R,Code):- symbol(H),length([H|T],Arity), |
| 122 | + predicate_arity(F,A),Arity==A, \+ (predicate_arity(F,A2),A2\=A), |
| 123 | + append([H|T],[R],ArgsR),Code=..ArgsR,!. |
| 124 | +optimize_u_assign_1(HB,Compound,R,Code):- \+ compound(Compound),!, optimize_u_assign(HB,Compound,R,Code). |
| 125 | +optimize_u_assign_1(HB,[H|T],R,Code):- !, optimize_u_assign(HB,[H|T],R,Code). |
| 126 | +optimize_u_assign_1(_ ,Compound,R,Code):- |
| 127 | + is_list(R),var(Compound), |
| 128 | + into_u_assign(R,Compound,Code),!. |
| 129 | + |
| 130 | +optimize_u_assign_1(_,Compound,R,Code):- ar2p(Compound,R,Code),!. |
| 131 | +optimize_u_assign_1(_,Compound,R,Code):- |
| 132 | + compound(Compound), |
| 133 | + as_functor_args(Compound,F,N0), N is N0 +1, |
| 134 | + (predicate_arity(F,N); functional_predicate_arg(F, N, N)), |
| 135 | + append_term_or_call(Compound,R,Code). |
| 136 | +optimize_u_assign_1(HB,Compound,R,Code):- p2s(Compound,MeTTa), optimize_u_assign(HB,MeTTa,R,Code). |
| 137 | +%optimize_u_assign_1(_,[Pred| ArgsL], R, u_assign([Pred| ArgsL],R)). |
| 138 | + |
| 139 | +append_term_or_call([F|Compound],R,Code):- symbol(F), |
| 140 | + is_list(Compound),append(Compound,[R],CodeL), |
| 141 | + Code=..[F|CodeL],!. |
| 142 | +append_term_or_call(F,R,Code):- symbol(F),!, Code=..[F,R]. |
| 143 | +append_term_or_call(F,R,Code):- append_term(F,R,Code),!. |
| 144 | +append_term_or_call(F,R,call(F,R)). |
| 145 | + |
| 146 | + |
| 147 | +optimize_unit1( |
| 148 | + eval_true([==, ['get-metatype', A], 'Expression']), |
| 149 | + call('get-metatype',A,'Expression')). |
| 150 | + |
| 151 | +optimize_unit1( eval_true([==, [GM, Eval], Val]), call(GM,Eval,Val)):- |
| 152 | + symbol(GM), predicate_arity(GM,2), \+ predicate_arity(GM,1), |
| 153 | + symbol(Val),var(Eval),!. |
| 154 | + |
| 155 | +optimize_unit1( ==([GM,Eval],Val,C), call(GM,Eval,Val)):- C==Eval, |
| 156 | + symbol(GM), predicate_arity(GM,2), \+ predicate_arity(GM,1), |
| 157 | + symbol(Val),var(Eval),!. |
| 158 | + |
| 159 | +optimize_u_assign(_,[Var|_],_,_):- is_nsVar(Var),!,fail. |
| 160 | +optimize_u_assign(_,[Empty], _, (!,fail)):- Empty == empty,!. |
| 161 | +optimize_u_assign(_,[EqEq,[GM,Eval],Val],C, call(GM,Eval,Val)):- |
| 162 | + EqEq == '==',C==Eval, |
| 163 | + symbol(GM), predicate_arity(GM,2), \+ predicate_arity(GM,1), |
| 164 | + symbol(Val),var(Eval),!. |
| 165 | + |
| 166 | + |
| 167 | +optimize_u_assign(_,[+, A, B], C, plus(A , B, C)):- number_wang(A,B,C), !. |
| 168 | +optimize_u_assign(_,[-, A, B], C, plus(B , C, A)):- number_wang(A,B,C), !. |
| 169 | +optimize_u_assign(_,[+, A, B], C, +(A , B, C)):- !. |
| 170 | +optimize_u_assign(_,[-, A, B], C, +(B , C, A)):- !. |
| 171 | +optimize_u_assign(_,[*, A, B], C, *(A , B, C)):- number_wang(A,B,C), !. |
| 172 | +optimize_u_assign(_,['/', A, B], C, *(B , C, A)):- number_wang(A,B,C), !. |
| 173 | +optimize_u_assign(_,[*, A, B], C, *(A , B, C)):- !. |
| 174 | +optimize_u_assign(_,['/', A, B], C, *(B , C, A)):- !. |
| 175 | +optimize_u_assign(_,[fib, B], C, fib(B, C)):- !. |
| 176 | +optimize_u_assign(_,[fib1, A,B,C,D], R, fib1(A, B, C, D, R)):- !. |
| 177 | +optimize_u_assign(_,['pragma!',N,V],Empty,set_option_value_interp(N,V)):- |
| 178 | + nonvar(N),ignore((fail,Empty='Empty')), !. |
| 179 | +optimize_u_assign((H:-_),Filter,A,filter_head_arg(A,Filter)):- fail, compound(H), arg(_,H,HV), |
| 180 | + HV==A, is_list(Filter),!. |
| 181 | +optimize_u_assign(_,[+, A, B], C, '#='(C , A + B)):- number_wang(A,B,C), !. |
| 182 | +optimize_u_assign(_,[-, A, B], C, '#='(C , A - B)):- number_wang(A,B,C), !. |
| 183 | +optimize_u_assign(_,[match,KB,Query,Template], R, Code):- match(KB,Query,Template,R) = Code. |
| 184 | + |
| 185 | +optimize_u_assign(HB,MeTTaEvalP, R, Code):- \+ is_nsVar(MeTTaEvalP), |
| 186 | + compound_non_cons(MeTTaEvalP), p2s(MeTTaEvalP,MeTTa), |
| 187 | + MeTTa\=@=MeTTaEvalP,!, optimize_body(HB, u_assign(MeTTa, R), Code). |
| 188 | + |
| 189 | +% optimize_u_assign(_,_,_,_):- !,fail. |
| 190 | +optimize_u_assign((H:-_),[Pred| ArgsL], R, Code):- var(R), symbol(Pred), ok_to_append(Pred), |
| 191 | + append([Pred| ArgsL],[R], PrednArgs),Code=..PrednArgs, |
| 192 | + (H=..[Pred|_] -> nop(set_option_value('tabling',true)) ; current_predicate(_,Code)),!. |
| 193 | + |
| 194 | +p2s(P,S):- into_list_args(P,S). |
| 195 | + |
| 196 | +get_decl_type(N,DT):- attvar(N),get_atts(N,AV),sub_term(DT,AV),symbol(DT). |
| 197 | + |
| 198 | +numeric(N):- number(N),!. |
| 199 | +numeric(N):- compound(N), !, fail. |
| 200 | +numeric(N):- get_attr(N,'Number','Number'). |
| 201 | +numeric(N):- get_decl_type(N,DT),(DT=='Int',DT=='Number'). |
| 202 | +decl_numeric(N):- numeric(N),!. |
| 203 | +decl_numeric(N):- ignore((var(N),put_attr(N,'Number','Number'))). |
| 204 | +numeric_or_var(N):- var(N),!. |
| 205 | +numeric_or_var(N):- numeric(N),!. |
| 206 | +numeric_or_var(N):- \+ compound(N),!,fail. |
| 207 | +numeric_or_var('$VAR'(_)). |
| 208 | + |
| 209 | +non_compound(S):- \+ compound(S). |
| 210 | + |
| 211 | +did_optimize_conj(Head,B1,B2,B12):- optimize_conj(Head,B1,B2,B12), B12\=@=(B1,B2),!. |
| 212 | + |
| 213 | +optimize_conjuncts(Head,(B1,B2,B3),BN):- B3\=(_,_), |
| 214 | + did_optimize_conj(Head,B2,B3,B23), |
| 215 | + must_optimize_body(Head,(B1,B23),BN), !. |
| 216 | +optimize_conjuncts(Head,(B1,B2,B3),BN):- |
| 217 | + did_optimize_conj(Head,B1,B2,B12), |
| 218 | + must_optimize_body(Head,(B12,B3),BN),!. |
| 219 | +%optimize_conjuncts(Head,(B1,B2),BN1):- optimize_conj(Head,B1,B2,BN1). |
| 220 | +optimize_conjuncts(Head,(B1,B2),BN1):- did_optimize_conj(Head,B1,B2,BN1),!. |
| 221 | +optimize_conjuncts(Head,(B1*->B2),(BN1*->BN2)):- !, |
| 222 | + optimize_conjuncts(Head,B1,BN1), |
| 223 | + optimize_conjuncts(Head,B2,BN2). |
| 224 | +optimize_conjuncts(Head,(B1->B2),(BN1->BN2)):- !, |
| 225 | + optimize_conjuncts(Head,B1,BN1), |
| 226 | + optimize_conjuncts(Head,B2,BN2). |
| 227 | +optimize_conjuncts(Head,(B1;B2),(BN1;BN2)):- !, |
| 228 | + optimize_conjuncts(Head,B1,BN1), |
| 229 | + optimize_conjuncts(Head,B2,BN2). |
| 230 | +optimize_conjuncts(Head,(B1,B2),(BN1,BN2)):- !, |
| 231 | + must_optimize_body(Head,B1,BN1), must_optimize_body(Head,B2,BN2). |
| 232 | +optimize_conjuncts(_,A,A). |
| 233 | + |
| 234 | +optimize_conj(_Head, B1,B2,eval_true(E)):- |
| 235 | + B2 = is_True(True_Eval), |
| 236 | + B1 = eval(E,True_Eval1), |
| 237 | + True_Eval1 == True_Eval,!. |
| 238 | + |
| 239 | +optimize_conj(HB, RR, C=A, RR):- compound(RR),is_nsVar(C),is_nsVar(A), |
| 240 | + as_functor_args(RR,_,_,Args),is_list(Args), member(CC,Args),var(CC), CC==C, |
| 241 | + count_var(HB,C,N),N=2,C=A,!. |
| 242 | + |
| 243 | +optimize_conj(_, u_assign(Term, C), u_assign(True,CC), eval_true(Term)):- |
| 244 | + 'True'==True, CC==C. |
| 245 | +optimize_conj(_, u_assign(Term, C), is_True(CC), eval_true(Term)):- CC==C, !. |
| 246 | +optimize_conj(HB, u_assign(Term, C), C=A, u_assign(Term,A)):- is_ftVar(C),is_ftVar(A),count_var(HB,C,N),N=2,!. |
| 247 | +optimize_conj(_, u_assign(Term, C), is_True(CC), eval_true(Term)):- CC==C, !. |
| 248 | +optimize_conj(HB, B1,BT,B1):- assumed_true(HB,BT),!. |
| 249 | +optimize_conj(HB, BT,B1,B1):- assumed_true(HB,BT),!. |
| 250 | +%optimize_conj(Head, u_assign(Term, C), u_assign(True,CC), Term):- 'True'==True, |
| 251 | +% optimize_conj(Head, u_assign(Term, C), is_True(CC), CTerm). |
| 252 | +%optimize_conj(Head,B1,BT,BN1):- assumed_true(HB,BT),!, optimize_body(Head,B1,BN1). |
| 253 | +%optimize_conj(Head,BT,B1,BN1):- assumed_true(HB,BT),!, optimize_body(Head,B1,BN1). |
| 254 | +optimize_conj(Head,B1,B2,(BN1,BN2)):- |
| 255 | + optimize_body(Head,B1,BN1), optimize_body(Head,B2,BN2). |
| 256 | + |
| 257 | +assumed_true(_,_):- skip_mizer,!,fail. |
| 258 | +assumed_true(_ ,B2):- var(B2),!,fail. |
| 259 | +assumed_true(HB,eval_true(B2)):-!,assumed_true(HB,B2). |
| 260 | +assumed_true(_ ,B2):- B2==is_True('True'). |
| 261 | +assumed_true(_ ,B2):- B2=='True'. |
| 262 | +assumed_true(_ ,B2):- B2== true,!. |
| 263 | +assumed_true(_ ,B2):- B2==u_assign('True', '$VAR'('_')),!. |
| 264 | +assumed_true(HB,X==Y):- !, assumed_true(HB,X=Y). |
| 265 | +assumed_true( _,X=Y):- X==Y,!. |
| 266 | +assumed_true(HB,X=Y):- is_nsVar(X),is_nsVar(Y), |
| 267 | + ( \+ (X\=Y)),(count_var(HB,Y,2);count_var(HB,X,2)), |
| 268 | + X=Y,!. |
| 269 | + |
0 commit comments