Skip to content

Commit f8b676e

Browse files
committed
prolog/metta_lang/metta_compiler_mizer.pl
1 parent 25be5fc commit f8b676e

File tree

2 files changed

+285
-0
lines changed

2 files changed

+285
-0
lines changed
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
2+
!(import! &self json)
3+
!(assertEqual (json-encode 5) \"5\")
4+
!(assertEqual (json-encode (5 4 3)) \"[5, 4, 3]\")
5+
!(assertEqual (let $encoded (json-encode (5 4 3)) (json-decode $encoded)) (5 4 3))
6+
!(assertEqual (json-decode 5) (Error 5 BadType))
7+
!(assertEqual (json-decode \"[5, 4, 3]\") (5 4 3))
8+
!(bind! &dictspace (dict-space ((\"k1\" v1) (\"k2\" v2) (\"k3\" (4 \"a\" 5)))))
9+
!(assertEqual (let $decoded (let $encoded (json-encode &dictspace) (json-decode $encoded)) (get-keys $decoded)) (superpose (\"k1\" \"k2\" \"k3\")))
10+
!(assertEqual (json-encode True) \"true\")
11+
!(assertEqual (let $encoded (json-encode False) (json-decode $encoded)) False)
12+
!(assertEqual (json-decode \"null\") null)
13+
!(assertEqual (let $encoded (json-encode null) (json-decode $encoded)) null)
14+
!(assertEqual (json-encode symbol) \"\\\"sym!:symbol\\\"\")
15+
!(assertEqual (let $encoded (json-encode symbol) (json-decode $encoded)) symbol)
16+
!(assertEqual (let $emptyspace (new-space) (json-encode $emptyspace)) \"{}\")
Lines changed: 269 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,269 @@
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

Comments
 (0)