23:-module(liftcover,[set_lift/2,setting_lift/2,
24 induce_lift/2,induce_par_lift/2,test_lift/7,
25 op(500,fx,#),op(500,fx,'-#'),
26 test_prob_lift/6]). 27:-use_module(library(auc)). 28:-use_module(library(lists)). 29:-use_module(library(random)). 30:-use_module(library(system)). 31:-use_module(library(terms)). 32:-use_module(library(rbtrees)). 33:-use_module(library(apply)). 34:-absolute_file_name(library(lbfgs),F,[solutions(all)]),atomic_concat(F,'.pl',Fpl),exists_file(Fpl),use_module(library(lbfgs));true. 36:-set_prolog_flag(unknown,warning). 37
40
41
42:- dynamic lift_input_mod/1. 43
44:- thread_local v/3, lift_input_mod/1, local_setting/2, rule_lift_n/1. 45
46:- meta_predicate induce_lift(:,-). 47:- meta_predicate induce_rules(:,-). 48:- meta_predicate induce_par_lift(:,-). 49:- meta_predicate induce_parameters(:,-). 50
51
52
53:- meta_predicate test_lift(:,+,-,-,-,-,-). 54:- meta_predicate test_prob_lift(:,+,-,-,-,-). 55:- meta_predicate set_lift(:,+). 56:- meta_predicate setting_lift(:,-). 57
58
59
60
61
62
63
64
65default_setting_lift(eps,0.0001).
66default_setting_lift(eps_f,0.00001).
67
68
70default_setting_lift(random_restarts_number,1).
71default_setting_lift(iter,-1).
72default_setting_lift(d,1).
73default_setting_lift(verbosity,1).
74default_setting_lift(logzero,log(0.000001)).
75default_setting_lift(megaex_bottom,1).
76default_setting_lift(initial_clauses_per_megaex,1).
77default_setting_lift(max_iter,10).
78default_setting_lift(max_var,4).
79default_setting_lift(maxdepth_var,2).
80default_setting_lift(beamsize,100).
81default_setting_lift(max_body_length,100).
82default_setting_lift(neg_literals,false).
83
84default_setting_lift(specialization,bottom).
86
87default_setting_lift(seed,rand(10,1231,3032)).
88default_setting_lift(neg_ex,cw).
89
90
91default_setting_lift(epsilon_parsing, 1e-5).
92
93
94
95
96default_setting_lift(zero,0.000001).
97default_setting_lift(minus_infinity,-1.0e20).
98
99default_setting_lift(regularization,l1). 100default_setting_lift(gamma,10). 101default_setting_lift(ab,[0,10]). 102default_setting_lift(min_probability,1e-5). 103default_setting_lift(parameter_learning,em). 104default_setting_lift(max_initial_weight,0.5). 105
106default_setting_lift(parameter_update,fixed_learning_rate). 107default_setting_lift(eta,1). 108default_setting_lift(adam_params,[0.001,0.9,0.999,1e-8]).
117induce_lift(TrainFolds,P):-
118 induce_rules(TrainFolds,P0),
119 rules2terms(P0,P).
130test_lift(P,TestFolds,LL,AUCROC,ROC,AUCPR,PR):-
131 test_prob_lift(P,TestFolds,_NPos,_NNeg,LL,LG),
132 compute_areas_diagrams(LG,AUCROC,ROC,AUCPR,PR).
143test_prob_lift(M:P,TestFolds,NPos,NNeg,CLL,Results) :-
144 write2(M,'Testing\n'),
145 make_dynamic(M),
146 process_clauses(P,M,PRules),
147 generate_clauses(PRules,M,0,[],Prog),
148 (M:bg(RBG0)->
149 process_clauses(RBG0,M,RBG),
150 generate_clauses_bg(RBG,ClBG),
151 assert_all(ClBG,M,ClBGRef)
152 ;
153 true
154 ),
155 findall(Exs,(member(F,TestFolds),M:fold(F,Exs)),L),
156 append(L,DB),
157 test_no_area(DB,M,Prog,NPos,NNeg,CLL,Results),
158 (M:bg(RBG0)->
159 retract_all(ClBGRef)
160 ;
161 true
162 ).
163
164induce_rules(M:Folds,R):-
165 make_dynamic(M),
166 M:local_setting(seed,Seed),
167 setrand(Seed),
168 findall(Exs,(member(F,Folds),M:fold(F,Exs)),L),
169 append(L,DB),
170 (M:bg(RBG0)->
171 process_clauses(RBG0,M,RBG),
172 generate_clauses_bg(RBG,ClBG),
173 assert_all(ClBG,M,ClBGRef)
174 ;
175 true
176 ),
177 find_ex(DB,M,Pos,Neg,NPos,_Neg),
178 M:local_setting(megaex_bottom, NumMB),
179 (NPos >= NumMB ->
180 true
181 ;
182 format2(M,"~nWARN: Number of required bottom clauses is greater than the number of training examples!~n. The number of required bottom clauses will be equal to the number of training examples", []),
183 M:set_lift(megaex_bottom, NPos)
184 ),
185 statistics(walltime,[_,_]),
186 (M:local_setting(specialization,bottom)->
187 M:local_setting(megaex_bottom,MB),
188 deduct(MB,M,DB,[],InitialTheory),
189 length(InitialTheory,_LI),
190 remove_duplicates(InitialTheory,R1)
191 ;
192 get_head_atoms(O,M),
193 generate_top_cl(O,M,R1)
194 ),
195 learn_struct(Pos,Neg,M,R1,R2,Score),
196 sort_rules(R2,R),
197 statistics(walltime,[_,WT]),
198 WTS is WT/1000,
199 write2(M,'\n\n'),
200 format2(M,'/* Final score ~f~n',[Score]),
201 format2(M,'Wall time ~f */~n',[WTS]),
202 write_rules2(M,R,user_output),
203 (M:bg(RBG0)->
204 retract_all(ClBGRef)
205 ;
206 true
207 ),
208 retractall(M:ref_clause(_)),
209 retractall(M:ref(_)).
210
211sort_rules(P0,P):-
212 maplist(to_pair,P0,P1),
213 sort(1,@>=,P1,P2),
214 maplist(to_pair,P,P2).
215
216to_pair(rule(N,[H:P|R],BL,Lit),P-rule(N,[H:P|R],BL,Lit)).
217
218
219make_dynamic(M):-
220 M:(dynamic int/1),
221 findall(O,M:output(O),LO),
222 findall(I,M:input(I),LI),
223 findall(I,M:input_cw(I),LIC),
224 findall(D,M:determination(D,_DD),LDH),
225 findall(DD,M:determination(_D,DD),LDD),
226 findall(DH,(M:modeh(_,_,_,LD),member(DH,LD)),LDDH),
227 append([LO,LI,LIC,LDH,LDD,LDDH],L0),
228 remove_duplicates(L0,L),
229 maplist(to_dyn(M),L).
230
231to_dyn(M,P/A):-
232 A1 is A+1,
233 M:(dynamic P/A1),
234 A2 is A1+1,
235 M:(dynamic P/A2).
236
237
238
239learn_struct(Pos,Neg,Mod,Beam,R,Score):- 240 format2(Mod,"Clause search~n~n",[]),
241 Mod:local_setting(max_iter,M),
242 cycle_beam(Beam,Mod,Pos,Neg,[],CL,[],_BG,M),
243 maplist(get_cl,CL,LC),
244 write2(Mod,"Final parameter learning"),nl2(Mod),
245 learn_param(LC,Mod,Pos,Neg,R1,Score),
246 (Mod:local_setting(regularization,no)->
247 R=R1
248 ;
249 Mod:local_setting(min_probability,Min_prob),
250 remove_clauses(R1,Min_prob,R,Num),
251 length(R1,NumBR),
252 NumRem is NumBR-Num,
253 format2(Mod,"Rules: ~d~nAfter removing rules with small parameters ~d~n ",[NumBR,NumRem])
254 ),
255 format2(Mod,"Best target theory~n~n",[]),
256 write_rules2(Mod,R,user_output).
257
258get_cl((C,_),C).
259
260pick_first(0,_,[]):-!.
261
262pick_first(_,[],[]):-!.
263
264pick_first(N,[(H,_S)|T],[H|T1]):-
265 N1 is N-1,
266 pick_first(N1,T,T1).
267
268remove_score([],[]).
269
270remove_score([(H,_S)|T],[H|T1]):-
271 remove_score(T,T1).
272
273cycle_structure([],_Mod,R,S,_SP,_Pos,_Neg,R,S,_I):-!. 274
275cycle_structure(_CL,_Mod,R,S,_SP,_Pos,_Neg,R,S,0):-!. 276
277cycle_structure([(RH,_CLL)|RT],Mod,R0,S0,SP0,Pos,Neg,R,S,M):-
278 already_scored([RH|R0],R3,Mod,Score),!,
279 format2(Mod,"Theory iteration ~d~n~n",[M]),
280 write3(Mod,'Already scored, updated refinement\n'),
281 write_rules3(Mod,R3,user_output),
282 write3(Mod,'Score '),write3(Mod,Score),write3(Mod,'\n\n\n'),
283 (Score>S0->
284 R4=R3,
285 S4=Score,
286 SP1=S0
287 ;
288 R4=R0,
289 S4=S0,
290 SP1=SP0
291 ),
292 M1 is M-1,
293 cycle_structure(RT,Mod,R4,S4,SP1,Pos,Neg,R,S,M1).
294
295cycle_structure([(RH,_Score)|RT],Mod,R0,S0,SP0,Pos,Neg,R,S,M):-
296 format2(Mod,"Theory iteration ~d~n~n",[M]),
297 format3(Mod,"Initial theory~n~n",[]),
298 write_rules3(Mod,[RH|R0],user_output),
299 learn_param([RH|R0],Mod,Pos,Neg,R3,Score),
300 format3(Mod,"Score after parameter learning = ~f~n",[Score]),
301 write3(Mod,'Updated Theory\n'),
302 write_rules3(Mod,R3,user_output), 303 (Score>S0->
304 R4=R3,
305 S4=Score,
306 SP1=S0,
307 write3(Mod,'New best score\n')
308 ;
309 R4=R0,
310 S4=S0,
311 SP1=SP0
312 ),
313 store_refinement([RH|R0],R3,Mod,Score),
314 M1 is M-1,
315 cycle_structure(RT,Mod,R4,S4,SP1,Pos,Neg,R,S,M1).
316
317
318init_gd_par(0,_Max,[]):-!.
319
320init_gd_par(I,Max,[W|TW]):-
321 I1 is I-1,
322 W is -Max+random_float*2*Max,
323 init_gd_par(I1,Max,TW).
324
325init_par(_Env,0):-!.
326
327init_par(Env,I):-
328 I1 is I-1,
329 optimizer_set_x(Env,I1,0.5),
330 init_par(Env,I1).
331
332evaluate_L(Env,M,MIP,MI,L):-
333 compute_likelihood_pos(MIP,Env,M,0,0,LP),
334 compute_likelihood_neg(MI,Env,M,LN),
335 compute_likelihood(LN,M,LP,L).
336
337gen_initial_counts(0,[]):-!.
338
339gen_initial_counts(N0,[0|MIP0]):-
340 N1 is N0-1,
341 gen_initial_counts(N1,MIP0).
342
343evaluate(Env,L,_N,_Step,[M,MIP,MI]):-
346 compute_likelihood_pos(MIP,Env,M,0,0,LP),
347 compute_likelihood_neg(MI,Env,M,LN),
348 compute_likelihood(LN,M,LP,L),
349 compute_grad(MIP,Env,M,0,MI,LN).
350
351compute_grad([],_Env,_M,_N,_MI,_LN):-!.
352
353compute_grad([HMIP|TMIP],Env,M,N0,MI,LN):-
354 compute_sum_neg(MI,M,LN,N0,0,S),
355 optimizer_get_x(Env,N0,P0),
356 M:local_setting(zero,Zero),
357 (P0=<0 ->
358 PI=Zero
359 ;
360 (P0>=1.0->
361 PI is 1.0-Zero
362 ;
363 PI=P0
364 )
365 ),
366
367 (PI=:= 1.0->
368 G is 1.0/Zero
369 ;
370 G is (HMIP-S)/(1.0-PI)
371 ),
372 optimizer_set_g(Env,N0,G),
373 N1 is N0+1,
374 compute_grad(TMIP,Env,M,N1,MI,LN).
375
376compute_sum_neg([],_M,_LN,_I,S,S).
377
378compute_sum_neg([HMI|TMI],M,[HLN|TLN],I,S0,S):-
379 nth0(I,HMI,MIR),
380 Den is 1.0-exp(-HLN),
381 M:local_setting(zero,Zero),
382 (Den=<0.0->
383 Den1 is Zero
384 ;
385 Den1 = Den
386 ),
387 S1 is S0+MIR*exp(-HLN)/Den1,
388 compute_sum_neg(TMI,M,TLN,I,S1,S).
389
390compute_likelihood([],_M,L,L).
391
392compute_likelihood([HP|TP],M,L0,L):-
393 A is 1.0-exp(-HP),
394 M:local_setting(zero,Zero),
395 (A=<0.0->
396 A1 is Zero
397 ;
398 A1=A
399 ),
400 L1 is L0-log(A1),
401 compute_likelihood(TP,M,L1,L).
402
403compute_likelihood_neg([],_Env,_M,[]).
404
405compute_likelihood_neg([HMI|TMI],Env,M,[HLN|TLN]):-
406 compute_likelihood_pos(HMI,Env,M,0,0,HLN),
407 compute_likelihood_neg(TMI,Env,M,TLN).
408
409compute_likelihood_pos([],_Env,_M,_,LP,LP).
410
411compute_likelihood_pos([HMIP|TMIP],Env,M,I,LP0,LP):-
412 optimizer_get_x(Env,I,P0),
413 M:local_setting(zero,Zero),
414 (P0=<0.0 ->
415 P=Zero
416 ;
417 (P0>=1.0->
418 P is 1-Zero
419 ;
420 P=P0
421 )
422 ),
423 LP1 is LP0-log(1-P)*HMIP,
424 I1 is I+1,
425 compute_likelihood_pos(TMIP,Env,M,I1,LP1,LP).
426
427progress(_Env,FX,X_Norm,G_Norm,Step,_N,Iteration,Ls,0,[M|_]) :-
428 format3(M,'~d. Iteration : f(X)=~4f |X|=~4f
429 |g(X)|=~4f Step=~4f Ls=~4f~n',
430 [Iteration,FX,X_Norm,G_Norm,Step,Ls]).
431
432gen_par(NC,NC,[]):-!.
433
434gen_par(N0,NC,[[N0,[0.5,0.5]]|T]):-
435 N1 is N0+1,
436 gen_par(N1,NC,T).
437
438
439logistic(X,Sigma_X):-
440 Sigma_X is 1/(1+exp(-X)).
448induce_par_lift(Folds,ROut):-
449 induce_parameters(Folds,R),
450 rules2terms(R,ROut).
451
452induce_parameters(M:Folds,R):-
453 make_dynamic(M),
454 M:local_setting(seed,Seed),
455 setrand(Seed),
456 findall(Exs,(member(F,Folds),M:fold(F,Exs)),L),
457 append(L,DB),
458 statistics(walltime,[_,_]),
459 (M:bg(RBG0)->
460 process_clauses(RBG0,M,RBG),
461 generate_clauses_bg(RBG,ClBG),
462 assert_all(ClBG,M,ClBGRef)
463 ;
464 true
465 ),
466 M:in(R00),
467 process_clauses(R00,M,R0),
468 statistics(walltime,[_,_]),
469 find_ex(DB,M,Pos,Neg,_NPos,_NNeg),
470 learn_param(R0,M,Pos,Neg,R1,Score),
471 (M:local_setting(regularization,no)->
472 R=R1
473 ;
474 M:local_setting(min_probability,Min_prob),
475 remove_clauses(R1,Min_prob,R,Num),
476 length(R1,NumBR),
477 NumRem is NumBR-Num,
478 rules2terms(R1,ROut1),
479 M:test_prob_lift(ROut1,Folds,_,_,LL1,_),
480 format2(M,"Rules: ~d~nLL ~f~n",[NumBR,LL1]),
481 rules2terms(R,ROut),
482 M:test_prob_lift(ROut,Folds,_,_,LL,_),
483 format2(M,"After removing rules with small parameters ~d~nLL ~f~n",[NumRem,LL])
484 ),
485 statistics(walltime,[_,CT]),
486 CTS is CT/1000,
487 format2(M,'/* Final score ~f~n',[Score]),
488 format2(M,'Wall time ~f */~n',[CTS]),
489 write_rules2(M,R,user_output),
490 (M:bg(RBG0)->
491 retract_all(ClBGRef)
492 ;
493 true
494 ).
495
496remove_clauses(Rules,Prob,RulesOut,Num):-
497 remove_clauses_loop(Rules,Prob,0,Num,[],RulesOut).
498
499remove_clauses_loop([],_,Num,Num,Rules,Rules):-!.
500remove_clauses_loop([Rule|Rest],Prob,NumCur,Num,RulesCur,RulesOut):-
501 Rule=rule(_N,[_Head:Par|_],_,_),
502 Par < Prob,!,
503 NumCur1 is NumCur+1,
504 remove_clauses_loop(Rest, Prob, NumCur1,Num,RulesCur, RulesOut).
505
506remove_clauses_loop([Rule|Rest],Prob,NumCur,Num,RulesCur,[Rule|RulesOut]):-
507 remove_clauses_loop(Rest, Prob, NumCur,Num,RulesCur, RulesOut).
508
509
510test_theory_neg_prob(Ex,M,Theory,MIP0,MIP):-
511 test_clause_prob(Theory,M,Ex,MIP0,MIP).
512
513test_clause_prob([],_M,_Exs,MIP,MIP).
514
515test_clause_prob([(H,B,V,_P)|Rest],M,Exs,[MIPH0|MIPT0],[MIPH|MIPT]):-
516 maplist(test_ex(V,H,B,M),Exs,L),
517 sum_list(L,MIP),
518 MIPH is MIPH0+MIP,
519 test_clause_prob(Rest,M,Exs,MIPT0,MIPT).
520
521test_ex(_V,H,B,M,E,N):-
522 findall(1,(H=E,M:B),L),
523 length(L,N).
524
525
526test_theory_pos_prob([],_M,_Theory,_N,[]).
527
528test_theory_pos_prob([Ex|Rest],M,Th,N,[MI|LMI]):-
529 gen_initial_counts(N,MI0),
530 test_clause_prob(Th,M,[Ex],MI0,MI),
531 test_theory_pos_prob(Rest,M,Th,N,LMI).
532
533learn_param([],M,_,_,[],MInf):-!,
534 M:local_setting(minus_infinity,MInf).
535
536learn_param(Program0,M,Pos,Neg,Program,LL):-
537 M:local_setting(parameter_learning,em),!,
538 generate_clauses(Program0,M,0,[],Pr1),
539 length(Program0,N),
540 gen_initial_counts(N,MIN0),
541 test_theory_neg_prob(Neg,M,Pr1,MIN0,MIN),
542 test_theory_pos_prob(Pos,M,Pr1,N,MI),
543 M:local_setting(random_restarts_number,NR),
544 random_restarts(NR,M,-1e20,LL,N,initial,Par,MI,MIN), 545 update_theory(Program0,Par,Program1),
546 maplist(remove_zero,Program1,Program2),
547 append(Program2,Program),
548 format3(M,"Final LL ~f~n",[-LL]).
549
550
551learn_param(Program0,M,Pos,Neg,Program,LL):-
552 M:local_setting(parameter_learning,gd),!,
553 generate_clauses(Program0,M,0,[],Pr1),
554 length(Program0,N),
555 gen_initial_counts(N,MIP0),
556 test_theory_neg_prob(Neg,M,Pr1,MIP0,MIP),
557 test_theory_pos_prob(Pos,M,Pr1,N,MI),
558 M:local_setting(random_restarts_number,NR),
559 random_restarts_gd(NR,M,-1e20,PLL,N,initial,Par,MI,MIP), 560 maplist(logistic,Par,Prob),
561 update_theory(Program0,Prob,Program),
562 LL is -PLL,
563 format3(M,"Final L ~f~n",[LL]).
564
565learn_param(Program0,M,Pos,Neg,Program,LL):-
566 M:local_setting(parameter_learning,lbfgs),
567 generate_clauses(Program0,M,0,[],Pr1),
568 length(Program0,N),
569 gen_initial_counts(N,MIP0),
570 test_theory_neg_prob(Neg,M,Pr1,MIP0,MIP),
571 test_theory_pos_prob(Pos,M,Pr1,N,MI),
575 optimizer_initialize(N,liftcover,evaluate,progress,[M,MIP,MI],Env),
576 init_par(Env,N),
577 evaluate_L(Env,M,MIP,MI,L),
579 IL is -L,
580 format3(M,"~nInitial L ~f~n",[IL]),
581 optimizer_run(Env,_LL,Status),
582 format3(M,"Status ~p~n",[Status]),
583 update_theory_lbfgs(Program0,Env,M,0,Program1),
584 maplist(remove_zero,Program1,Program2),
585 append(Program2,Program),
586 evaluate_L(Env,M,MIP,MI,NewL),
587 LL is -NewL,
588 format3(M,"Final L ~f~n",[LL]),
589 optimizer_finalize(Env).
590
591
592update_theory_lbfgs([],_Env,_M,_N,[]):-!.
593
594update_theory_lbfgs([rule(Name,[H:_,_],B,L)|Rest],Env,M,N,[rule(Name,[H:P,'':PN],B,L)|Rest1]):-
595 optimizer_get_x(Env,N,P0),
596 M:local_setting(zero,Zero),
597 (P0=<0.0->
598 P=Zero
599 ;
600 (P0>=1.0->
601 P is 1.0-Zero
602 ;
603 P=P0
604 )
605 ),
606 PN is 1-P,
607 N1 is N+1,
608 update_theory_lbfgs(Rest,Env,M,N1,Rest1).
609
610
611random_restarts(0,_M,Score,Score,_N,Par,Par,_MI,_MIN):-!.
612
613random_restarts(N,M,Score0,Score,NR,Par0,Par,MI,MIN):-
614 M:local_setting(random_restarts_number,NMax),
615 Num is NMax-N+1,
616 format3(M,"Restart number ~d~n~n",[Num]),
617 length(Par1,NR),
618 maplist(random,Par1),
619 M:local_setting(eps,EA),
620 M:local_setting(eps_f,ER),
621 M:local_setting(iter,Iter),
622 em_quick(EA,ER,Iter,M,NR,Par1,-1e20,MI,MIN,ParR,ScoreR),
623 format3(M,"Random_restart: Score ~f~n",[ScoreR]),
624 N1 is N-1,
625 (ScoreR>Score0->
626 random_restarts(N1,M,ScoreR,Score,NR,ParR,Par,MI,MIN)
627 ;
628 random_restarts(N1,M,Score0,Score,NR,Par0,Par,MI,MIN)
629 ).
630
631random_restarts_gd(0,_M,Score,Score,_N,Par,Par,_MI,_MIN):-!.
632
633random_restarts_gd(N,M,_Score0,Score,NR,_Par0,Par,MI,MIN):-
634 M:local_setting(random_restarts_number,NMax),
635 Num is NMax-N+1,
636 format3(M,"Restart number ~d~n~n",[Num]),
637 M:local_setting(max_initial_weight,Max),
638 init_gd_par(NR,Max,Par1),
639 evaluate_L_gd(M,MIN,MI,Par1,L),
640 ScoreIn is -L,
641 format3(M,"GD Random_restart: initial score ~f~n",[ScoreIn]),
642 M:local_setting(eps,EA),
643 M:local_setting(eps_f,ER),
644 M:local_setting(iter,Iter),
645 (M:local_setting(parameter_update,adam)->
646 findall(0,between(1,NR,_),M0),
647 findall(0,between(1,NR,_),M1),
648 gd_adam(EA,ER,0,Iter,M,NR,Par1,M0,M1,-1e20,MI,MIN,ParR,ScoreR)
649 ;
650 gd(EA,ER,Iter,M,NR,Par1,-1e20,MI,MIN,ParR,ScoreR)
651 ),
652 format3(M,"GD Random_restart: Score ~f~n",[ScoreR]),
653 N1 is N-1,
654 random_restarts_gd(N1,M,ScoreR,Score,NR,ParR,Par,MI,MIN).
655
656
657gd(_EA,_ER,0,_M,_NR,Par,Score,_MI,_MIP,Par,Score):-!.
658
659gd(EA,ER,Iter0,M,NR,Par0,Score0,MI,MIP,Par,Score):-
660 compute_gradient_gd(MIP,MI,M,Par0,G,LL),
661 Score1 is -LL,
662 Iter is Iter0-1,
663 Diff is Score1-Score0,
664 Fract is -Score1*ER,
665 (( Diff<EA;Diff<Fract)->
666 Score=Score1,
667 Par=Par0
668 ;
669 M:local_setting(eta,Eta),
670 M:local_setting(gamma,Gamma),
671 (M:local_setting(regularization,l2)->
672 maplist(l2,Par0,Reg)
673 ;
674 (M:local_setting(regularization,l1)->
675 maplist(l1,Par0,Reg)
676 ;
677 findall(0,between(1,NR,_),Reg)
678 )
679 ),
680 maplist(update_par(Eta,Gamma),Par0,Reg,G,Par1),
681 gd(EA,ER,Iter,M,NR,Par1,Score1,MI,MIP,Par,Score)
682 ).
683
684gd_adam(_EA,_ER,Iter,Iter,_M,_NR,Par,_M0,_M1,Score,_MI,_MIP,Par,Score):-!.
685
686gd_adam(EA,ER,Iter0,MaxIter,M,NR,Par0,M00,M10,Score0,MI,MIP,Par,Score):-
687 compute_gradient_gd(MIP,MI,M,Par0,G,LL),
688 Score1 is -LL,
689 Iter is Iter0+1,
690 Diff is Score1-Score0,
691 Fract is -Score1*ER,
692 (( Diff<EA;Diff<Fract)->
693 Score=Score1,
694 Par=Par0
695 ;
696 M:local_setting(gamma,Gamma),
697 M:local_setting(adam_params,[Eta,Beta1,Beta2,Epsilon]),
698 (M:local_setting(regularization,l2)->
699 maplist(l2,Par0,Reg)
700 ;
701 (M:local_setting(regularization,l1)->
702 maplist(l1,Par0,Reg)
703 ;
704 findall(0,between(1,NR,_),Reg)
705 )
706 ),
707 maplist(update_grad(Gamma),G,Reg,G1),
708 maplist(update_M0(Beta1),M00,G1,M0),
709 maplist(update_M1(Beta2),M10,G1,M1),
710 EtaIter is Eta*sqrt(1-Beta2^Iter)/(1-Beta1^Iter),
711 maplist(update_par_adam(EtaIter,Epsilon),Par0,M0,M1,Par1),
712 gd_adam(EA,ER,Iter,MaxIter,M,NR,Par1,M0,M1,Score1,MI,MIP,Par,Score)
713 ).
714
715update_par_adam(EtaIter,Epsilon,Par0,M0,M1,Par1):-
716 Par1 is Par0-EtaIter*M0/(sqrt(M1)+Epsilon).
717
718
719update_M0(Beta1,M00,G,M0):-
720 M0 is Beta1*M00+(1-Beta1)*G.
721
722update_M1(Beta2,M10,G,M1):-
723 M1 is Beta2*M10+(1-Beta2)*G^2.
724
725update_grad(Gamma,G,Reg,G1):-
726 G1 is G+Gamma*Reg.
727
728
729l1(W,R):-
730 logistic(W,S),
731 R is S*(1-S).
732
733l2(W,R):-
734 logistic(W,S),
735 R is 2*S^2*(1-S).
736
737update_par(Eta,Gamma,Par0,Reg,G,Par1):-
738 Par1 is Par0-Eta*(G+Gamma*Reg).
739
740
741
742evaluate_L_gd(M,MIP,MI,Par,L):-
743 maplist(logistic,Par,Prob),
744 compute_likelihood_pos_gd(MIP,Prob,M,0,LP),
746 compute_likelihood_neg_gd(MI,Prob,M,LN),
748 compute_likelihood_gd(LN,M,LP,L).
749
750
751
752compute_gradient_gd(MIP,MI,M,Par,G,L):-
753 maplist(logistic,Par,Prob),
754 compute_likelihood_pos_gd(MIP,Prob,M,0,LP),
756 compute_likelihood_neg_gd(MI,Prob,M,LN),
758 compute_likelihood_gd(LN,M,LP,L),
759
761 write4(M,'LL '),write4(M,-L),nl4(M),
762 compute_grad_gd(MIP,Prob,M,0,MI,LN,G).
764
765compute_likelihood_neg_gd([],_Prob,_M,[]).
766
767compute_likelihood_neg_gd([HMI|TMI],Prob,M,[HLN|TLN]):-
768 compute_likelihood_pos_gd(HMI,Prob,M,0,HLN),
769 compute_likelihood_neg_gd(TMI,Prob,M,TLN).
770
771compute_likelihood_pos_gd([],[],_M,LP,LP).
772
773compute_likelihood_pos_gd([HMIP|TMIP],[P|TP],M,LP0,LP):-
774 LP1 is LP0-log(1-P)*HMIP,
775 compute_likelihood_pos_gd(TMIP,TP,M,LP1,LP).
776
777
778compute_likelihood_gd([],_M,L,L).
779
780compute_likelihood_gd([HP|TP],M,L0,L):-
781 A is 1.0-exp(-HP),
782 (A=:=0.0->
783 M:local_setting(logzero,LZ),
784 L1 is L0-LZ
785 ;
786 L1 is L0-log(A)
787 ),
788 compute_likelihood_gd(TP,M,L1,L).
789
790
791compute_grad_gd([],[],_M,_N,_MI,_LN,[]):-!.
792
793compute_grad_gd([HMIP|TMIP],[P|TP],M,N0,MI,LN,[G|TG]):-
795 compute_sum_neg(MI,M,LN,N0,0,S),
797 G is (HMIP-S)*P,
798 N1 is N0+1,
799 compute_grad_gd(TMIP,TP,M,N1,MI,LN,TG).
800
801compute_sum_neg_gd([],_M,_LN,_I,S,S).
802
803compute_sum_neg_gd([HMI|TMI],M,[HLN|TLN],I,S0,S):-
806 nth0(I,HMI,MIR),
809 Den is 1.0-exp(-HLN),
810 S1 is S0+MIR*exp(-HLN)/Den,
811 compute_sum_neg_gd(TMI,M,TLN,I,S1,S).
812
813
814em_quick(_EA,_ER,0,_M,_NR,Par,Score,_MI,_MIN,Par,Score):-!.
815
816em_quick(EA,ER,Iter0,M,NR,Par0,Score0,MI,MIN,Par,Score):-
817 length(Eta0,NR),
818 expectation_quick(Par0,M,MI,MIN,Eta0,Eta,Score1),
819 maximization_quick(Eta,M,Par1),
820 Iter is Iter0-1,
821 Diff is Score1-Score0,
822 Fract is -Score1*ER,
824 (( Diff<EA;Diff<Fract)->
825 Score=Score1,
826 Par=Par1
827 ;
828 em_quick(EA,ER,Iter,M,NR,Par1,Score1,MI,MIN,Par,Score)
829 ).
830
831expectation_quick(Par,M,MI,MIN,Eta0,Eta,Score):-
832 833 M:local_setting(logzero,LogZero),
834 foldl(llm(LogZero),Par,MIN,0,LL0),
835 maplist(eta0,MIN,Eta0),
836 837 scan_pos(MI,M,Par,LL0,Eta0,Score,Eta).
838
839maximization_quick(Eta,M,Par):-
840 (M:local_setting(regularization,l1)->
841 maplist(maximize_L1(M),Eta,Par)
842 ;
843 (M:local_setting(regularization,l2)->
844 maplist(maximize_L2(M),Eta,Par)
845 ;
846 (M:local_setting(regularization,bayesian)->
847 maplist(maximize_bayesian(M),Eta,Par)
848 ;
849 maplist(maximize(M),Eta,Par)
850 )
851 )
852 ).
853
854maximize(_M,[Eta0,Eta1],Par):-
855 (Eta0+Eta1=:=0.0->
856 Par=0.0
857 ;
858 Par is Eta1/(Eta0+Eta1)
859 ).
860
861
862maximize_L1(M,[Eta0,Eta1],Par):-
863 M:local_setting(gamma,Gamma),
871 Par is 4*Eta1/(2*(Gamma+Eta0+Eta1+sqrt((Eta0+Eta1)^2+Gamma^2+2*Gamma*(Eta0-Eta1))))
873 874 .
875
876maximize_L2(M,[Eta0,Eta1],Par):-
877 M:local_setting(gamma,Gamma),
878 Sum is 3*Eta0+3*Eta1+Gamma,
879 Arccos is acos(sqrt(Gamma/Sum)*(9*Eta0/2-9*Eta1+Gamma)/(3*Eta0+3*Eta1+Gamma)),
880 Par is 2*sqrt(Sum/Gamma)*cos(Arccos/3-2*pi/3)/3+1/3.
881
882maximize_bayesian(M,[Eta0,Eta1],Par):-
883 M:local_setting(ab,[A,B]),
884 Par is (Eta1+A)/(Eta0+Eta1+A+B).
885
887
888scan_pos([],_M,_Par,LL,Eta,LL,Eta).
889
890scan_pos([MIH|MIT],M,Par,LL0,Eta0,LL,Eta):-
891 M:local_setting(logzero,LogZero),
892 foldl(rule_contrib,MIH,Par,1,Prod),
893 ProbEx is 1-Prod,
894 (ProbEx=:=0.0->
895 LLCurrent is LL0+LogZero
896 ;
897 LLCurrent is LL0+log(ProbEx)
898 ),
899 maplist(update_eta(ProbEx,M),Eta0,Par,MIH,EtaCurrent),
900 scan_pos(MIT,M,Par,LLCurrent,EtaCurrent,LL,Eta).
901
903
904update_eta(ProbEx,M,[Etai00,Etai10],Pi,MIR,[Etai0,Etai1]):-
905 M:local_setting(zero,Zero),
906 ( ProbEx=:=0.0->
907 CondP is Pi/Zero
908 ;
909 CondP is Pi/ProbEx
910 ),
911 OCondP0 is 1-CondP,
912 ( OCondP0 <0.0->
913 OCondP = 0.0
914 ;
915 OCondP = OCondP0
916 ),
917 Etai0 is Etai00+MIR*OCondP,
918 Etai1 is Etai10+MIR*CondP.
919
920rule_contrib(MIR,Pi,P0,P):-
921 P is P0*(1-Pi)^MIR.
922
923llm(LogZero,Pi,MI,LL0,LL):-
924 ((1-Pi)=:=0.0 ->
925
926 ( MI==0 ->
927 LL is LL0
928 ;
929 LL is LL0+MI*LogZero
930 )
931 ;
932 ( MI==0 ->
933 LL is LL0
934 ;
935 LL is LL0+MI*log(1-Pi)
936 )
937
938 ).
939
940eta0(MIN,[MIN,0]).
941
942
943remove_zero(rule(_Name,[_H:P,_],_B,_L),[]):-
944 local_setting(zero,Zero),
945 P=:=Zero,!.
946
947remove_zero(R,[R]).
948
949
950update_theory([],_N,[]):-!.
951
952update_theory([rule(Name,[H:_,_],B,L)|Rest],[P|T],[rule(Name,[H:P,'':PN],B,L)|Rest1]):-
953 PN is 1-P,
954 update_theory(Rest,T,Rest1).
955
956
957
958cycle_beam([],_Mod,_Pos,_Neg,CL,CL,CLBG,CLBG,_M):-!.
959
960cycle_beam(_Beam,_Mod,_Pos,_Neg,CL,CL,CLBG,CLBG,0):-!.
961
962cycle_beam(Beam,Mod,Pos,Neg,CL0,CL,CLBG0,CLBG,M):-
963 format2(Mod,"Clause iteration ~d~n~n",[M]),
964 967 cycle_clauses(Beam,Mod,Pos,Neg,[],NB,CL0,CL1,CLBG0,CLBG1),
968 M1 is M-1, 969 cycle_beam(NB,Mod,Pos,Neg,CL1,CL,CLBG1,CLBG,M1).
970
971cycle_clauses([],_M,_Pos,_Neg,NB,NB,CL,CL,CLBG,CLBG):-!.
972
973cycle_clauses([(RH,_ScoreH)|T],M,Pos,Neg,NB0,NB,CL0,CL,CLBG0,CLBG):-
979 findall(RS,specialize_rule(RH,M,RS,_L),LR),!, 980 length(LR,NR),
981 write3(M,'Number of revisions '),write3(M,NR),write3(M,'\n'),
982 score_clause_refinements(LR,M,1,NR,Pos,Neg,NB0,NB1,CL0,CL1,CLBG0,CLBG1),
983
984 cycle_clauses(T,M,Pos,Neg,NB1,NB,CL1,CL,CLBG1,CLBG).
985
986score_clause_refinements([],_M,_N,_NR,_Pos,_Neg,NB,NB,CL,CL,CLBG,CLBG).
987
988score_clause_refinements([R1|T],M,Nrev,NRef,Pos,Neg,NB0,NB,CL0,CL,CLBG0,CLBG):- 989 already_scored_clause(R1,R3,M,Score),!,
990 format3(M,'Score ref. ~d of ~d~n',[Nrev,NRef]),
991 write3(M,'Already scored, updated refinement\n'),
992 write_rules3(M,[R3],user_output),
993 write3(M,'Score '),write3(M,Score),write3(M,'\n\n\n'),
994 M:local_setting(beamsize,BS),
995 insert_in_order(NB0,(R3,Score),BS,NB1),
996 Nrev1 is Nrev+1,
997 score_clause_refinements(T,M,Nrev1,NRef,Pos,Neg,NB1,NB,CL0,CL,CLBG0,CLBG).
998
999score_clause_refinements([R1|T],M,Nrev,NRef,Pos,Neg,NB0,NB,CL0,CL,CLBG0,CLBG):-
1000 format3(M,'Score ref. ~d of ~d~n',[Nrev,NRef]),
1001 write_rules3(M,[R1],user_output),
1002 learn_param([R1],M,Pos,Neg,NewR,Score),
1003 write3(M,'Updated refinement\n'),
1004 write_rules3(M,NewR,user_output),
1005 write3(M,'Score (CLL) '),write3(M,Score),write3(M,'\n\n\n'),
1006 (NewR=[R3]->
1007 M:local_setting(beamsize,BS),
1008 insert_in_order(NB0,(R3,Score),BS,NB1),
1009 insert_in_order(CL0,(R3,Score),200,CL1),
1010 length(CL1,LCL1),
1011 format2(M,"N. of target clauses ~d~n~n",[LCL1]),
1012 store_clause_refinement(R1,R3,M,Score),
1013 Nrev1 is Nrev+1
1014 ;
1015 NB1=NB0,
1016 CL1=CL0,
1017 Nrev1=Nrev+1
1018 ),
1019 CLBG1=CLBG0,
1020 score_clause_refinements(T,M,Nrev1,NRef,Pos,Neg,NB1,NB,CL1,CL,CLBG1,CLBG).
1021
1022range_restricted(rule(_N,HL,BL,_Lit)):-
1023 term_variables(HL,VH),
1024 term_variables(BL,VB),
1025 sublisteq(VH,VB).
1026
1027sublisteq([],_).
1028
1029sublisteq([H|T],L):-
1030 member_eq(H,L),
1031 sublisteq(T,L).
1032
1033target(R,M):-
1034 get_output_preds(R,O),
1035 member(T,O),
1036 M:output(T),!.
1037
1038get_output_preds(rule(_N,HL,_BL,_Lit),O):-
1039 scan_head(HL,[],O).
1040
1041scan_head(['':_],O,O):-!.
1042scan_head([],O,O):-!.
1043scan_head([H:_P|T],O0,O):-
1044 functor(H,F,N),
1045 (member(F/N,O0)->
1046 O1=O0
1047 ;
1048 O1=[F/N|O0]
1049 ),
1050 scan_head(T,O1,O).
1051
1052
1053store_clause_refinement(Ref,RefP,M,Score):-
1054 elab_clause_ref(Ref,Ref1),
1055 assert(M:ref_clause(r(Ref1,RefP,Score))).
1056
1057store_refinement(Ref,RefP,M,Score):-
1058 elab_ref(Ref,Ref1),
1059 assert(M:ref(r(Ref1,RefP,Score))).
1060
1061already_scored_clause(R,R1,M,Score):-
1062 elab_ref([R],[rule(H,B)]),
1063 M:ref_clause(r(rule(H,B1),R1,Score)),
1064 permutation(B,B1).
1065
1066already_scored(R,R1,M,Score):-
1067 elab_ref(R,RR),
1068 M:ref(r(RR,R1,Score)).
1069
1070
1071elab_clause_ref(rule(_NR,H,B,_Lits),rule(H1,B1)):-
1072 copy_term((H,B),(H1,B1)).
1073
1074elab_ref([],[]).
1075
1076elab_ref([rule(_NR,H,B,_Lits)|T],[rule(H1,B1)|T1]):-!,
1077 copy_term((H,B),(H1,B1)),
1078 numbervars((H1,B1),0,_N),
1079 elab_ref(T,T1).
1080
1081elab_ref([def_rule(H,B,_Lits)|T],[rule(H1,B1)|T1]):-
1082 copy_term((H,B),(H1,B1)),
1083 numbervars((H1,B1),0,_N),
1084 elab_ref(T,T1).
1085
1087insert_in_order([],C,BeamSize,[C]):-
1088 BeamSize>0,!.
1089
1090insert_in_order(Beam,_New,0,Beam):-!.
1091
1092insert_in_order([(Th1,Heuristic1)|RestBeamIn],(Th,Heuristic),BeamSize,BeamOut):-
1093 Heuristic>Heuristic1,!,
1094 1095 NewBeam=[(Th,Heuristic),(Th1,Heuristic1)|RestBeamIn],
1096 length(NewBeam,L),
1097 (L>BeamSize->
1098 nth1(L,NewBeam,_Last,BeamOut)
1099 ;
1100 BeamOut=NewBeam
1101 ).
1102
1103insert_in_order([(Th1,Heuristic1)|RestBeamIn],(Th,Heuristic),BeamSize,
1104[(Th1,Heuristic1)|RestBeamOut]):-
1105 BeamSize1 is BeamSize -1,
1106 insert_in_order(RestBeamIn,(Th,Heuristic),BeamSize1,
1107 RestBeamOut).
1108
1109
1110
1111remove_int_atom_list([],[]).
1112
1113remove_int_atom_list([\+ A|T],[\+ A1|T1]):-!,
1114 A=..[F,_|Arg],
1115 A1=..[F|Arg],
1116 remove_int_atom_list(T,T1).
1117
1118remove_int_atom_list([A|T],[A1|T1]):-
1119 A=..[F,_|Arg],
1120 A1=..[F|Arg],
1121 remove_int_atom_list(T,T1).
1122
1123
1124
1125remove_int_atom(\+ A,\+ A1):-!,
1126 A=..[F,_|T],
1127 A1=..[F|T].
1128
1129remove_int_atom(A,A1):-
1130 A=..[F,_|T],
1131 A1=..[F|T].
1132
1133
1134get_heads([],[]).
1135
1136get_heads([_-H|T],[H|TN]):-
1137 get_heads(T,TN).
1138
1139randomize([],[]):-!.
1140
1141randomize([rule(N,V,NH,HL,BL,LogF)|T],[rule(N,V,NH,HL1,BL,LogF)|T1]):-
1142 length(HL,L),
1143 Int is 1.0/L,
1144 randomize_head(Int,HL,0,HL1),
1145 randomize(T,T1).
1146
1147randomize_head(_Int,['':_],P,['':PNull1]):-!,
1148 PNull is 1.0-P,
1149 (PNull>=0.0->
1150 PNull1 =PNull
1151 ;
1152 PNull1=0.0
1153 ).
1154
1155randomize_head(Int,[H:_|T],P,[H:PH1|NT]):-
1156 PMax is 1.0-P,
1157 random(0,PMax,PH1),
1158 P1 is P+PH1,
1159 randomize_head(Int,T,P1,NT).
1160
1161
1162
1163update_head([],[],_N,[]):-!.
1164
1165update_head([H:_P|T],[PU|TP],N,[H:P|T1]):-
1166 P is PU/N,
1167 update_head(T,TP,N,T1).
1168
1170
1171
1172rules2terms(R,T):-
1173 maplist(rule2term,R,T).
1174
1175rule2term(rule(_N,HL,BL,_Lit),(H:-B)):-
1176 list2or(HL,H),
1177 list2and(BL,B).
1178
1179rule2term(def_rule(H,BL,_Lit),((H:1.0):-B)):-
1180 list2and(BL,B).
1181
1182
1183write_rules([],_S).
1184
1185write_rules([rule(_N,HL,BL,Lit)|T],S):-!,
1186 copy_term((HL,BL,Lit),(HL1,BL1,Lit1)),
1187 numbervars((HL1,BL1,Lit1),0,_M),
1188 write_disj_clause(S,(HL1:-BL1)),
1189 write_rules(T,S).
1190
1191write_rules([def_rule(H,BL,Lit)|T],S):-
1192 copy_term((H,BL,Lit),(H1,BL1,Lit1)),
1193 numbervars((H1,BL1,Lit1),0,_M),
1194 write_disj_clause(S,([H1:1.0]:-BL1)),
1195 write_rules(T,S).
1196
1197
1198new_par([],[],[]).
1199
1200new_par([HP|TP],[Head:_|TO],[Head:HP|TN]):-
1201 new_par(TP,TO,TN).
1202
1203
1204
1205write_disj_clause(S,(H:-[])):-!,
1206 write_head(S,H),
1207 format(S,".~n~n",[]).
1208
1209write_disj_clause(S,(H:-B)):-
1210 write_head(S,H),
1211 format(S,' :-',[]),
1212 nl(S),
1213 write_body(S,B).
1214
1215
1216write_head(S,[A:1.0|_Rest]):-!,
1217 format(S,"~q:1.0",[A]).
1218
1219write_head(S,[A:P,'':_P]):-!,
1220 format(S,"~q:~g",[A,P]).
1221
1222write_head(S,[A:P]):-!,
1223 format(S,"~q:~g",[A,P]).
1224
1225write_head(S,[A:P|Rest]):-
1226 format(S,"~q:~g ; ",[A,P]),
1227 write_head(S,Rest).
1228
1229write_body(S,[]):-!,
1230 format(S," true.~n~n",[]).
1231
1232write_body(S,[A]):-!,
1233 format(S," ~q.~n~n",[A]).
1234
1235write_body(S,[A|T]):-
1236 format(S," ~q,~n",[A]),
1237 write_body(S,T).
1246list2or([],true):-!.
1247
1248list2or([X],X):-
1249 X\=;(_,_),!.
1250
1251list2or([H|T],(H ; Ta)):-!,
1252 list2or(T,Ta).
1262list2and([],true):-!.
1263
1264list2and([X],X):-
1265 X\=(_,_),!.
1266
1267list2and([H|T],(H,Ta)):-!,
1268 list2and(T,Ta).
1269
1270
1271deduct(0,_Mod,_DB,Th,Th):-!.
1272
1273deduct(NM,Mod,DB,InTheory0,InTheory):-
1274 get_head_atoms(O,Mod),
1275 sample_lift(1,DB,Sampled,DB1),
1276 (Sampled=[M]->
1277 generate_head(O,M,Mod,[],HL),
1278 1279 ( HL \== [] ->
1280 (generate_body(HL,Mod,InTheory1),
1281 append(InTheory0,InTheory1,InTheory2),
1282 NM1 is NM-1,
1283 deduct(NM1,Mod,DB1,InTheory2,InTheory)
1284 )
1285 ;
1286 deduct(NM,Mod,DB,InTheory0,InTheory)
1287 )
1288 ;
1289 InTheory=InTheory0
1290 ).
1291
1292
1293get_head_atoms(O,M):-
1294 findall(A,M:modeh(_,A),O).
1295
1296generate_top_cl([],_M,[]):-!.
1297
1298generate_top_cl([A|T],M,[(rule(R,[A1:0.5,'':0.5],[],true),-1e20)|TR]):-
1299 A=..[F|ArgM],
1300 keep_const(ArgM,Arg),
1301 A1=..[F|Arg],
1302 get_next_rule_number(M,R),
1303 generate_top_cl(T,M,TR).
1304
1305
1306generate_head([],_M,_Mod,HL,HL):-!.
1307
1308generate_head([A|T],M,Mod,H0,H1):-
1309 functor(A,F,N),
1310 functor(F1,F,N),
1311 F1=..[F|Arg],
1312 Pred1=..[F,M|Arg],
1313 A=..[F|ArgM],
1314 keep_const(ArgM,Arg),
1315 findall((A,Pred1),call(Mod:Pred1),L),
1316 Mod:local_setting(initial_clauses_per_megaex,IC),
1317 sample_lift(IC,L,L1),
1318 append(H0,L1,H2),
1319 generate_head(T,M,Mod,H2,H1).
1320
1321generate_head_goal([],_M,[]).
1322
1323generate_head_goal([H|T],M,[H1|T1]):-
1324 H=..[F|Arg],
1325 H1=..[F,M|Arg],
1326 generate_head_goal(T,M,T1).
1327
1328keep_const([],[]).
1329
1330keep_const([- _|T],[_|T1]):-!,
1331 keep_const(T,T1).
1332
1333keep_const([+ _|T],[_|T1]):-!,
1334 keep_const(T,T1).
1335
1336keep_const([-# _|T],[_|T1]):-!,
1337 keep_const(T,T1).
1338
1339keep_const([H|T],[H1|T1]):-
1340 H=..[F|Args],
1341 keep_const(Args,Args1),
1342 H1=..[F|Args1],
1343 keep_const(T,T1).
1354sample_lift(0,List,[],List):-!.
1355
1356sample_lift(N,List,List,[]):-
1357 length(List,L),
1358 L=<N,!.
1359
1360sample_lift(N,List,[El|List1],Li):-
1361 length(List,L),
1362 random(0,L,Pos),
1363 nth0(Pos,List,El,Rest),
1364 N1 is N-1,
1365 sample_lift(N1,Rest,List1,Li).
1366
1367sample_lift(0,_List,[]):-!.
1368
1369sample_lift(N,List,List):-
1370 length(List,L),
1371 L=<N,!.
1372
1373sample_lift(N,List,[El|List1]):-
1374 length(List,L),
1375 random(0,L,Pos),
1376 nth0(Pos,List,El,Rest),
1377 N1 is N-1,
1378 sample_lift(N1,Rest,List1).
1379
1380get_args([],[],[],A,A,AT,AT,_).
1381
1382get_args([HM|TM],[H|TH],[(H,HM)|TP],A0,A,AT0,AT,M):-
1383 HM=..[F|ArgsTypes],
1384 H=..[F,M|Args],
1385 append(A0,Args,A1),
1386 append(AT0,ArgsTypes,AT1),
1387 get_args(TM,TH,TP,A1,A,AT1,AT,M).
1388
1390
1391gen_head([],P,['':P]).
1392
1393gen_head([H|T],P,[H:P|TH]):-
1394 gen_head(T,P,TH).
1395
1396get_modeb([],_Mod,B,B).
1397
1398get_modeb([F/AA|T],Mod,B0,B):-
1399 findall((R,B),(Mod:modeb(R,B),functor(B,F,AA)),BL),
1400 (Mod:local_setting(neg_literals,true)->
1401 findall((R,(\+ B)),(Mod:modeb(R,B),functor(B,F,AA),all_plus(B)),BNL)
1402 ;
1403 BNL=[]
1404 ),
1405 append([B0,BL,BNL],B1),
1406 get_modeb(T,Mod,B1,B).
1407
1408all_plus(B):-
1409 B=..[_|Args],
1410 all_plus_args(Args).
1411
1412all_plus_args([]).
1413
1414all_plus_args([+ _ |T]):-!,
1415 all_plus_args(T).
1416
1417all_plus_args([H|T]):-
1418 H \= - _,
1419 H \= # _,
1420 H \= -# _,
1421 H=..[_|Args],
1422 all_plus_args(Args),
1423 all_plus_args(T).
1424
1425generate_body([],_Mod,[]):-!.
1426
1427generate_body([(A,H)|T],Mod,[(rule(R,[Head:0.5,'':0.5],[],BodyList),-1e20)|CL0]):-
1428 functor(A,F,AA),
1430 findall(FB/AB,Mod:determination(F/AA,FB/AB),Det),
1431 get_modeb(Det,Mod,[],BL),
1432 A=..[F|ArgsTypes],
1433 H=..[F,M|Args],
1434 Mod:local_setting(d,D),
1435 cycle_modeb(ArgsTypes,Args,[],[],Mod,BL,a,[],BLout0,D,M),
1436 variabilize(([(H,A)]:-BLout0),CLV), 1437 CLV=([Head1]:-BodyList1),
1438 remove_int_atom(Head1,Head),
1439 remove_int_atom_list(BodyList1,BodyList2),
1440 remove_duplicates(BodyList2,BodyList),
1441 get_next_rule_number(Mod,R),
1442 copy_term((Head,BodyList),(HeadV,BodyListV)),
1443 numbervars((HeadV,BodyListV),0,_V),
1444 format2(Mod,"Bottom clause: example ~q~nClause~n~q:0.5 :-~n",[H,HeadV]),
1445 write_body2(Mod,user_output,BodyListV),
1446 generate_body(T,Mod,CL0).
1447
1448
1449variabilize((H:-B),(H1:-B1)):-
1450 variabilize_list(H,H1,[],AS,M),
1451 variabilize_list(B,B1,AS,_AS,M).
1452
1453
1454variabilize_list([],[],A,A,_M).
1455
1456variabilize_list([(\+ H,Mode)|T],[\+ H1|T1],A0,A,M):-
1457 builtin(H),!,
1458 H=..[F|Args],
1459 Mode=..[F|ArgTypes],
1460 variabilize_args(Args,ArgTypes, Args1,A0,A1),
1461 H1=..[F,M|Args1],
1462 variabilize_list(T,T1,A1,A,M).
1463
1464variabilize_list([(\+ H,Mode)|T],[\+ H1|T1],A0,A,M):-!,
1465 H=..[F,_M|Args],
1466 Mode=..[F|ArgTypes],
1467 variabilize_args(Args,ArgTypes, Args1,A0,A1),
1468 H1=..[F,M|Args1],
1469 variabilize_list(T,T1,A1,A,M).
1470
1471variabilize_list([(H,Mode)|T],[H1|T1],A0,A,M):-
1472 builtin(H),!,
1473 H=..[F|Args],
1474 Mode=..[F|ArgTypes],
1475 variabilize_args(Args,ArgTypes, Args1,A0,A1),
1476 H1=..[F,M|Args1],
1477 variabilize_list(T,T1,A1,A,M).
1478
1479variabilize_list([(H,Mode)|T],[H1|T1],A0,A,M):-
1480 H=..[F,_M|Args],
1481 Mode=..[F|ArgTypes],
1482 variabilize_args(Args,ArgTypes, Args1,A0,A1),
1483 H1=..[F,M|Args1],
1484 variabilize_list(T,T1,A1,A,M).
1485
1486
1487variabilize_args([],[],[],A,A).
1488
1489variabilize_args([C|T],[C|TT],[C|TV],A0,A):-!,
1490 variabilize_args(T,TT,TV,A0,A).
1491
1492variabilize_args([C|T],[# _Ty|TT],[C|TV],A0,A):-!,
1493 variabilize_args(T,TT,TV,A0,A).
1494
1495variabilize_args([C|T],[-# _Ty|TT],[C|TV],A0,A):-!,
1496 variabilize_args(T,TT,TV,A0,A).
1497
1498variabilize_args([C|T],[Ty|TT],[V|TV],A0,A):-
1499 (Ty = +Ty1;Ty = -Ty1),
1500 member(C/Ty1/V,A0),!,
1501 variabilize_args(T,TT,TV,A0,A).
1502
1503variabilize_args([C|T],[Ty|TT],[V|TV],A0,A):-
1504 (Ty = +Ty1;Ty = -Ty1),!,
1505 variabilize_args(T,TT,TV,[C/Ty1/V|A0],A).
1506
1507variabilize_args([C|T],[Ty|TT],[V|TV],A0,A):-
1508 compound(C),
1509 C=..[F|Args],
1510 Ty=..[F|ArgsT],
1511 variabilize_args(Args,ArgsT,ArgsV,A0,A1),
1512 V=..[F|ArgsV],
1513 variabilize_args(T,TT,TV,A1,A).
1514
1515
1516cycle_modeb(ArgsTypes,Args,ArgsTypes,Args,_Mod,_BL,L,L,L,_,_M):-!.
1517
1518cycle_modeb(_ArgsTypes,_Args,_ArgsTypes1,_Args1,_Mod,_BL,_L,L,L,0,_M):-!.
1519
1520cycle_modeb(ArgsTypes,Args,_ArgsTypes0,_Args0,Mod,BL,_L0,L1,L,D,M):-
1521 find_atoms(BL,Mod,ArgsTypes,Args,ArgsTypes1,Args1,L1,L2,M),
1522 D1 is D-1,
1523 cycle_modeb(ArgsTypes1,Args1,ArgsTypes,Args,Mod,BL,L1,L2,L,D1,M).
1524
1525
1526find_atoms([],_Mod,ArgsTypes,Args,ArgsTypes,Args,L,L,_M).
1527
1528find_atoms([(R,\+ H)|T],Mod,ArgsTypes0,Args0,ArgsTypes,Args,L0,L1,M):-!,
1529 H=..[F|ArgsT],
1530 findall((A,H),instantiate_query_neg(ArgsT,ArgsTypes0,Args0,F,M,A),L),
1531 call_atoms(L,Mod,[],At),
1532 remove_duplicates(At,At1),
1533 ((R = '*' ) ->
1534 R1= +1e20
1535 ;
1536 R1=R
1537 ),
1538 sample_lift(R1,At1,At2),
1539 append(L0,At2,L2),
1540 find_atoms(T,Mod,ArgsTypes0,Args0,ArgsTypes,Args,L2,L1,M).
1541
1542find_atoms([(R,H)|T],Mod,ArgsTypes0,Args0,ArgsTypes,Args,L0,L1,M):-
1543 H=..[F|ArgsT],
1544 findall((A,H),instantiate_query(ArgsT,ArgsTypes0,Args0,F,M,A),L),
1545 call_atoms(L,Mod,[],At),
1546 remove_duplicates(At,At1),
1547 ((R = '*' ) ->
1548 R1= +1e20
1549 ;
1550 R1=R
1551 ),
1552 sample_lift(R1,At1,At2),
1553 extract_output_args(At2,ArgsT,ArgsTypes0,Args0,ArgsTypes1,Args1),
1554 append(L0,At2,L2),
1555 find_atoms(T,Mod,ArgsTypes1,Args1,ArgsTypes,Args,L2,L1,M).
1556
1557
1558call_atoms([],_Mod,A,A).
1559
1560call_atoms([(H,M)|T],Mod,A0,A):-
1561 findall((H,M),Mod:H,L),
1562 append(A0,L,A1),
1563 call_atoms(T,Mod,A1,A).
1564
1565
([],_ArgsT,ArgsTypes,Args,ArgsTypes,Args).
1567
1568extract_output_args([(H,_At)|T],ArgsT,ArgsTypes0,Args0,ArgsTypes,Args):-
1569 builtin(H),!,
1570 H=..[_F|ArgsH],
1571 add_const(ArgsH,ArgsT,ArgsTypes0,Args0,ArgsTypes1,Args1),
1572 extract_output_args(T,ArgsT,ArgsTypes1,Args1,ArgsTypes,Args).
1573
1574extract_output_args([(H,_At)|T],ArgsT,ArgsTypes0,Args0,ArgsTypes,Args):-
1575 H=..[_F,_M|ArgsH],
1576 add_const(ArgsH,ArgsT,ArgsTypes0,Args0,ArgsTypes1,Args1),
1577 extract_output_args(T,ArgsT,ArgsTypes1,Args1,ArgsTypes,Args).
1578
1579
1580add_const([],[],ArgsTypes,Args,ArgsTypes,Args).
1581
1582add_const([_A|T],[+_T|TT],ArgsTypes0,Args0,ArgsTypes,Args):-!,
1583 add_const(T,TT,ArgsTypes0,Args0,ArgsTypes,Args).
1584
1585add_const([A|T],[-Type|TT],ArgsTypes0,Args0,ArgsTypes,Args):-!,
1586 (already_present(ArgsTypes0,Args0,A,Type)->
1587 ArgsTypes1=ArgsTypes0,
1588 Args1=Args0
1589 ;
1590 ArgsTypes1=[+Type|ArgsTypes0],
1591 Args1=[A|Args0]
1592 ),
1593 add_const(T,TT,ArgsTypes1,Args1,ArgsTypes,Args).
1594
1595add_const([A|T],[-# Type|TT],ArgsTypes0,Args0,ArgsTypes,Args):-!,
1596 (already_present(ArgsTypes0,Args0,A,Type)->
1597 ArgsTypes1=ArgsTypes0,
1598 Args1=Args0
1599 ;
1600 ArgsTypes1=[+Type|ArgsTypes0],
1601 Args1=[A|Args0]
1602 ),
1603 add_const(T,TT,ArgsTypes1,Args1,ArgsTypes,Args).
1604
1605add_const([_A|T],[# _|TT],ArgsTypes0,Args0,ArgsTypes,Args):-!,
1606 add_const(T,TT,ArgsTypes0,Args0,ArgsTypes,Args).
1607
1608add_const([A|T],[A|TT],ArgsTypes0,Args0,ArgsTypes,Args):-
1609 atomic(A),!,
1610 add_const(T,TT,ArgsTypes0,Args0,ArgsTypes,Args).
1611
1612add_const([A|T],[AT|TT],ArgsTypes0,Args0,ArgsTypes,Args):-
1613 A=..[F|Ar],
1614 AT=..[F|ArT],
1615 add_const(Ar,ArT,ArgsTypes0,Args0,ArgsTypes1,Args1),
1616 add_const(T,TT,ArgsTypes1,Args1,ArgsTypes,Args).
1617
1618
1619already_present([+T|_TT],[C|_TC],C,T):-!.
1620
1621already_present([_|TT],[_|TC],C,T):-
1622 already_present(TT,TC,C,T).
1623
1624
1625instantiate_query_neg(ArgsT,ArgsTypes,Args,F,M,A):-
1626 instantiate_input(ArgsT,ArgsTypes,Args,ArgsB),
1627 A1=..[F|ArgsB],
1628 (builtin(A1)->
1629 A= (\+ A1)
1630 ;
1631 A0=..[F,M|ArgsB],
1632 A = (\+ A0)
1633 ).
1634
1635instantiate_query(ArgsT,ArgsTypes,Args,F,M,A):-
1636 instantiate_input(ArgsT,ArgsTypes,Args,ArgsB),
1637 A1=..[F|ArgsB],
1638 (builtin(A1)->
1639 A=A1
1640 ;
1641 A=..[F,M|ArgsB]
1642 ).
1643
1644
1645instantiate_input([],_AT,_A,[]).
1646
1647instantiate_input([-_Type|T],AT,A,[_V|TA]):-!,
1648 instantiate_input(T,AT,A,TA).
1649
1650instantiate_input([+Type|T],AT,A,[H|TA]):-!,
1651 find_val(AT,A,+Type,H),
1652 instantiate_input(T,AT,A,TA).
1653
1654instantiate_input([# Type|T],AT,A,[H|TA]):-!,
1655 find_val(AT,A,+Type,H),
1656 instantiate_input(T,AT,A,TA).
1657
1658instantiate_input([-# _Type|T],AT,A,[_V|TA]):-!,
1659 instantiate_input(T,AT,A,TA).
1660
1661instantiate_input([C|T],AT,A,[C1|TA]):-
1662 C=..[F|Args],
1663 instantiate_input(Args,AT,A,Args1),
1664 C1=..[F|Args1],
1665 instantiate_input(T,AT,A,TA).
1666
1667
1668find_val([T|_TT],[A|_TA],T,A).
1669
1670find_val([HT|_TT],[HA|_TA],T,A):-
1671 nonvar(HA),
1672 HT=..[F|ArgsT],
1673 HA=..[F|Args],
1674 find_val(ArgsT,Args,T,A).
1675
1676find_val([_T|TT],[_A|TA],T,A):-
1677 find_val(TT,TA,T,A).
1678
1679
1680get_output_atoms(O,M):-
1681 findall((A/Ar),M:output((A/Ar)),O).
1682
1683
1684generate_goal([],_M,_H,G,G):-!.
1685
1686generate_goal([P/A|T],M,H,G0,G1):-
1687 functor(Pred,P,A),
1688 Pred=..[P|Rest],
1689 Pred1=..[P,H|Rest],
1690 findall(Pred1,call(M:Pred1),L),
1691 findall(\+ Pred1,call(M:neg(Pred1)),LN),
1692 append(G0,L,G2),
1693 append(G2,LN,G3),
1694 generate_goal(T,M,H,G3,G1).
1695
1696remove_duplicates(L0,L):-
1697 remove_duplicates(L0,[],L1),
1698 reverse(L1,L).
1699
1700remove_duplicates([],L,L).
1701
1702remove_duplicates([H|T],L0,L):-
1703 member_eq(H,L0),!,
1704 remove_duplicates(T,L0,L).
1705
1706remove_duplicates([H|T],L0,L):-
1707 remove_duplicates(T,[H|L0],L).
1708
1709
1717
1718
1719
1720
1721
1722specialize_rule(Rule,M,_SpecRule,_Lit):-
1723 M:local_setting(max_body_length,ML),
1724 Rule = rule(_ID,_LH,BL,_Lits),
1725 length(BL,L),
1726 L=ML,!,
1727 fail.
1728
1730specialize_rule(Rule,M,SpecRule,Lit):-
1731 M:local_setting(specialization,bottom),
1732 Rule = rule(ID,LH,BL,Lits),
1733 delete_one(Lits,RLits,Lit),
1734 \+ M:lookahead_cons(Lit,_),
1735 \+ M:lookahead_cons_var(Lit,_),
1736 \+ member_eq(Lit,BL),
1737 append(BL,[Lit],BL1),
1738 remove_prob(LH,LH1),
1739 delete(LH1,'',LH2),
1740 append(LH2,BL1,ALL2),
1741 dv(LH2,BL1,M,DList), 1742 extract_fancy_vars(ALL2,Vars1),
1743 length(Vars1,NV),
1744 M:local_setting(max_var,MV),
1745 NV=<MV,
1746 linked_clause(BL1,M,LH2),
1747 M:local_setting(maxdepth_var,MD),
1748 exceed_depth(DList,MD),
1749 \+ banned_clause(LH2,BL1),
1750 SpecRule=rule(ID,LH,BL1,RLits).
1751
1752specialize_rule(Rule,M,SpecRule,Lit):-
1753 M:local_setting(specialization,bottom),
1754 Rule = rule(ID,LH,BL,Lits),
1755 delete_one(Lits,RLits,Lit),
1756 \+ member_eq(Lit,BL),
1757 append(BL,[Lit],BL0),
1758 \+M:lookahead_cons_var(Lit,_),
1759 (M:lookahead(Lit,LLit1);M:lookahead_cons(Lit,LLit1)),
1760 copy_term(LLit1,LLit2),
1761 specialize_rule_la_bot(LLit2,RLits,RLits1,BL0,BL1),
1762 remove_prob(LH,LH1),
1763 delete(LH1,'',LH2),
1764 append(LH2,BL1,ALL2),
1765 dv(LH2,BL1,M,DList),
1766 extract_fancy_vars(ALL2,Vars1),
1767 length(Vars1,NV),
1768 M:local_setting(max_var,MV),
1769 NV=<MV,
1770 linked_clause(BL1,M,LH2),
1771 M:local_setting(maxdepth_var,MD),
1772 exceed_depth(DList,MD),
1773 \+ banned_clause(LH2,BL1),
1774 SpecRule=rule(ID,LH,BL1,RLits1).
1775
1776specialize_rule(Rule,M,SpecRule,Lit):-
1777 M:local_setting(specialization,bottom),
1778 Rule = rule(ID,LH,BL,Lits),
1779 delete_one(Lits,RLits,Lit),
1780 \+ member_eq(Lit,BL),
1781 append(BL,[Lit],BL0),
1782 M:lookahead_cons_var(Lit,LLit2),
1783 specialize_rule_la_bot(LLit2,RLits,_RLits1,BL0,BL1),
1784 remove_prob(LH,LH1),
1785 delete(LH1,'',LH2),
1786 append(LH2,BL1,ALL2),
1787 dv(LH2,BL1,M,DList),
1788 extract_fancy_vars(ALL2,Vars1),
1789 length(Vars1,NV),
1790 M:local_setting(max_var,MV),
1791 NV=<MV,
1792 linked_clause(BL1,M,LH2),
1793 M:local_setting(maxdepth_var,MD),
1794 exceed_depth(DList,MD),
1795 \+ banned_clause(LH2,BL1),
1796 SpecRule=rule(ID,LH,BL1,[]).
1797
1798specialize_rule(Rule,M,SpecRule,Lit):-
1799 M:local_setting(specialization,mode), 1800 findall(BL , M:modeb(_,BL), BLS),
1801 specialize_rule(BLS,Rule,M,SpecRule,Lit).
1802
1803
1804update_head1([],_N,[]):-!.
1805
1806update_head1([H:_P|T],N,[H:P|T1]):-
1807 P is 1/N,
1808 update_head1(T,N,T1).
1809
1810
1811banned_clause(H,B):-
1812 lift_input_mod(M),
1813 numbervars((H,B),0,_N),
1814 M:banned(H2,B2),
1815 mysublist(H2,H),
1816 mysublist(B2,B).
1817
1818
1819mysublist([],_).
1820
1821mysublist([H|T],L):-
1822 member(H,L),
1823 mysublist(T,L).
1824
1825
1826specialize_rule([Lit|_RLit],Rule,M,SpecRul,SLit):-
1827 Rule = rule(ID,LH,BL,true),
1828 remove_prob(LH,LH1),
1829 append(LH1,BL,ALL),
1830 specialize_rule1(Lit,ALL,SLit),
1831 append(BL,[SLit],BL1),
1832 (M:lookahead(SLit,LLit1);M:lookahead_cons(SLit,LLit1)),
1833 specialize_rule_la(LLit1,LH1,BL1,BL2),
1834 append(LH1,BL2,ALL2),
1835 extract_fancy_vars(ALL2,Vars1),
1836 length(Vars1,NV),
1837 M:local_setting(max_var,MV),
1838 NV=<MV,
1839 SpecRul = rule(ID,LH,BL2,true).
1840
1841specialize_rule([Lit|_RLit],Rule,M,SpecRul,SLit):-
1842 Rule = rule(ID,LH,BL,true),
1843 remove_prob(LH,LH1),
1844 append(LH1,BL,ALL),
1845 specialize_rule1(Lit,ALL,SLit),
1846 \+ M:lookahead_cons(SLit,_),
1847 append(BL,[SLit],BL1),
1848 append(LH1,BL1,ALL1),
1849 extract_fancy_vars(ALL1,Vars1),
1850 length(Vars1,NV),
1851 M:local_setting(max_var,MV),
1852 NV=<MV,
1853 SpecRul = rule(ID,LH,BL1,true).
1854
1855specialize_rule([_|RLit],Rule,M,SpecRul,Lit):-
1856 specialize_rule(RLit,Rule,M,SpecRul,Lit).
1857
1858
1859specialize_rule_la([],_LH1,BL1,BL1).
1860
1861specialize_rule_la([Lit1|T],LH1,BL1,BL3):-
1862 copy_term(Lit1,Lit2),
1863 lift_input_mod(M),
1864 M:modeb(_,Lit2),
1865 append(LH1,BL1,ALL1),
1866 specialize_rule1(Lit2,ALL1,SLit1),
1867 append(BL1,[SLit1],BL2),
1868 specialize_rule_la(T,LH1,BL2,BL3).
1869
1870
1871specialize_rule_la_bot([],Bot,Bot,BL,BL).
1872
1873specialize_rule_la_bot([Lit|T],Bot0,Bot,BL1,BL3):-
1874 delete_one(Bot0,Bot1,Lit),
1875 \+ member_eq(Lit,BL1),
1876 append(BL1,[Lit],BL2),
1877 specialize_rule_la_bot(T,Bot1,Bot,BL2,BL3).
1878
1879
1880remove_prob(['':_P],[]):-!.
1881
1882remove_prob([X:_|R],[X|R1]):-
1883 remove_prob(R,R1).
1884
1885
1886specialize_rule1(Lit,Lits,SpecLit):-
1887 Lit =.. [Pred|Args],
1888 exctract_type_vars(Lits,TypeVars0),
1889 remove_duplicates(TypeVars0,TypeVars),
1890 take_var_args(Args,TypeVars,Args1),
1891 SpecLit =.. [Pred|Args1],
1892 \+ member_eq(SpecLit,Lits).
1893
1894
1895convert_to_input_vars([],[]):-!.
1896
1897convert_to_input_vars([+T|RT],[+T|RT1]):-
1898 !,
1899 convert_to_input_vars(RT,RT1).
1900
1901convert_to_input_vars([-T|RT],[+T|RT1]):-
1902 convert_to_input_vars(RT,RT1).
1903
1904
1905
1906remove_eq(X,[Y|R],R):-
1907 X == Y,
1908 !.
1909
1910remove_eq(X,[_|R],R1):-
1911 remove_eq(X,R,R1).
1912
1913
1914linked_clause(X):-
1915 linked_clause(X,[]).
1916
1917linked_clause([],_M,_).
1918
1919linked_clause([L|R],M,PrevLits):-
1920 term_variables(PrevLits,PrevVars),
1921 input_variables(L,M,InputVars),
1922 linked(InputVars,PrevVars),!,
1923 linked_clause(R,M,[L|PrevLits]).
1924
1925
1926linked([],_).
1927
1928linked([X|R],L) :-
1929 member_eq(X,L),
1930 !,
1931 linked(R,L).
1932
1933
1934input_variables(\+ LitM,M,InputVars):-
1935 !,
1936 LitM=..[P|Args],
1937 length(Args,LA),
1938 length(Args1,LA),
1939 Lit1=..[P|Args1],
1941 M:modeb(_,Lit1),
1942 Lit1 =.. [P|Args1],
1943 convert_to_input_vars(Args1,Args2),
1944 Lit2 =.. [P|Args2],
1945 input_vars(LitM,Lit2,InputVars).
1946
1947input_variables(LitM,M,InputVars):-
1948 LitM=..[P|Args],
1949 length(Args,LA),
1950 length(Args1,LA),
1951 Lit1=..[P|Args1],
1952 M:modeb(_,Lit1),
1953 input_vars(LitM,Lit1,InputVars).
1954
1955input_variables(LitM,M,InputVars):-
1956 LitM=..[P|Args],
1957 length(Args,LA),
1958 length(Args1,LA),
1959 Lit1=..[P|Args1],
1960 M:modeh(_,Lit1),
1961 input_vars(LitM,Lit1,InputVars).
1962
1963input_vars(Lit,Lit1,InputVars):-
1964 Lit =.. [_|Vars],
1965 Lit1 =.. [_|Types],
1966 input_vars1(Vars,Types,InputVars).
1967
1968
1969input_vars1([],_,[]).
1970
1971input_vars1([V|RV],[+_T|RT],[V|RV1]):-
1972 !,
1973 input_vars1(RV,RT,RV1).
1974
1975input_vars1([_V|RV],[_|RT],RV1):-
1976 input_vars1(RV,RT,RV1).
1977
1978
1979exctract_type_vars([],[]).
1980
1981exctract_type_vars([Lit|RestLit],TypeVars):-
1982 Lit =.. [Pred|Args],
1983 length(Args,L),
1984 length(Args1,L),
1985 Lit1 =.. [Pred|Args1],
1986 take_mode(Lit1),
1987 type_vars(Args,Args1,Types),
1988 exctract_type_vars(RestLit,TypeVars0),
1989 !,
1990 append(Types,TypeVars0,TypeVars).
1991
1992
1993take_mode(Lit):-
1994 lift_input_mod(M),
1995 M:modeh(_,Lit),!.
1996
1997take_mode(Lit):-
1998 lift_input_mod(M),
1999 M:modeb(_,Lit),!.
2000
2001take_mode(Lit):-
2002 lift_input_mod(M),
2003 M:mode(_,Lit),!.
2004
2005
2006type_vars([],[],[]).
2007
2008type_vars([V|RV],[+T|RT],[V=T|RTV]):-
2009 !,
2010 type_vars(RV,RT,RTV).
2011
2012type_vars([V|RV],[-T|RT],[V=T|RTV]):-atom(T),!,
2013 type_vars(RV,RT,RTV).
2014
2015type_vars([_V|RV],[_T|RT],RTV):-
2016 type_vars(RV,RT,RTV).
2017
2018
2019take_var_args([],_,[]).
2020
2021take_var_args([+T|RT],TypeVars,[V|RV]):-
2022 !,
2023 member(V=T,TypeVars),
2024 take_var_args(RT,TypeVars,RV).
2025
2026take_var_args([-T|RT],TypeVars,[_V|RV]):-
2027 atom(T),
2028 take_var_args(RT,TypeVars,RV).
2029
2030take_var_args([-T|RT],TypeVars,[V|RV]):-
2031 member(V=T,TypeVars),
2032 take_var_args(RT,TypeVars,RV).
2033
2034take_var_args([T|RT],TypeVars,[T|RV]):-
2035 T\= + _,(T\= - _; T= - A,number(A)),
2036 take_var_args(RT,TypeVars,RV).
2037
2038
2039choose_rule(Theory,Rule):-
2040 member(Rule,Theory).
2041
2042
2043add_rule(Theory,add(rule(ID,H,[],true))):-
2044 new_id(ID),
2045 findall(HL , modeh(_,HL), HLS),
2046 length(HLS,NH),
2047 P is 1/(NH+1),
2048 add_probs(HLS,H,P),
2049 \+ member(rule(_,H,[],true),Theory).
2050
2051add_rule(Theory,TheoryGen):-
2052 findall(HL , modeh(_,HL), HLS),
2053 add_rule(HLS,Theory,TheoryGen).
2054
2055add_rule([X|_R],Theory,TheoryGen) :-
2056 new_id(ID),
2057 X =.. [P|A],
2058 length(A,LA),
2059 length(A1,LA),
2060 PH =.. [P|A1],
2061 TheoryGen = add(rule(ID,[PH:0.5,'':0.5],[],true)),
2062 \+ member(rule(_,[PH:_,'':_],[],true),Theory).
2063
2064add_rule([_X|R],Theory,TheoryGen) :-
2065 add_rule(R,Theory,TheoryGen).
2066
2067
2068add_probs([],['':P],P):-!.
2069
2070add_probs([H|T],[H:P|T1],P):-
2071 add_probs(T,T1,P).
2072
2073
(List,Vars):-
2075 term_variables(List,Vars0),
2076 fancy_vars(Vars0,1,Vars).
2077
2078
2079fancy_vars([],_,[]).
2080
2081fancy_vars([X|R],N,[NN2=X|R1]):-
2082 name(N,NN),
2083 append([86],NN,NN1),
2084 name(NN2,NN1),
2085 N1 is N + 1,
2086 fancy_vars(R,N1,R1).
2087
2088
2089delete_one([X|R],R,X).
2090
2091delete_one([X|R],[X|R1],D):-
2092 delete_one(R,R1,D).
2093
2094
2095remove_last([_X],[]) :-
2096 !.
2097
2098remove_last([X|R],[X|R1]):-
2099 remove_last(R,R1).
2100
2101
2102delete_matching([],_El,[]).
2103
2104delete_matching([El|T],El,T1):-!,
2105 delete_matching(T,El,T1).
2106
2107delete_matching([H|T],El,[H|T1]):-
2108 delete_matching(T,El,T1).
2109
2110
2112dv(H,B,M,DV1):- 2113 term_variables(H,V),
2114 head_depth(V,DV0),
2115 findall((MD-DV),var_depth(B,M,DV0,DV,0,MD),LDs),
2116 get_max(LDs,-1,-,DV1).
2117
2118
2119input_variables_b(\+ LitM,M,InputVars):-!,
2120 LitM=..[P|Args],
2121 length(Args,LA),
2122 length(Args1,LA),
2123 Lit1=..[P|Args1],
2124 M:modeb(_,Lit1),
2125 all_plus(Lit1),
2126 input_vars(LitM,Lit1,InputVars).
2127
2128input_variables_b(LitM,M,InputVars):-
2129 LitM=..[P|Args],
2130 length(Args,LA),
2131 length(Args1,LA),
2132 Lit1=..[P|Args1],
2133 M:modeb(_,Lit1),
2134 input_vars(LitM,Lit1,InputVars).
2135
2136
2137
2139head_depth([],[]).
2140head_depth([V|R],[[V,0]|R1]):-
2141 head_depth(R,R1).
2142
2144var_depth([],_M,PrevDs1,PrevDs1,MD,MD):-!.
2145
2146var_depth([L|R],M,PrevDs,PrevDs1,_MD,MD):- 2147 input_variables_b(L,M,InputVars),
2148 term_variables(L, BodyAtomVars),
2149 output_vars(BodyAtomVars,InputVars,OutputVars),
2150 depth_InputVars(InputVars,PrevDs,0,MaxD), 2151 D is MaxD+1,
2152 compute_depth(OutputVars,D,PrevDs,PrevDs0), 2153 var_depth(R,M,PrevDs0,PrevDs1,D,MD).
2154
2155get_max([],_,Ds,Ds).
2156
2157get_max([(MD-DsH)|T],MD0,_Ds0,Ds):-
2158 MD>MD0,!,
2159 get_max(T,MD,DsH,Ds).
2160
2161get_max([_H|T],MD,Ds0,Ds):-
2162 get_max(T,MD,Ds0,Ds).
2163
2164delete_eq([],_E,[]).
2165
2166delete_eq([H|T],E,T1):-
2167 H==E,!,
2168 delete_eq(T,E,T1).
2169
2170delete_eq([H|T],E,[H|T1]):-
2171 delete_eq(T,E,T1).
2172
2173output_vars(OutVars,[],OutVars):-!.
2174output_vars(BodyAtomVars,[I|InputVars],OutVars):-
2175 delete_eq(BodyAtomVars, I, Residue),
2176 output_vars(Residue,InputVars, OutVars).
2177
2179depth_InputVars([],_,D,D).
2180depth_InputVars([I|Input],PrevDs,D0,D):-
2181 member_l(PrevDs,I,MD),
2182 (MD>D0->
2183 D1=MD
2184 ;
2185 D1=D0
2186 ),
2187 depth_InputVars(Input,PrevDs,D1,D).
2188
2189member_l([[L,D]|_P],I,D):-
2190 I==L,!.
2191member_l([_|P],I,D):-
2192 member_l(P,I,D).
2193
2194compute_depth([],_,PD,PD):-!.
2195compute_depth([O|Output],D,PD,RestO):-
2196 member_l(PD,O,_),!,
2197 compute_depth(Output,D,PD,RestO).
2198
2199compute_depth([O|Output],D,PD,[[O,D]|RestO]):-
2200 compute_depth(Output,D,PD,RestO).
2201
2202
2203
2205exceed_depth([],_):-!.
2206exceed_depth([H|T],MD):-
2207 nth1(2,H,Dep),
2208 Dep<MD, 2209 exceed_depth(T,MD).
2210
2218
2219
2220
2221
2223
2224
2225load(FileIn,C1,R):-
2226 open(FileIn,read,SI),
2227 read_clauses_dir(SI,C),
2228 close(SI),
2229 process_clauses(C,[],C1,[],R).
2230
2231
2232add_inter_cl(CL):-
2233 2234 findall(A,(input(A)),L),
2235 gen_cl(L,CL).
2236
2237
2238gen_cl([],[]).
2239
2240gen_cl([H/A|T],[C|T1]):-
2241 functor(F,H,A),
2242 add_mod_arg(F,Module,F1),
2243 add_bdd_arg(F,BDD,Module,F2),
2244 C=(F2:-(F1,one(BDD))),
2245 gen_cl(T,T1).
2246
2247
2248assert_all([],_M,[]).
2249
2250assert_all([H|T],M,[HRef|TRef]):-
2251 assertz(M:H,HRef),
2252 assert_all(T,M,TRef).
2253
2254assert_all([],[]).
2255
2256assert_all([H|T],[HRef|TRef]):-
2257 assertz(slipcover:H,HRef),
2258 assert_all(T,TRef).
2259
2260
2261retract_all([],_):-!.
2262
2263retract_all([H|T],M):-
2264 erase(M,H),
2265 retract_all(T,M).
2266
2267retract_all([]):-!.
2268
2269retract_all([H|T]):-
2270 erase(H),
2271 retract_all(T).
2272
2273
2274read_clauses_dir(S,[Cl|Out]):-
2275 read_term(S,Cl,[]),
2276 (Cl=end_of_file->
2277 Out=[]
2278 ;
2279 read_clauses_dir(S,Out)
2280 ).
2281
2282
2283process_clauses([],_M,[]):-!.
2284
2285process_clauses([end_of_file],_M,[]):-!.
2286
2287process_clauses([H|T],M,[H1|T1]):-
2288 term_expansion_int(H,M,(_,[H1])),
2289 process_clauses(T,M,T1).
2290
2291
2292get_next_rule_number(M,R):-
2293 retract(M:rule_lift_n(R)),
2294 R1 is R+1,
2295 assert(M:rule_lift_n(R1)).
2296
2297add_bdd_arg(A,Env,BDD,A1):-
2298 A=..[P|Args],
2299 append(Args,[Env,BDD],Args1),
2300 A1=..[P|Args1].
2301
2302
2303add_bdd_arg_db(A,Env,BDD,DB,A1):-
2304 A=..[P|Args],
2305 append(Args,[DB,Env,BDD],Args1),
2306 A1=..[P|Args1].
2307
2308
2309add_bdd_arg(A,_Env,_BDD,Module,A1):-
2310 A=..[P|Args],
2311 A1=..[P,Module|Args].
2312
2313
2314add_bdd_arg_db(A,_Env,_BDD,DB,Module,A1):-
2315 A=..[P|Args],
2316 append(Args,[DB],Args1),
2317 A1=..[P,Module|Args1].
2318
2319add_mod_arg(A,Module,A1):-
2320 A=..[P|Args],
2321 A1=..[P,Module|Args].
2322
2323
2324generate_rules_fact([],_Env,_VC,_R,_Probs,_N,[],_Module).
2325
2326generate_rules_fact([Head:_P1,'':_P2],Env,VC,R,Probs,N,[Clause],Module):-!,
2327 add_bdd_arg(Head,Env,BDD,Module,Head1),
2328 Clause=(Head1:-(pita:get_var_n(Env,R,VC,Probs,V),pita:equality(Env,V,N,BDD))).
2329
2330generate_rules_fact([Head:_P|T],Env,VC,R,Probs,N,[Clause|Clauses],Module):-
2331 add_bdd_arg(Head,Env,BDD,Module,Head1),
2332 Clause=(Head1:-(pita:get_var_n(Env,R,VC,Probs,V),pita:equality(Env,V,N,BDD))),
2333 N1 is N+1,
2334 generate_rules_fact(T,Env,VC,R,Probs,N1,Clauses,Module).
2335
2336
2337generate_rules_fact_db([],_Env,_VC,_R,_Probs,_N,[],_Module).
2338
2339generate_rules_fact_db([Head:_P1,'':_P2],Env,VC,R,Probs,N,[Clause],Module):-!,
2340 add_bdd_arg_db(Head,Env,BDD,_DB,Module,Head1),
2341 Clause=(Head1:-(pita:get_var_n(Env,R,VC,Probs,V),pita:equality(Env,V,N,BDD))).
2342
2343generate_rules_fact_db([Head:_P|T],Env,VC,R,Probs,N,[Clause|Clauses],Module):-
2344 add_bdd_arg_db(Head,Env,BDD,_DB,Module,Head1),
2345 Clause=(Head1:-(pita:get_var_n(Env,R,VC,Probs,V),pita:equality(Env,V,N,BDD))),
2346 N1 is N+1,
2347 generate_rules_fact_db(T,Env,VC,R,Probs,N1,Clauses,Module).
2348
2349
2350generate_clause(Head,Env,Body,_VC,_R,_Probs,_BDDAnd,_N,Clause,Module):-
2351 add_bdd_arg(Head,Env,_BDD,Module,Head1),
2352 Clause=(Head1:-Body).
2353
2354
2355generate_clause_db(Head,Env,Body,_VC,_R,_Probs,DB,_BDDAnd,_N,Clause,Module):-
2356 add_bdd_arg_db(Head,Env,_BDD,DBH,Module,Head1),
2357 Clause=(Head1:-(DBH>=1,DB is DBH-1,Body)).
2358
2359
2360generate_rules([],_Env,_Body,_VC,_R,_Probs,_BDDAnd,_N,[],_Module).
2361
2362generate_rules([Head:_P1,'':_P2],Env,Body,VC,R,Probs,BDDAnd,N,[Clause],Module):-!,
2363 generate_clause(Head,Env,Body,VC,R,Probs,BDDAnd,N,Clause,Module).
2364
2365generate_rules([Head:_P|T],Env,Body,VC,R,Probs,BDDAnd,N,[Clause|Clauses],Module):-
2366 generate_clause(Head,Env,Body,VC,R,Probs,BDDAnd,N,Clause,Module),
2367 N1 is N+1,
2368 generate_rules(T,Env,Body,VC,R,Probs,BDDAnd,N1,Clauses,Module).
2369
2370
2371generate_rules_db([],_Env,_Body,_VC,_R,_Probs,_DB,_BDDAnd,_N,[],_Module):-!.
2372
2373generate_rules_db([Head:_P1,'':_P2],Env,Body,VC,R,Probs,DB,BDDAnd,N,[Clause],Module):-!,
2374 generate_clause_db(Head,Env,Body,VC,R,Probs,DB,BDDAnd,N,Clause,Module).
2375
2376generate_rules_db([Head:_P|T],Env,Body,VC,R,Probs,DB,BDDAnd,N,[Clause|Clauses],Module):-
2377 generate_clause_db(Head,Env,Body,VC,R,Probs,DB,BDDAnd,N,Clause,Module),!, 2378 N1 is N+1,
2379 generate_rules_db(T,Env,Body,VC,R,Probs,DB,BDDAnd,N1,Clauses,Module).
2380
2381process_body_bg([],[],_Module).
2382
2383process_body_bg([\+ H|T],[\+ H|Rest],Module):-
2384 builtin(H),!,
2385 process_body_bg(T,Rest,Module).
2386
2387process_body_bg([\+ H|T],[\+ H1|Rest],Module):-!,
2388 add_mod_arg(H,Module,H1),
2389 process_body_bg(T,Rest,Module).
2390
2391process_body_bg([H|T],[H|Rest],Module):-
2392 builtin(H),!,
2393 process_body_bg(T,Rest,Module).
2394
2395process_body_bg([H|T],[H1|Rest],Module):-!,
2396 add_mod_arg(H,Module,H1),
2397 process_body_bg(T,Rest,Module).
2398
2399
2400
2401process_body([],BDD,BDD,Vars,Vars,[],_Env,_Module).
2402
2403process_body([\+ H|T],BDD,BDD1,Vars,Vars1,[\+ H|Rest],Env,Module):-
2404 builtin(H),!,
2405 process_body(T,BDD,BDD1,Vars,Vars1,Rest,Env,Module).
2406
2407process_body([\+ H|T],BDD,BDD1,Vars,Vars1,[
2408(\+ H1)|Rest],Env,Module):-
2409 add_mod_arg(H,Module,H1),
2410 process_body(T,BDD,BDD1,Vars,Vars1,Rest,Env,Module).
2411
2412process_body([H|T],BDD,BDD1,Vars,Vars1,[H|Rest],Env,Module):-
2413 builtin(H),!,
2414 process_body(T,BDD,BDD1,Vars,Vars1,Rest,Env,Module).
2415
2416process_body([H|T],BDD,BDD1,Vars,Vars1,
2417[H1|Rest],Env,Module):-
2418 add_mod_arg(H,Module,H1),
2419 process_body(T,BDD,BDD1,Vars,Vars1,Rest,Env,Module).
2420
2421process_body_db([],BDD,BDD,_DB,Vars,Vars,[],_Env,_Module):-!.
2422
2423process_body_db([\+ H|T],BDD,BDD1,DB,Vars,Vars1,[\+ H|Rest],Env,Module):-
2424 builtin(H),!,
2425 process_body_db(T,BDD,BDD1,DB,Vars,Vars1,Rest,Env,Module).
2426
2427process_body_db([\+ H|T],BDD,BDD1,DB,Vars,Vars1,[
2428 (\+ H1)|Rest],Env,Module):-!,
2429 add_mod_arg(H,Module,H1),
2430 process_body_db(T,BDD,BDD1,DB,Vars,Vars1,Rest,Env,Module).
2431
2432process_body_db([H|T],BDD,BDD1,DB,Vars,Vars1,[H|Rest],Env,Module):-
2433 builtin(H),!,
2434 process_body_db(T,BDD,BDD1,DB,Vars,Vars1,Rest,Env,Module).
2435
2436process_body_db([H|T],BDD,BDD1,DB,Vars,Vars1,
2437[H1|Rest],Env,Module):-
2438 add_mod_arg(H,Module,H1),
2439 process_body_db(T,BDD,BDD1,DB,Vars,Vars1,Rest,Env,Module).
2440
2441
2442
2443given(H):-
2444 lift_input_mod(M),
2445 functor(H,P,Ar),
2446 (M:input(P/Ar)).
2447
2448
2449given_cw(H):-
2450 lift_input_mod(M),
2451 functor(H,P,Ar),
2452 (M:input_cw(P/Ar)).
2453
2454
2455and_list([],B,B).
2456
2457and_list([H|T],B0,B1):-
2458 and(B0,H,B2),
2459 and_list(T,B2,B1).
2460
2483set_lift(M:Parameter,Value):-
2484 retract(M:local_setting(Parameter,_)),
2485 assert(M:local_setting(Parameter,Value)).
2495setting_lift(M:P,V):-
2496 M:local_setting(P,V).
2497
2498
2499difference([],_,[]).
2500
2501difference([H|T],L2,L3):-
2502 member_eq(H,L2),!,
2503 difference(T,L2,L3).
2504
2505difference([H|T],L2,[H|L3]):-
2506 difference(T,L2,L3).
2507
2508
2509member_eq(E,[H|_T]):-
2510 E==H,!.
2511
2512member_eq(E,[_H|T]):-
2513 member_eq(E,T).
2514
2515
2516
2517
2518
2519process_head(HeadList,M, GroundHeadList) :-
2520 ground_prob(HeadList), !,
2521 process_head_ground(HeadList,M, 0, GroundHeadList).
2522
2523process_head(HeadList,_M, HeadList).
2524
2525
2529process_head_ground([Head:ProbHead],M, Prob, [Head:ProbHead1|Null]) :-!,
2530 ProbHead1 is ProbHead,
2531 ProbLast is 1 - Prob - ProbHead1,
2532 M:local_setting(epsilon_parsing, Eps),
2533 EpsNeg is - Eps,
2534 ProbLast > EpsNeg,
2535 (ProbLast > Eps ->
2536 Null = ['':ProbLast]
2537 ;
2538 Null = []
2539 ).
2540
2541process_head_ground([Head:ProbHead|Tail], M, Prob, [Head:ProbHead1|Next]) :-
2542 ProbHead1 is ProbHead,
2543 ProbNext is Prob + ProbHead1,
2544 process_head_ground(Tail, M, ProbNext, Next).
2545
2546
2547ground_prob([]).
2548
2549ground_prob([_Head:ProbHead|Tail]) :-
2550 ground(ProbHead), 2551 ground_prob(Tail).
2552
2553get_probs([], []).
2554
2555get_probs([_H:P|T], [P1|T1]) :-
2556 P1 is P,
2557 get_probs(T, T1).
2558
2559
2560
2561
2562generate_clauses([],_M,_N,C,C):-!.
2563
2564generate_clauses([H|T],M,N,C0,C):-
2565 term_variables(H,V),
2566 gen_clause(H,M,N,N1,rule(_,[_:P|_],_,_),[(Head:-BA)]),!, 2567 append(C0,[(Head,BA,V,P)],C1),
2568 generate_clauses(T,M,N1,C1,C).
2569
2570
2571gen_clause((H :- Body),_M,N,N,(H :- Body),[(H :- Body)]):-!.
2572
2573
2574
2575gen_clause(rule(_R,HeadList,BodyList,Lit),_M,N,N1,
2576 rule(N,HeadList,BodyList,Lit),Clauses):-!,
2578 process_body(BodyList,_BDD,BDDAnd,[],_Vars,BodyList1,Env,Module),
2579 list2and(BodyList1,Body1),
2580 get_probs(HeadList,Probs),
2581 generate_rules(HeadList,Env,Body1,[],N,Probs,BDDAnd,0,Clauses,Module),
2582 N1 is N+1.
2583
2584gen_clause(def_rule(H,BodyList,Lit),_M,N,N,def_rule(H,BodyList,Lit),Clauses) :- !, 2586 process_body(BodyList,_BDD,BDDAnd,[],_Vars,BodyList2,Env,Module),
2587 list2and(BodyList2,Body1),
2588 add_bdd_arg(H,Env,BDDAnd,Module,Head1),
2589 Clauses=[(Head1 :- Body1)].
2590
2591
2592generate_clauses_bg([],[]):-!.
2593
2594generate_clauses_bg([H|T],[CL|T1]):-
2595 gen_clause_bg(H,CL), 2596 generate_clauses_bg(T,T1).
2597
2598gen_clause_bg(def_rule(H,BodyList,_Lit),Clauses) :-
2600 process_body_bg(BodyList,BodyList2,Module),
2601 list2and(BodyList2,Body1),
2602 add_mod_arg(H,Module,Head1),
2603 Clauses=(Head1 :- Body1).
2612builtin(G):-
2613 builtin_int(G),!.
2614
2615builtin_int(average(_L,_Av)).
2616builtin_int(G):-
2617 predicate_property(G,built_in).
2618builtin_int(G):-
2619 predicate_property(G,imported_from(lists)).
2620builtin_int(G):-
2621 predicate_property(G,imported_from(apply)).
2622builtin_int(G):-
2623 predicate_property(G,imported_from(nf_r)).
2624builtin_int(G):-
2625 predicate_property(G,imported_from(matrix)).
2626builtin_int(G):-
2627 predicate_property(G,imported_from(clpfd)).
2628
2629
2630
2631term_expansion_int((Head :- Body),M, (_Clauses,[rule(R,HeadList,BodyList,true)])) :-
2633 ((Head:-Body) \= ((user:term_expansion(_,_) ):- _ )),
2634 (Head = ((_H:_);_);Head=(_H:_)), !,
2635 list2or(HeadListOr, Head),
2636 get_next_rule_number(M,R),
2637 process_head(HeadListOr,M, HeadList),
2638 list2and(BodyList, Body).
2639
2640
2641term_expansion_int((Head :- Body),_M,(Clauses,[def_rule(Head,BodyList,true)])) :-
2643 ((Head:-Body) \= ((user:term_expansion(_,_)) :- _ )),!,
2644 list2and(BodyList, Body),
2645 process_body(BodyList,BDD,BDDAnd,[],_Vars,BodyList2,Env,Module),
2646 append([pita:one(Env,BDD)],BodyList2,BodyList3),
2647 list2and(BodyList3,Body2),
2648 add_bdd_arg(Head,Env,BDDAnd,Module,Head1),
2649 Clauses=(Head1 :- Body2).
2650
2651
2652term_expansion_int(Head,M,(_,[rule(R,HeadList,[],true)])) :-
2654 (Head \= ((user:term_expansion(_,_)) :- _ )),
2655 Head=(_H:_), !,
2656 list2or(HeadListOr, Head),
2657 process_head(HeadListOr,M, HeadList),
2658 get_next_rule_number(M,R).
2659
2660term_expansion_int(Head, _M,((Head1:-pita:one(Env,One)),[def_rule(Head,[],true)])) :-
2662 (Head \= ((user:term_expansion(_,_) ):- _ )),
2663 (Head\= end_of_file),!,
2664 add_bdd_arg(Head,Env,One,_Module,Head1).
2665
2666
2667test_no_area(TestSet,M,Prog,NPos,NNeg,LL,Results):-
2671 2672 test_folds(TestSet,M,Prog,Results,NPos,NNeg,LL).
2673
2674
2687test_folds(F,M,Prog,LG,NPos,NNeg,LL):-
2688 find_ex(F,M,Pos,Neg,NPos,NNeg),
2689 maplist(compute_prob_ex_pos(Prog,M),Pos,LGP),
2690 maplist(compute_prob_ex_neg(Prog,M),Neg,LGN),
2691 append(LGP,LGN,LG0),
2692 keysort(LG0,LG),
2693 foldl(ll(M),LG,0,LL).
2694
2695ll(M,P- (\+ _),LL0,LL):-!,
2696 (P=:=1.0->
2697 M:local_setting(logzero,LZ),
2698 LL is LL0+LZ
2699 ;
2700 LL is LL0+ log(1-P)
2701 ).
2702
2703ll(M,P- _,LL0,LL):-
2704 (P=:=0.0->
2705 M:local_setting(logzero,LZ),
2706 LL is LL0+LZ
2707 ;
2708 LL is LL0+ log(P)
2709 ).
2710
2711
2712
2713
2714
2715find_ex(DB,M,Pos,Neg,NPos,NNeg):-
2716 M:local_setting(neg_ex,given),!,
2717 M:output(P/A),!,
2718 find_ex_pred([P/A],M,DB,[],Pos,[],Neg),
2719 length(Pos,NPos),
2720 length(Neg,NNeg).
2721
2722find_ex(DB,M,Pos,Neg,NPos,NNeg):-
2723 M:local_setting(neg_ex,cw),
2724 M:output(P/A),!,
2725 find_ex_pred_cw([P/A],M,DB,[],Pos,[],Neg),
2726 length(Pos,NPos),
2727 length(Neg,NNeg).
2728
2729
2730find_ex_pred([],_M,_DB,Pos,Pos,Neg,Neg).
2731
2732find_ex_pred([P/A|T],M,DB,Pos0,Pos,Neg0,Neg):-
2733 functor(At,P,A),
2734 find_ex_db(DB,M,At,Pos0,Pos1,Neg0,Neg1),
2735 find_ex_pred(T,M,DB,Pos1,Pos,Neg1,Neg).
2736
2737find_ex_db([],_M,_At,Pos,Pos,Neg,Neg).
2738
2739find_ex_db([H|T],M,At,Pos0,Pos,Neg0,Neg):-
2740 At=..[P|L],
2741 At1=..[P,H|L],
2742 findall(At1,M:At1,LP),
2743 findall(At1,M:neg(At1),LN),
2744 append([Pos0,LP],Pos1),
2745 append([Neg0,LN],Neg1),
2746 find_ex_db(T,M,At,Pos1,Pos,Neg1,Neg).
2747
2748
2749find_ex_pred_cw([],_M,_DB,Pos,Pos,Neg,Neg).
2750
2751find_ex_pred_cw([P/A|T],M,DB,Pos0,Pos,Neg0,Neg):-
2752 functor(At,P,A),
2753 findall(Types,get_types(At,M,Types),LT),
2754 append(LT,LLT),
2755 remove_duplicates(LLT,Types1),
2756 find_ex_db_cw(DB,M,At,Types1,Pos0,Pos1,Neg0,Neg1),
2757 find_ex_pred_cw(T,M,DB,Pos1,Pos,Neg1,Neg).
2758
2759get_types(At,_M,[]):-
2760 At=..[_],!.
2761
2762get_types(At,M,Types):-
2763 M:modeh(_,At),
2764 At=..[_|Args],
2765 get_args(Args,Types).
2766
2767get_types(At,M,Types):-
2768 M:modeh(_,HT,_,_),
2769 member(At,HT),
2770 At=..[_|Args],
2771 get_args(Args,Types).
2772
2773
2774get_args([],[]).
2775
2776get_args([+H|T],[H|T1]):-!,
2777 get_args(T,T1).
2778
2779get_args([-H|T],[H|T1]):-!,
2780 get_args(T,T1).
2781
2782get_args([#H|T],[H|T1]):-!,
2783 get_args(T,T1).
2784
2785get_args([-#H|T],[H|T1]):-!,
2786 get_args(T,T1).
2787
2788get_args([H|T],[H|T1]):-
2789 get_args(T,T1).
2790
2791
2792
2793
2794get_constants([],_Mod,_M,[]).
2795
2796get_constants([Type|T],Mod,M,[(Type,Co)|C]):-
2797 find_pred_using_type(Type,Mod,LP),
2798 find_constants(LP,Mod,M,[],Co),
2799 get_constants(T,Mod,M,C).
2800
2801find_pred_using_type(T,M,L):-
2802 (setof((P,Ar,A),pred_type(T,M,P,Ar,A),L)->
2803 true
2804 ;
2805 L=[]
2806 ).
2807
2808pred_type(T,M,P,Ar,A):-
2809 M:modeh(_,S),
2810 S=..[P|Args],
2811 length(Args,Ar),
2812 scan_args(Args,T,1,A).
2813
2814pred_type(T,M,P,Ar,A):-
2815 M:modeb(_,S),
2816 S=..[P|Args],
2817 length(Args,Ar),
2818 scan_args(Args,T,1,A).
2819
2820scan_args([+T|_],T,A,A):-!.
2821
2822scan_args([-T|_],T,A,A):-!.
2823
2824scan_args([#T|_],T,A,A):-!.
2825
2826scan_args([-#T|_],T,A,A):-!.
2827
2828scan_args([_|Tail],T,A0,A):-
2829 A1 is A0+1,
2830 scan_args(Tail,T,A1,A).
2831
2832find_constants([],_Mod,_M,C,C).
2833
2834find_constants([(P,Ar,A)|T],Mod,M,C0,C):-
2835 gen_goal(1,Ar,A,Args,ArgsNoV,V),
2836 G=..[P,M|Args],
2837 (setof(V,ArgsNoV^call_goal(Mod,G),LC)->
2838 true
2839 ;
2840 LC=[]
2841 ),
2842 append(C0,LC,C1),
2843 remove_duplicates(C1,C2),
2844 find_constants(T,Mod,M,C2,C).
2845
2846call_goal(M,G):-
2847 M:G.
2848
2849gen_goal(Arg,Ar,_A,[],[],_):-
2850 Arg =:= Ar+1,!.
2851
2852gen_goal(A,Ar,A,[V|Args],ArgsNoV,V):-!,
2853 Arg1 is A+1,
2854 gen_goal(Arg1,Ar,A,Args,ArgsNoV,V).
2855
2856gen_goal(Arg,Ar,A,[ArgV|Args],[ArgV|ArgsNoV],V):-
2857 Arg1 is Arg+1,
2858 gen_goal(Arg1,Ar,A,Args,ArgsNoV,V).
2859
2860
2861
2862find_ex_db_cw([],_M,_At,_Ty,Pos,Pos,Neg,Neg).
2863
2864find_ex_db_cw([H|T],M,At,Types,Pos0,Pos,Neg0,Neg):-
2865 get_constants(Types,M,H,C),
2866 At=..[P|L],
2867 get_types(At,M,TypesA),!,
2868 length(L,N),
2869 length(LN,N),
2870 At1=..[P,H|LN],
2871 findall(At1,M:At1,LP),
2872 (setof(At1,neg_ex(LN,TypesA,M,At1,C),LNeg)->true;LNeg=[]),
2873 append([Pos0,LP],Pos1),
2874 append([Neg0,LNeg],Neg1),
2875 find_ex_db_cw(T,M,At,Types,Pos1,Pos,Neg1,Neg).
2876
2877neg_ex([],[],M,At1,_C):-
2878 \+ M:At1.
2879
2880neg_ex([H|T],[HT|TT],M,At1,C):-
2881 member((HT,Co),C),
2882 member(H,Co),
2883 neg_ex(T,TT,M,At1,C).
2884
2885
2886
2887compute_prob_ex_neg(Prog,M,H,PG- (\+ H)):-
2888 length(Prog,N),
2889 gen_initial_counts(N,MI0),
2890 test_theory_neg_prob([H],M,Prog,MI0,MI),
2891 compute_prob_ex(Prog,MI,1,PG0),
2892 PG is 1-PG0.
2893
2894compute_prob_ex_pos(Prog,M,H,PG- H):-
2895 length(Prog,N),
2896 gen_initial_counts(N,MI0),
2897 test_theory_neg_prob([H],M,Prog,MI0,MI),
2898 compute_prob_ex(Prog,MI,1,PG0),
2899 PG is 1-PG0.
2900
2901compute_prob_ex([],[],PG,PG).
2902
2903compute_prob_ex([(_,_,_,P)|R],[MIH|MIT],PG0,PG):-
2904 PG1 is PG0*(1-P)^MIH,
2905 compute_prob_ex(R,MIT,PG1,PG).
2906
2907writes([H-H1],S):-
2908 format(S,"~f - (~q)]).~n~n",[H,H1]).
2909
2910writes([H-H1|T],S):-
2911 format(S,"~f - (~q),~n",[H,H1]),
2912 writes(T,S).
2913
2914
2915write_p(P,S):-
2916 get_xy(P,PX,PY),
2917 format(S,"x=[",[]),
2918 writesf(PX,S),
2919 format(S,"y=[",[]),
2920 writesf(PY,S),
2921 format(S,"
2922figure('Name','roc','NumberTitle','off')
2923set(gca,'XLim',[0.0 1.0])
2924set(gca,'YLim',[0.0 1.0])
2925x=[x 1.0]
2926y=[y 0.0]
2927k=convhull(x,y)
2928plot(x(k),y(k),'r-',x,y,'--b+')
2929%A = polyarea(x,y)~n~n
2930%save area_roc.csv A -ascii -append
2931",
2932 []).
2933
2934get_xy([],[],[]).
2935
2936get_xy([X-Y|T],[X|TX],[Y|TY]):-
2937 get_xy(T,TX,TY).
2938
2939
2940writesf([H],S):-
2941 format(S,"~f]~n",[H]).
2942
2943writesf([H|T],S):-
2944 format(S,"~f ",[H]),
2945 writesf(T,S).
2946
2947write_ppr(P,S):-
2948 get_xy(P,PX,PY),
2949 format(S,"rec=[",[A]),
2950 writesf(PX,S),
2951 format(S,"prec=[",[A]),
2952 writesf(PY,S),
2953 format(S,"
2954figure('Name','pr','NumberTitle','off')
2955set(gca,'XLim',[0.0 1.0])
2956set(gca,'YLim',[0.0 1.0])
2957rec=[0.0 rec 1.0];
2958prec=[0.0 prec 0.0];
2959plot(rec,prec,'--*k')
2960%A=polyarea(rec,prec)
2961%save area_pr.csv A -ascii -append
2962~n~n",
2963 []).
2971write2(M,A):-
2972 M:local_setting(verbosity,Ver),
2973 (Ver>1->
2974 write(A)
2975 ;
2976 true
2977 ).
2984write3(M,A):-
2985 M:local_setting(verbosity,Ver),
2986 (Ver>2->
2987 write(A)
2988 ;
2989 true
2990 ).
2998write4(M,A):-
2999 M:local_setting(verbosity,Ver),
3000 (Ver>3->
3001 write(A)
3002 ;
3003 true
3004 ).
3011nl2(M):-
3012 M:local_setting(verbosity,Ver),
3013 (Ver>1->
3014 nl
3015 ;
3016 true
3017 ).
3024nl3(M):-
3025 M:local_setting(verbosity,Ver),
3026 (Ver>2->
3027 nl
3028 ;
3029 true
3030 ).
3038nl4(M):-
3039 M:local_setting(verbosity,Ver),
3040 (Ver>3->
3041 nl
3042 ;
3043 true
3044 ).
3051format2(M,A,B):-
3052 M:local_setting(verbosity,Ver),
3053 (Ver>1->
3054 format(A,B)
3055 ;
3056 true
3057 ).
3064format3(M,A,B):-
3065 M:local_setting(verbosity,Ver),
3066 (Ver>2->
3067 format(A,B)
3068 ;
3069 true
3070 ).
3077format4(M,A,B):-
3078 M:local_setting(verbosity,Ver),
3079 (Ver>3->
3080 format(A,B)
3081 ;
3082 true
3083 ).
3090write_rules2(M,A,B):-
3091 M:local_setting(verbosity,Ver),
3092 (Ver>1->
3093 write_rules(A,B)
3094 ;
3095 true
3096 ).
3103write_rules3(M,A,B):-
3104 M:local_setting(verbosity,Ver),
3105 (Ver>2->
3106 write_rules(A,B)
3107 ;
3108 true
3109 ).
3110
3111
3112write_disj_clause2(M,A,B):-
3113 M:local_setting(verbosity,Ver),
3114 (Ver>1->
3115 write_disj_clause(A,B)
3116 ;
3117 true
3118 ).
3119
3120write_disj_clause3(M,A,B):-
3121 M:local_setting(verbosity,Ver),
3122 (Ver>2->
3123 write_disj_clause(A,B)
3124 ;
3125 true
3126 ).
3127
3128write_body2(M,A,B):-
3129 M:local_setting(verbosity,Ver),
3130 (Ver>1->
3131 write_body(A,B)
3132 ;
3133 true
3134 ).
3135
3136write_body3(M,A,B):-
3137 M:local_setting(verbosity,Ver),
3138 (Ver>2->
3139 write_body(A,B)
3140 ;
3141 true
3142 ).
3143
3144
3145
3146
3147lift_expansion((:- begin_bg), []) :-
3148 prolog_load_context(module, M),
3149 lift_input_mod(M),!,
3150 assert(M:bg_on).
3151
3152lift_expansion(C, M:bgc(C)) :-
3153 prolog_load_context(module, M),
3154 C\= (:- end_bg),
3155 lift_input_mod(M),
3156 M:bg_on,!.
3157
3158lift_expansion((:- end_bg), []) :-
3159 prolog_load_context(module, M),
3160 lift_input_mod(M),!,
3161 retractall(M:bg_on),
3162 findall(C,M:bgc(C),L),
3163 retractall(M:bgc(_)),
3164 (M:bg(BG0)->
3165 retract(M:bg(BG0)),
3166 append(BG0,L,BG),
3167 assert(M:bg(BG))
3168 ;
3169 assert(M:bg(L))
3170 ).
3171
3172
3173
3174
3175
3176
3177lift_expansion((:- begin_in), []) :-
3178 prolog_load_context(module, M),
3179 lift_input_mod(M),!,
3180 assert(M:in_on).
3181
3182lift_expansion(C, M:inc(C)) :-
3183 prolog_load_context(module, M),
3184 C\= (:- end_in),
3185 lift_input_mod(M),
3186 M:in_on,!.
3187
3188lift_expansion((:- end_in), []) :-
3189 prolog_load_context(module, M),
3190 lift_input_mod(M),!,
3191 retractall(M:in_on),
3192 findall(C,M:inc(C),L),
3193 retractall(M:inc(_)),
3194 (M:in(IN0)->
3195 retract(M:in(IN0)),
3196 append(IN0,L,IN),
3197 assert(M:in(IN))
3198 ;
3199 assert(M:in(L))
3200 ).
3201
3202lift_expansion(begin(model(I)), []) :-
3203 prolog_load_context(module, M),
3204 lift_input_mod(M),!,
3205 retractall(M:model(_)),
3206 assert(M:model(I)),
3207 assert(M:int(I)).
3208
3209lift_expansion(end(model(_I)), []) :-
3210 prolog_load_context(module, M),
3211 lift_input_mod(M),!,
3212 retractall(M:model(_)).
3213
3214lift_expansion(At, A) :-
3215 prolog_load_context(module, M),
3216 lift_input_mod(M),
3217 M:model(Name),
3218 At \= (_ :- _),
3219 At \= end_of_file,
3220 (At=neg(Atom)->
3221 Atom=..[Pred|Args],
3222 Atom1=..[Pred,Name|Args],
3223 A=neg(Atom1)
3224 ;
3225 (At=prob(Pr)->
3226 A='$prob'(Name,Pr)
3227 ;
3228 At=..[Pred|Args],
3229 Atom1=..[Pred,Name|Args],
3230 A=Atom1
3231 )
3232 ).
3233
3234 :- multifile sandbox:safe_meta/2. 3235
3236 sandbox:safe_meta(liftcover:induce_par_lift(_,_) ,[]).
3237 sandbox:safe_meta(liftcover:induce_lift(_,_), []).
3238 sandbox:safe_meta(liftcover:test_prob_lift(_,_,_,_,_,_), []).
3239 sandbox:safe_meta(liftcover:test_lift(_,_,_,_,_,_,_), []).
3240 sandbox:safe_meta(liftcover:set_lift(_,_), []).
3241 sandbox:safe_meta(liftcover:setting_lift(_,_), []).
3242
3243
3244
3245:- thread_local lift_file/1. 3246
3247
3248user:term_expansion((:- lift), []) :-!,
3249 prolog_load_context(module, M),
3250 prolog_load_context(source, Source),
3251 asserta(lift_file(Source)),
3255 retractall(M:local_setting(_,_)),
3256 findall(local_setting(P,V),default_setting_lift(P,V),L),
3257 assert_all(L,M,_),
3258 assert(lift_input_mod(M)),
3259 retractall(M:rule_lift_n(_)),
3260 assert(M:rule_lift_n(0)),
3261 M:dynamic((modeh/2,modeh/4,fixed_rule/3,banned/2,lookahead/2,
3262 lookahead_cons/2,lookahead_cons_var/2,prob/2,output/1,input/1,input_cw/1,
3263 ref_clause/1,ref/1,model/1,neg/1,rule/4,determination/2,
3264 bg_on/0,bg/1,bgc/1,in_on/0,in/1,inc/1,int/1)),
3265 style_check(-discontiguous).
3266
3267user:term_expansion(end_of_file, C) :-
3268 lift_file(Source),
3269 prolog_load_context(source, Source),
3270 retractall(lift_file(Source)),
3271 prolog_load_context(module, M),
3272 lift_input_mod(M),!,
3273 retractall(lift_input_mod(M)),
3274 make_dynamic(M),
3276 3277 C=[(:- style_check(+discontiguous)),end_of_file].
3278
3279user:term_expansion(In, Out) :-
3280 \+ current_prolog_flag(xref, true),
3281 lift_file(Source),
3282 prolog_load_context(source, Source),
3283 lift_expansion(In, Out).
3284
3285
3286
3287
3288
3289
slipcover
This module performs learning over Logic Programs with Annotated Disjunctions and CP-Logic programs. It performs both parameter and structure learning.
See https://github.com/friguzzi/cplint/blob/master/doc/manual.pdf or http://ds.ing.unife.it/~friguzzi/software/cplint-swi/manual.html for details.