16/* 17 18SLIPCOVER 19 20Copyright (c) 2016, Fabrizio Riguzzi and Elena Bellodi 21 22*/ 23:-module(liftcover,[set_lift/2,setting_lift/2, 24 induce_lift/2,induce_par_lift/2,test_lift/7, 25 filter_rules/2,filter_rules/3,sort_rules/2, 26 remove_zero/2, 27 op(500,fx,#),op(500,fx,'-#'), 28 test_prob_lift/6, 29 prob_lift/2,prob_lift/3, 30 explain_lift/2,explain_lift/3, 31 ranked_answers/3, 32 ranked_answers/4, 33 rank/3, 34 rank_answer/3, 35 rank_answer/4, 36 hits_at_k/6, 37 hits_at_k/7, 38 rank_ex/3, 39 rank_exs/4, 40 inst_exs/4 41 ]). 42:-use_module(library(auc)). 43:-use_module(library(lists)). 44:-use_module(library(random)). 45:-use_module(library(system)). 46:-use_module(library(terms)). 47:-use_module(library(ordsets)). 48:-use_module(library(apply)). 49:-use_module(library(settings)). 50:-use_module(library(clpfd), [transpose/2]). 51:-absolute_file_name(library(lbfgs),F,[solutions(all)]),atomic_concat(F,'.pl',Fpl),exists_file(Fpl),use_module(library(lbfgs));true. 52%:-use_foreign_library(foreign(bddem),install). 53:-set_prolog_flag(unknown,warning). 54 55%:-multifile setting_lift/2. 56%:-use_module(library(sandbox)). 57 58 59:- dynamic lift_input_mod/1. 60 61:- thread_local v/3, lift_input_mod/1, local_setting/2, rule_lift_n/1. 62 63:- meta_predicate induce_lift( , ). 64:- meta_predicate induce_rules( , ). 65:- meta_predicate induce_par_lift( , ). 66:- meta_predicate induce_parameters( , ). 67 68 69 70:- meta_predicate test_lift( , , , , , , ). 71:- meta_predicate test_prob_lift( , , , , , ). 72:- meta_predicate prob_lift( , ). 73:- meta_predicate prob_lift( , , ). 74:- meta_predicate explain_lift( , ). 75:- meta_predicate explain_lift( , , ). 76:- meta_predicate ranked_answers( , , ). 77:- meta_predicate ranked_answers( , , , ). 78:- meta_predicate rank_answer( , , ). 79:- meta_predicate rank_answer( , , , ). 80:- meta_predicate hits_at_k( , , , , , ). 81:- meta_predicate hits_at_k( , , , , , , ). 82:- meta_predicate rank_ex( , , ). 83:- meta_predicate rank_exs( , , , ). 84:- meta_predicate inst_exs( , , , ). 85:- meta_predicate set_lift( , ). 86:- meta_predicate setting_lift( , ). 87:- meta_predicate filter_rules( , ). 88 89 90 91 92:- setting(max_threads, integer, 256, 93 'Maximum number of threads to use in scoring clause refinements and parameter learning'). 94:- setting(allow_gpu, boolean, true, 95 'Whether the use of GPU is allowed'). 96 97 98 99default_setting_lift(eps,0.0001). 100default_setting_lift(eps_f,0.00001). 101 102 103default_setting_lift(random_restarts_number,1). % number of random restarts of parameter learning 104default_setting_lift(random_restarts_number_str_learn,1). % number of random restarts during structure learning of parameter learning for single clauses 105default_setting_lift(iter,100). 106default_setting_lift(d,1). 107default_setting_lift(verbosity,1). 108default_setting_lift(logzero,log(0.000001)). 109default_setting_lift(megaex_bottom,1). 110default_setting_lift(initial_clauses_per_megaex,1). 111default_setting_lift(max_iter,10). 112default_setting_lift(max_var,4). 113default_setting_lift(maxdepth_var,2). 114default_setting_lift(beamsize,100). 115default_setting_lift(max_clauses,1000). 116default_setting_lift(max_body_length,100). 117default_setting_lift(neg_literals,false). 118 119default_setting_lift(specialization,bottom). 120/* allowed values: mode,bottom */ 121 122default_setting_lift(seed,rand(10,1231,3032)). 123default_setting_lift(neg_ex,cw). 124 125 126default_setting_lift(epsilon_parsing, 1e-5). 127 128 129 130 131default_setting_lift(zero,0.000001). 132default_setting_lift(minus_infinity,-1.0e20). 133 134default_setting_lift(regularization,l1). % regularization: no, l1, l2, bayesian 135default_setting_lift(gamma,10). % set the value of gamma for regularization l1 and l2 136default_setting_lift(ab,[0,10]). % set the value of a and b for regularization baysian 137default_setting_lift(min_probability,1e-5). % Threshold of the probability under which the clause is dropped 138default_setting_lift(parameter_learning,em). % parameter learning algorithm: em_python, em, lbfgs, gd_python, gd 139default_setting_lift(max_initial_weight,0.5). % initial weights of dphil in [-0.5 0.5] 140 141default_setting_lift(parameter_update,fixed_learning_rate). % values: fixed_learning_rate,adam 142default_setting_lift(eta,0.01). % fixed learning rate 143default_setting_lift(adam_params,[0.001,0.9,0.999,1e-8]). % default Adam hyper-pameters 144default_setting_lift(processor,cpu). % where to run em_python and gd_python: cpu or gpu 145default_setting_lift(threads,1). % number of threads to use in scoring clause refinements and parameter learning 146default_setting_lift(single_var,false). %false:1 variable for every grounding of a rule; true: 1 variable for rule (even if a rule has more groundings),simpler.
155induce_lift(TrainFolds,P):-
156 induce_rules(TrainFolds,P0),
157 rules2terms(P0,P).
168test_lift(P,TestFolds,LL,AUCROC,ROC,AUCPR,PR):-
169 test_prob_lift(P,TestFolds,_NPos,_NNeg,LL,LG),
170 compute_areas_diagrams(LG,AUCROC,ROC,AUCPR,PR).
181test_prob_lift(M:P,TestFolds,NPos,NNeg,CLL,Results) :- 182 write2(M,'Testing\n'), 183 make_dynamic(M), 184 process_clauses(P,M,PRules), 185 generate_clauses(PRules,M,0,Prog), 186 (M:bg(RBG0)-> 187 process_clauses(RBG0,M,RBG), 188 generate_clauses_bg(RBG,ClBG), 189 assert_all(ClBG,M,ClBGRef) 190 ; 191 true 192 ), 193 findall(Exs,(member(F,TestFolds),M:fold(F,Exs)),L), 194 append(L,DB), 195 test_no_area(DB,M,Prog,NPos,NNeg,CLL,Results), 196 (M:bg(RBG0)-> 197 retract_all(ClBGRef) 198 ; 199 true 200 ). 201 202induce_rules(M:Folds,R):- 203 load_python_module(M), 204 make_dynamic(M), 205 M:local_setting(seed,Seed), 206 setrand(Seed), 207 findall(Exs,(member(F,Folds),M:fold(F,Exs)),L), 208 append(L,DB), 209 (M:bg(RBG0)-> 210 process_clauses(RBG0,M,RBG), 211 generate_clauses_bg(RBG,ClBG), 212 assert_all(ClBG,M,ClBGRef) 213 ; 214 true 215 ), 216 find_ex(DB,M,Pos,Neg,NPos,_Neg), 217 M:local_setting(megaex_bottom, NumMB), 218 (NPos >= NumMB -> 219 true 220 ; 221 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", []), 222 M:set_lift(megaex_bottom, NPos) 223 ), 224 statistics(walltime,[_,_]), 225 (M:local_setting(specialization,bottom)-> 226 M:local_setting(megaex_bottom,MB), 227 deduct(MB,M,DB,[],InitialTheory), 228 remove_duplicates(InitialTheory,R1) 229 ; 230 get_head_atoms(O,M), 231 generate_top_cl(O,M,R1) 232 ), 233 learn_struct(Pos,Neg,M,R1,R2,Score), 234 sort_rules_int(R2,R), 235 statistics(walltime,[_,WT]), 236 WTS is WT/1000, 237 write2(M,'\n\n'), 238 format2(M,'/* Final score ~f~n',[Score]), 239 format2(M,'Wall time ~f */~n',[WTS]), 240 write_rules2(M,R,user_output), 241 (M:bg(RBG0)-> 242 retract_all(ClBGRef) 243 ; 244 true 245 ), 246 retractall(M:ref_clause(_)), 247 retractall(M:ref(_)).
254sort_rules(R0,R):- 255 rules2terms(P0,R0), 256 sort_rules_int(P0,P), 257 rules2terms(P,R). 258 259sort_rules_int(P0,P):- 260 maplist(to_pair,P0,P1), 261 sort(1,@>=,P1,P2), 262 maplist(to_pair,P,P2). 263 264to_pair(rule(N,[H:P|R],BL,Lit),P-rule(N,[H:P|R],BL,Lit)). 265 266 267make_dynamic(M):- 268 M:(dynamic int/1), 269 findall(O,M:output(O),LO), 270 findall(I,M:input(I),LI), 271 findall(I,M:input_cw(I),LIC), 272 findall(D,M:determination(D,_DD),LDH), 273 findall(DD,M:determination(_D,DD),LDD), 274 findall(DH,(M:modeh(_,_,_,LD),member(DH,LD)),LDDH), 275 append([LO,LI,LIC,LDH,LDD,LDDH],L0), 276 remove_duplicates(L0,L), 277 maplist(to_dyn(M),L). 278 279to_dyn(M,P/A):- 280 A1 is A+1, 281 M:(dynamic P/A1), 282 A2 is A1+1, 283 M:(dynamic P/A2). 284 285 286 287learn_struct(Pos,Neg,Mod,Beam,R,Score):- %+Beam:initial theory of the form [rule(NR,[h],[b]],...], -R:final theory of the same form, -CLL 288 format2(Mod,"Clause search~n~n",[]), 289 Mod:local_setting(max_iter,M), 290 Mod:local_setting(beamsize,BS), 291 Mod:local_setting(max_clauses,MC), 292 cycle_beam(Beam,Mod,Pos,Neg,[],CL,0,M,BS,MC), 293 maplist(get_cl,CL,LC,MIC,MINC), 294 maplist(append,MIC,MIC1), 295 transpose(MIC1,MI), 296 append(MINC,MIN), 297 length(LC,NumCL), 298 write2(Mod,"Final parameter learning"),nl2(Mod), 299 Mod:local_setting(random_restarts_number,RR), 300 learn_param_int(MI,MIN,NumCL,Mod,RR,Par,Score), 301 update_theory(LC,Par,Program1), 302 remove_zero(Program1,R), 303 format2(Mod,"Best target theory~n~n",[]), 304 write_rules2(Mod,R,user_output). 305 306get_cl(c(_,C,[MI,MIN]),C,MI,MIN). 307 308pick_first(0,_,[]):-!. 309 310pick_first(_,[],[]):-!. 311 312pick_first(N,[(H,_S)|T],[H|T1]):- 313 N1 is N-1, 314 pick_first(N1,T,T1). 315 316remove_score([],[]). 317 318remove_score([(H,_S)|T],[H|T1]):- 319 remove_score(T,T1). 320 321init_gd_par(0,_Max,[]):-!. 322 323init_gd_par(I,Max,[W|TW]):- 324 I1 is I-1, 325 W is -Max+random_float*2*Max, 326 init_gd_par(I1,Max,TW). 327 328init_par(_Env,0):-!. 329 330init_par(Env,I):- 331 I1 is I-1, 332 optimizer_set_x(Env,I1,0.5), 333 init_par(Env,I1). 334 335evaluate_L(Env,M,MIP,MI,L):- 336 compute_likelihood_pos(MIP,Env,M,0,0,LP), 337 compute_likelihood_neg(MI,Env,M,LN), 338 compute_likelihood(LN,M,LP,L). 339 340gen_initial_counts(0,[]):-!. 341 342gen_initial_counts(N0,[0|MIP0]):- 343 N1 is N0-1, 344 gen_initial_counts(N1,MIP0). 345 346evaluate(Env,L,_N,_Step,[M,MIP,MI]):- 347% M:mip(MIP), 348% M:mi(MI), 349 compute_likelihood_pos(MIP,Env,M,0,0,LP), 350 compute_likelihood_neg(MI,Env,M,LN), 351 compute_likelihood(LN,M,LP,L), 352 compute_grad(MIP,Env,M,0,MI,LN). 353 354compute_grad([],_Env,_M,_N,_MI,_LN):-!. 355 356compute_grad([HMIP|TMIP],Env,M,N0,MI,LN):- 357 compute_sum_neg(MI,M,LN,N0,0,S), 358 optimizer_get_x(Env,N0,P0), 359 M:local_setting(zero,Zero), 360 (P0=<0 -> 361 PI=Zero 362 ; 363 (P0>=1.0-> 364 PI is 1.0-Zero 365 ; 366 PI=P0 367 ) 368 ), 369 370 (PI=:= 1.0-> 371 G is 1.0/Zero 372 ; 373 G is (HMIP-S)/(1.0-PI) 374 ), 375 optimizer_set_g(Env,N0,G), 376 N1 is N0+1, 377 compute_grad(TMIP,Env,M,N1,MI,LN). 378 379compute_sum_neg([],_M,_LN,_I,S,S). 380 381compute_sum_neg([HMI|TMI],M,[HLN|TLN],I,S0,S):- 382 nth0(I,HMI,MIR), 383 Den is 1.0-exp(-HLN), 384 M:local_setting(zero,Zero), 385 (Den=<0.0-> 386 Den1 is Zero 387 ; 388 Den1 = Den 389 ), 390 S1 is S0+MIR*exp(-HLN)/Den1, 391 compute_sum_neg(TMI,M,TLN,I,S1,S). 392 393compute_likelihood([],_M,L,L). 394 395compute_likelihood([HP|TP],M,L0,L):- 396 A is 1.0-exp(-HP), 397 M:local_setting(zero,Zero), 398 (A=<0.0-> 399 A1 is Zero 400 ; 401 A1=A 402 ), 403 L1 is L0-log(A1), 404 compute_likelihood(TP,M,L1,L). 405 406compute_likelihood_neg([],_Env,_M,[]). 407 408compute_likelihood_neg([HMI|TMI],Env,M,[HLN|TLN]):- 409 compute_likelihood_pos(HMI,Env,M,0,0,HLN), 410 compute_likelihood_neg(TMI,Env,M,TLN). 411 412compute_likelihood_pos([],_Env,_M,_,LP,LP). 413 414compute_likelihood_pos([HMIP|TMIP],Env,M,I,LP0,LP):- 415 optimizer_get_x(Env,I,P0), 416 M:local_setting(zero,Zero), 417 (P0=<0.0 -> 418 P=Zero 419 ; 420 (P0>=1.0-> 421 P is 1-Zero 422 ; 423 P=P0 424 ) 425 ), 426 LP1 is LP0-log(1-P)*HMIP, 427 I1 is I+1, 428 compute_likelihood_pos(TMIP,Env,M,I1,LP1,LP). 429 430progress(_Env,FX,X_Norm,G_Norm,Step,_N,Iteration,Ls,0,[M|_]) :- 431 format4(M,'~d. Iteration : f(X)=~4f |X|=~4f 432 |g(X)|=~4f Step=~4f Ls=~4f~n', 433 [Iteration,FX,X_Norm,G_Norm,Step,Ls]). 434 435gen_par(NC,NC,[]):-!. 436 437gen_par(N0,NC,[[N0,[0.5,0.5]]|T]):- 438 N1 is N0+1, 439 gen_par(N1,NC,T). 440 441 442logistic(X,Sigma_X):- 443 Sigma_X is 1/(1+exp(-X)). 444 445 446load_python_module(M):- 447 M:local_setting(parameter_learning,PL), 448 (PL=em_python;PL=gd_python),!, 449 absolute_file_name(library('liftcover.pl'), F), 450 file_directory_name(F,Dir), 451 py_add_lib_dir(Dir), 452 processor(M,Proc), 453 M:local_setting(verbosity,Verb), 454 py_call(liftcover:init(PL,Proc,Verb)). 455 456load_python_module(_). 457 458processor(M,Proc):- 459 M:local_setting(processor,Proc0), 460 (setting(allow_gpu,true)-> 461 Proc=Proc0 462 ; 463 Proc = cpu 464 ).
473induce_par_lift(Folds,ROut):- 474 induce_parameters(Folds,R), 475 rules2terms(R,ROut). 476 477induce_parameters(M:Folds,R):- 478 load_python_module(M), 479 make_dynamic(M), 480 M:local_setting(seed,Seed), 481 setrand(Seed), 482 findall(Exs,(member(F,Folds),M:fold(F,Exs)),L), 483 append(L,DB), 484 statistics(walltime,[_,_]), 485 (M:bg(RBG0)-> 486 process_clauses(RBG0,M,RBG), 487 generate_clauses_bg(RBG,ClBG), 488 assert_all(ClBG,M,ClBGRef) 489 ; 490 true 491 ), 492 M:in(R00), 493 process_clauses(R00,M,R0), 494 statistics(walltime,[_,_]), 495 find_ex(DB,M,Pos,Neg,_NPos,_NNeg), 496 M:local_setting(random_restarts_number_str_learn,RR), 497 number_of_threads(M,Th), 498 learn_param(R0,M,Pos,Neg,RR,Th,R1,Score,_MI,_MIN), 499 sort_rules_int(R1,R), 500 statistics(walltime,[_,CT]), 501 CTS is CT/1000, 502 format2(M,'/* Final score ~f~n',[Score]), 503 format2(M,'Wall time ~f */~n',[CTS]), 504 write_rules2(M,R,user_output), 505 (M:bg(RBG0)-> 506 retract_all(ClBGRef) 507 ; 508 true 509 ). 510 511number_of_threads(M,Th):- 512 M:local_setting(threads,Th0), 513 current_prolog_flag(cpu_count,Cores), 514 ((Th0=cpu;Th0>Cores)-> 515 Th1 = Cores 516 ; 517 Th1 = Th0 518 ), 519 setting(max_threads,ThMax), 520 Th is min(Th1,ThMax).
min_prob
parmeter.
/
527filter_rules(M:R0,R):-
528 M:local_setting(min_probability,Min_prob),
529 filter_rules(R0,R,Min_prob).
Min_prob
.
/
537filter_rules(R0,R,Min_prob):-
538 (R0=[(_ :- _)|_]->
539 rules2terms(R0At,R0),
540 remove_clauses(R0At,Min_prob,RAt,_Num),
541 rules2terms(RAt,R)
542 ;
543 remove_clauses(R0,Min_prob,R,_Num)
544 ).
551remove_zero(R0,R1):- 552 filter_rules(R0,R1,0.0). 553 554 555remove_clauses(Rules,Prob,RulesOut,Num):- 556 remove_clauses_loop(Rules,Prob,0,Num,[],RulesOut). 557 558remove_clauses_loop([],_,Num,Num,Rules,Rules). 559remove_clauses_loop([Rule|Rest],Prob,NumCur,Num,RulesCur,RulesOut):- 560 Rule=rule(_N,[_Head:Par|_],_,_), 561 Par =< Prob,!, 562 NumCur1 is NumCur+1, 563 remove_clauses_loop(Rest, Prob, NumCur1,Num,RulesCur, RulesOut). 564 565remove_clauses_loop([Rule|Rest],Prob,NumCur,Num,RulesCur,[Rule|RulesOut]):- 566 remove_clauses_loop(Rest, Prob, NumCur,Num,RulesCur, RulesOut). 567 568 569test_theory_neg_prob(Ex,M,Theory,MIP0,MIP):- 570 (M:local_setting(single_var,false)-> 571 test_clause_prob(Theory,M,Ex,MIP0,MIP) 572 ; 573 test_clause_prob_sv(Theory,M,Ex,MIP0,MIP) 574 ). 575 576test_clause_prob([],_M,_Exs,MIP,MIP). 577 578test_clause_prob([(H,B,V,_P)|Rest],M,Exs,[MIPH0|MIPT0],[MIPH|MIPT]):- 579 maplist(test_ex(V,H,B,M),Exs,L), 580 sum_list(L,MIP), 581 MIPH is MIPH0+MIP, 582 test_clause_prob(Rest,M,Exs,MIPT0,MIPT). 583 584test_ex(_V,H,B,M,E,N):- 585 findall(1,(H=E,M:B),L), 586 length(L,N). 587 588test_clause_prob_sv([],_M,_Exs,MIP,MIP). 589 590test_clause_prob_sv([(H,B,V,_P)|Rest],M,Exs,[MIPH0|MIPT0],[MIPH|MIPT]):- 591 maplist(test_ex_sv(V,H,B,M),Exs,L), 592 sum_list(L,MIP), 593 MIPH is MIPH0+MIP, 594 test_clause_prob_sv(Rest,M,Exs,MIPT0,MIPT). 595 596 597test_ex_sv(_V,H,B,M,E,N):- 598 (\+ (H=E,M:B)-> 599 N=0 600 ; 601 N=1 602 ). 603 604test_theory_pos_prob(Ex,M,Th,N,LMI):- 605 (M:local_setting(single_var,false)-> 606 test_theory_pos_prob_mv(Ex,M,Th,N,LMI) 607 ; 608 test_theory_pos_prob_sv(Ex,M,Th,N,LMI) 609 ). 610 611test_theory_pos_prob_mv([],_M,_Theory,_N,[]). 612 613test_theory_pos_prob_mv([Ex|Rest],M,Th,N,[MI|LMI]):- 614 gen_initial_counts(N,MI0), 615 test_clause_prob(Th,M,[Ex],MI0,MI), 616 test_theory_pos_prob_mv(Rest,M,Th,N,LMI). 617 618test_theory_pos_prob_sv([],_M,_Theory,_N,[]). 619 620test_theory_pos_prob_sv([Ex|Rest],M,Th,N,[MI|LMI]):- 621 gen_initial_counts(N,MI0), 622 test_clause_prob_sv(Th,M,[Ex],MI0,MI), 623 test_theory_pos_prob_sv(Rest,M,Th,N,LMI). 624 625learn_param([],M,_,_,_,_,[],MInf,[],[]):-!, 626 M:local_setting(minus_infinity,MInf). 627 628learn_param(Program0,M,Pos,Neg,RR,Th,Program,LL,MI,MIN):- 629 generate_clauses(Program0,M,0,Pr1), 630 length(Program0,N), 631 format4(M,'Computing clause statistics~n',[]), 632 gen_initial_counts(N,MIN0), 633 clauses_statistics(Pr1,N,M,Pos,Neg,MIN0,MI,MIN,Th), 634 format4(M,'Updating parameters~n',[]), 635 learn_param_int(MI,MIN,N,M,RR,Par,LL), 636 update_theory(Program0,Par,Program1), 637 remove_zero(Program1,Program). 638 639 640clauses_statistics(Pr,N,M,Pos,Neg,MIN0,MI,MIN,Th):- 641 (Th=1-> 642 test_theory_neg_prob(Neg,M,Pr,MIN0,MIN), 643 test_theory_pos_prob(Pos,M,Pr,N,MI) 644 ; 645 current_prolog_flag(cpu_count,Cores), 646 ((Th=cpu;Th>Cores)-> 647 Chunks = Cores 648 ; 649 Chunks = Th 650 ), 651 chunks(Pos,Chunks,PosC), 652 chunks(Neg,Chunks,NegC), 653 concurrent_maplist(test_theory_neg_prob_conc(Pr,M,MIN0),NegC,MINC), 654 concurrent_maplist(test_theory_pos_prob_conc(Pr,M,N),PosC,MIC), 655 append(MIC,MI), 656 transpose(MINC,MINT), 657 maplist(sum_list,MINT,MIN) 658 ). 659 660test_theory_neg_prob_conc(Pr,M,MIN0,Neg,MIN):- 661 test_theory_neg_prob(Neg,M,Pr,MIN0,MIN). 662 663test_theory_pos_prob_conc(Pr,M,N,Pos,MI):- 664 test_theory_pos_prob(Pos,M,Pr,N,MI). 665 666chunks(L,N,Chunks):- 667 length(L,Len), 668 LenChunks is round(Len/N), 669 split_list(L,N,LenChunks,Chunks). 670 671split_list(L,1,_,[L]):-!. 672 673split_list(L0,N,NL,[H|L]):- 674 N>1, 675 N1 is N-1, 676 length(H1,NL), 677 (append(H1,T,L0)-> 678 H=H1, 679 split_list(T,N1,NL,L) 680 ; 681 H=L0, 682 L=[] 683 ). 684 685learn_param_int(MI,MIN,N,M,NR,Par,LL):- 686 M:local_setting(parameter_learning,em),!, 687 random_restarts(0,NR,M,-1e20,LL,N,initial,Par,MI,MIN), 688 format3(M,"Final LL ~f~n",[LL]). 689 690learn_param_int(MI,MIN,_N,M,NR,Par,LL):- 691 M:local_setting(parameter_learning,em_python),!, 692 M:local_setting(eps,EA), 693 M:local_setting(eps_f,ER), 694 M:local_setting(iter,Iter), 695 M:local_setting(regularization,Reg), 696 M:local_setting(gamma,Gamma), 697 M:local_setting(zero,Zero), 698 M:local_setting(ab,[A,B]), 699 M:local_setting(verbosity,Verb), 700 processor(M,Device), 701 py_call(liftcover:random_restarts(MI,MIN,Device,NR,Iter,EA,ER,Reg,Zero,Gamma,A,B,Verb),-(Par,LL)), 702 format3(M,"Final LL ~f~n",[LL]). 703 704learn_param_int(MI,MIN,N,M,NR,Par,LL):- 705 M:local_setting(parameter_learning,gd),!, 706 random_restarts_gd(0,NR,M,-1e20,PLL,N,initial,ParR,MI,MIN), %computes new parameters Par 707 maplist(logistic,ParR,Par), 708 LL is -PLL, 709 format3(M,"Final LL ~f~n",[LL]). 710 711 712learn_param_int(MI,MIN,_N,M,NR,Par,LL):- 713 M:local_setting(parameter_learning,gd_python),!, 714 M:local_setting(verbosity,Verb), 715 M:local_setting(parameter_update,UpdateMethod), 716 M:local_setting(iter,Iter), 717 M:local_setting(eps,Eps), 718 M:local_setting(adam_params,[Eta,Beta1,Beta2,Epsilon]), 719 M:local_setting(eta,LearningRate), 720 M:local_setting(gamma,Gamma), 721 M:local_setting(regularization,Reg), 722 M:local_setting(zero,Zero), 723 processor(M,Device), 724 py_call(liftcover:random_restarts_gd(MI,MIN,Device,NR,UpdateMethod, 725 Iter,Eps,Reg,Gamma,LearningRate,Eta,-(Beta1,Beta2),Epsilon,Zero,Verb),-(Par,LL)), 726 format3(M,"Final LL ~f~n",[LL]). 727 728 729learn_param_int(MI,MIN,N,M,_,Par,LL):- 730 M:local_setting(parameter_learning,lbfgs), 731 optimizer_initialize(N,liftcover,evaluate,progress,[M,MIN,MI],Env), 732 init_par(Env,N), 733 evaluate_L(Env,M,MIN,MI,L), 734% parte da modificare fine 735 IL is -L, 736 format4(M,"~nInitial L ~f~n",[IL]), 737 optimizer_run(Env,_LL,Status), 738 format4(M,"Status ~p~n",[Status]), 739 new_pars_lbfgs(Env,M,0,N,Par), 740 evaluate_L(Env,M,MIN,MI,NewL), 741 LL is -NewL, 742 optimizer_finalize(Env). 743 744 745new_pars_lbfgs(_Env,_M,N,N,[]):-!. 746 747new_pars_lbfgs(Env,M,N,NMax,[P|Rest1]):- 748 optimizer_get_x(Env,N,P0), 749 M:local_setting(zero,Zero), 750 (P0=<0.0-> 751 P=Zero 752 ; 753 (P0>=1.0-> 754 P is 1.0-Zero 755 ; 756 P=P0 757 ) 758 ), 759 N1 is N+1, 760 new_pars_lbfgs(Env,M,N1,NMax,Rest1). 761 762 763random_restarts(N,N,_M,Score,Score,_N,Par,Par,_MI,_MIN):-!. 764 765random_restarts(N,NMax,M,Score0,Score,NR,Par0,Par,MI,MIN):- 766 N1 is N+1, 767 format3(M,"Restart number ~d~n~n",[N1]), 768 length(Par1,NR), 769 maplist(random,Par1), 770 M:local_setting(eps,EA), 771 M:local_setting(eps_f,ER), 772 M:local_setting(iter,Iter), 773 em(EA,ER,0,Iter,M,NR,Par1,-1e20,MI,MIN,ParR,ScoreR), 774 format3(M,"Random_restart: Score ~f~n",[ScoreR]), 775 (ScoreR>Score0-> 776 random_restarts(N1,NMax,M,ScoreR,Score,NR,ParR,Par,MI,MIN) 777 ; 778 random_restarts(N1,NMax,M,Score0,Score,NR,Par0,Par,MI,MIN) 779 ). 780 781random_restarts_gd(N,N,_M,Score,Score,_N,Par,Par,_MI,_MIN):-!. 782 783random_restarts_gd(N,NMax,M,_Score0,Score,NR,_Par0,Par,MI,MIN):- 784 N1 is N+1, 785 format3(M,"Restart number ~d~n~n",[N1]), 786 M:local_setting(max_initial_weight,Max), 787 init_gd_par(NR,Max,Par1), 788 evaluate_L_gd(M,MIN,MI,Par1,L), 789 ScoreIn is -L, 790 format3(M,"GD Random_restart: initial score ~f~n",[ScoreIn]), 791 M:local_setting(eps,EA), 792 M:local_setting(eps_f,ER), 793 M:local_setting(iter,Iter), 794 (M:local_setting(parameter_update,adam)-> 795 findall(0,between(1,NR,_),M0), 796 findall(0,between(1,NR,_),M1), 797 gd_adam(EA,ER,0,Iter,M,NR,Par1,M0,M1,-1e20,MI,MIN,ParR,ScoreR) 798 ; 799 gd(EA,ER,0,Iter,M,NR,Par1,-1e20,MI,MIN,ParR,ScoreR) 800 ), 801 format3(M,"GD Random_restart: Score ~f~n",[ScoreR]), 802 random_restarts_gd(N1,NMax,M,ScoreR,Score,NR,ParR,Par,MI,MIN). 803 804 805gd(_EA,_ER,MaxIter,MaxIter,_M,_NR,Par,Score,_MI,_MIP,Par,Score):-!. 806 807gd(EA,ER,Iter0,MaxIter,M,NR,Par0,Score0,MI,MIP,Par,Score):- 808 compute_gradient_gd(MIP,MI,M,Par0,G,LL), 809 Score1 is -LL, 810 Iter is Iter0+1, 811 format4(M,"GD Iteration ~d LL ~f~n",[Iter,Score1]), 812 Diff is Score1-Score0, 813 Fract is -Score1*ER, 814 (( Diff<EA;Diff<Fract)-> 815 Score=Score1, 816 Par=Par0 817 ; 818 M:local_setting(eta,Eta), 819 M:local_setting(gamma,Gamma), 820 (M:local_setting(regularization,l2)-> 821 maplist(l2,Par0,Reg) 822 ; 823 (M:local_setting(regularization,l1)-> 824 maplist(l1,Par0,Reg) 825 ; 826 findall(0,between(1,NR,_),Reg) 827 ) 828 ), 829 maplist(update_par(Eta,Gamma),Par0,Reg,G,Par1), 830 gd(EA,ER,Iter,MaxIter,M,NR,Par1,Score1,MI,MIP,Par,Score) 831 ). 832 833gd_adam(_EA,_ER,Iter,Iter,_M,_NR,Par,_M0,_M1,Score,_MI,_MIP,Par,Score):-!. 834 835gd_adam(EA,ER,Iter0,MaxIter,M,NR,Par0,M00,M10,Score0,MI,MIP,Par,Score):- 836 compute_gradient_gd(MIP,MI,M,Par0,G,LL), 837 Score1 is -LL, 838 Iter is Iter0+1, 839 format4(M,"Iteration ~d LL ~f~n",[Iter,Score1]), 840 Diff is Score1-Score0, 841 Fract is -Score1*ER, 842 (( Diff<EA;Diff<Fract)-> 843 Score=Score1, 844 Par=Par0 845 ; 846 M:local_setting(gamma,Gamma), 847 M:local_setting(adam_params,[Eta,Beta1,Beta2,Epsilon]), 848 (M:local_setting(regularization,l2)-> 849 maplist(l2,Par0,Reg) 850 ; 851 (M:local_setting(regularization,l1)-> 852 maplist(l1,Par0,Reg) 853 ; 854 findall(0,between(1,NR,_),Reg) 855 ) 856 ), 857 maplist(update_grad(Gamma),G,Reg,G1), 858 maplist(update_M0(Beta1),M00,G1,M0), 859 maplist(update_M1(Beta2),M10,G1,M1), 860 EtaIter is Eta*sqrt(1-Beta2^Iter)/(1-Beta1^Iter), 861 maplist(update_par_adam(EtaIter,Epsilon),Par0,M0,M1,Par1), 862 gd_adam(EA,ER,Iter,MaxIter,M,NR,Par1,M0,M1,Score1,MI,MIP,Par,Score) 863 ). 864 865update_par_adam(EtaIter,Epsilon,Par0,M0,M1,Par1):- 866 Par1 is Par0-EtaIter*M0/(sqrt(M1)+Epsilon). 867 868 869update_M0(Beta1,M00,G,M0):- 870 M0 is Beta1*M00+(1-Beta1)*G. 871 872update_M1(Beta2,M10,G,M1):- 873 M1 is Beta2*M10+(1-Beta2)*G^2. 874 875update_grad(Gamma,G,Reg,G1):- 876 G1 is G+Gamma*Reg. 877 878 879l1(W,R):- 880 logistic(W,S), 881 R is S*(1-S). 882 883l2(W,R):- 884 logistic(W,S), 885 R is 2*S^2*(1-S). 886 887update_par(Eta,Gamma,Par0,Reg,G,Par1):- 888 Par1 is Par0-Eta*(G+Gamma*Reg). 889 890 891 892evaluate_L_gd(M,MIP,MI,Par,L):- 893 maplist(logistic,Par,Prob), 894 compute_likelihood_pos_gd(MIP,Prob,M,0,LP), 895% write(lpos),nl, 896 compute_likelihood_neg_gd(MI,Prob,M,LN), 897% write(lneg),nl, 898 compute_likelihood_gd(LN,M,LP,L). 899 900 901 902compute_gradient_gd(MIP,MI,M,Par,G,L):- 903 maplist(logistic,Par,Prob), 904 compute_likelihood_pos_gd(MIP,Prob,M,0,LP), 905 compute_likelihood_neg_gd(MI,Prob,M,LN), 906 compute_likelihood_gd(LN,M,LP,L), 907 compute_grad_gd(MIP,Prob,M,0,MI,LN,G). 908% write(grad),nl. 909 910compute_likelihood_neg_gd([],_Prob,_M,[]). 911 912compute_likelihood_neg_gd([HMI|TMI],Prob,M,[HLN|TLN]):- 913 compute_likelihood_pos_gd(HMI,Prob,M,0,HLN), 914 compute_likelihood_neg_gd(TMI,Prob,M,TLN). 915 916compute_likelihood_pos_gd([],[],_M,LP,LP). 917 918compute_likelihood_pos_gd([HMIP|TMIP],[P|TP],M,LP0,LP):- 919 LP1 is LP0-log(1-P)*HMIP, 920 compute_likelihood_pos_gd(TMIP,TP,M,LP1,LP). 921 922 923compute_likelihood_gd([],_M,L,L). 924 925compute_likelihood_gd([HP|TP],M,L0,L):- 926 A is 1.0-exp(-HP), 927 (A=:=0.0-> 928 M:local_setting(logzero,LZ), 929 L1 is L0-LZ 930 ; 931 L1 is L0-log(A) 932 ), 933 compute_likelihood_gd(TP,M,L1,L). 934 935 936compute_grad_gd([],[],_M,_N,_MI,_LN,[]):-!. 937 938compute_grad_gd([HMIP|TMIP],[P|TP],M,N0,MI,LN,[G|TG]):- 939% write(prima_comp_grad),nl, 940 compute_sum_neg(MI,M,LN,N0,0,S), 941% write(opt),nl, 942 G is (HMIP-S)*P, 943 N1 is N0+1, 944 compute_grad_gd(TMIP,TP,M,N1,MI,LN,TG). 945 946compute_sum_neg_gd([],_M,_LN,_I,S,S). 947 948compute_sum_neg_gd([HMI|TMI],M,[HLN|TLN],I,S0,S):- 949% write(HMI),write(hmi),nl, 950% write(I),write('I'),nl, 951 nth0(I,HMI,MIR), 952% write(MIR),write(mir),nl, 953% write(HLN),write(hln),nl, 954 Den is 1.0-exp(-HLN), 955 S1 is S0+MIR*exp(-HLN)/Den, 956 compute_sum_neg_gd(TMI,M,TLN,I,S1,S). 957 958 959em(_EA,_ER,MaxIter,MaxIter,_M,_NR,Par,Score,_MI,_MIN,Par,Score):-!. 960 961em(EA,ER,Iter0,MaxIter,M,NR,Par0,Score0,MI,MIN,Par,Score):- 962 length(Eta0,NR), 963 expectation_quick(Par0,M,MI,MIN,Eta0,Eta,Score1), 964 Iter is Iter0+1, 965 format4(M,"Iteration ~d LL ~f~n",[Iter,Score1]), 966 maximization_quick(Eta,M,Par1), 967 Diff is Score1-Score0, 968 Fract is -Score1*ER, 969 (( Diff<EA;Diff<Fract)-> 970 Score=Score1, 971 Par=Par1 972 ; 973 em(EA,ER,Iter,MaxIter,M,NR,Par1,Score1,MI,MIN,Par,Score) 974 ). 975 976expectation_quick(Par,M,MI,MIN,Eta0,Eta,Score):- 977 /* LLO is the negative examples contribution in the LL*/ 978 M:local_setting(logzero,LogZero), 979 foldl(llm(LogZero),Par,MIN,0,LL0), 980 maplist(eta0,MIN,Eta0), 981 /* positive examples contibution in LL*/ 982 scan_pos(MI,M,Par,LL0,Eta0,Score,Eta). 983 984maximization_quick(Eta,M,Par):- 985 (M:local_setting(regularization,l1)-> 986 maplist(maximize_L1(M),Eta,Par) 987 ; 988 (M:local_setting(regularization,l2)-> 989 maplist(maximize_L2(M),Eta,Par) 990 ; 991 (M:local_setting(regularization,bayesian)-> 992 maplist(maximize_bayesian(M),Eta,Par) 993 ; 994 maplist(maximize(M),Eta,Par) 995 ) 996 ) 997 ). 998 999maximize(_M,[Eta0,Eta1],Par):- 1000 (Eta0+Eta1=:=0.0-> 1001 Par=0.0 1002 ; 1003 Par is Eta1/(Eta0+Eta1) 1004 ). 1005 1006 1007maximize_L1(M,[Eta0,Eta1],Par):- 1008 M:local_setting(gamma,Gamma), 1009/*(((Eta0+Eta1)^2+Gamma^2+2*Gamma*(Eta0-Eta1))<0 -> 1010writeln((Eta0+Eta1)^2+Gamma^2+2*Gamma*(Eta0-Eta1)), 1011 Par is 4*Eta1/(2*(Gamma+Eta0+Eta1)) 1012;((2*(Gamma+Eta0+Eta1+sqrt((Eta0+Eta1)^2+Gamma^2+2*Gamma*(Eta0-Eta1)))=:=0.0)-> 1013writeln((2*(Gamma+Eta0+Eta1+sqrt((Eta0+Eta1)^2+Gamma^2+2*Gamma*(Eta0-Eta1))))) 1014 1015;*/ 1016 Par is 4*Eta1/(2*(Gamma+Eta0+Eta1+sqrt((Eta0+Eta1)^2+Gamma^2+2*Gamma*(Eta0-Eta1)))) 1017%) 1018 %) 1019 . 1020 1021maximize_L2(M,[Eta0,Eta1],Par):- 1022 M:local_setting(gamma,Gamma), 1023 Sum is 3*Eta0+3*Eta1+Gamma, 1024 Arccos is acos(sqrt(Gamma/Sum)*(9*Eta0/2-9*Eta1+Gamma)/(3*Eta0+3*Eta1+Gamma)), 1025 Par is 2*sqrt(Sum/Gamma)*cos(Arccos/3-2*pi/3)/3+1/3. 1026 1027maximize_bayesian(M,[Eta0,Eta1],Par):- 1028 M:local_setting(ab,[A,B]), 1029 Par is (Eta1+A)/(Eta0+Eta1+A+B). 1030 1031/*....scan_pos predicate..... */ 1032 1033scan_pos([],_M,_Par,LL,Eta,LL,Eta). 1034 1035scan_pos([MIH|MIT],M,Par,LL0,Eta0,LL,Eta):- 1036 M:local_setting(logzero,LogZero), 1037 foldl(rule_contrib,MIH,Par,1,Prod), 1038 ProbEx is 1-Prod, 1039 (ProbEx=:=0.0-> 1040 LLCurrent is LL0+LogZero 1041 ; 1042 LLCurrent is LL0+log(ProbEx) 1043 ), 1044 maplist(update_eta(ProbEx,M),Eta0,Par,MIH,EtaCurrent), 1045 scan_pos(MIT,M,Par,LLCurrent,EtaCurrent,LL,Eta). 1046 1047 1048update_eta(ProbEx,M,[Etai00,Etai10],Pi,MIR,[Etai0,Etai1]):- 1049 M:local_setting(zero,Zero), 1050 ( ProbEx=:=0.0-> 1051 CondP is Pi/Zero 1052 ; 1053 CondP is Pi/ProbEx 1054 ), 1055 OCondP0 is 1-CondP, 1056 ( OCondP0 <0.0-> 1057 OCondP = 0.0 1058 ; 1059 OCondP = OCondP0 1060 ), 1061 Etai0 is Etai00+MIR*OCondP, 1062 Etai1 is Etai10+MIR*CondP. 1063 1064rule_contrib(MIR,Pi,P0,P):- 1065 P is P0*(1-Pi)^MIR. 1066 1067llm(LogZero,Pi,MI,LL0,LL):- 1068 ((1-Pi)=:=0.0 -> 1069 1070 ( MI==0 -> 1071 LL is LL0 1072 ; 1073 LL is LL0+MI*LogZero 1074 ) 1075 ; 1076 ( MI==0 -> 1077 LL is LL0 1078 ; 1079 LL is LL0+MI*log(1-Pi) 1080 ) 1081 1082 ). 1083 1084eta0(MIN,[MIN,0]). 1085 1086 1087update_theory([],_N,[]):-!. 1088 1089update_theory([rule(Name,[H:_,_],B,L)|Rest],[P|T],[rule(Name,[H:P,'':PN],B,L)|Rest1]):- 1090 PN is 1-P, 1091 update_theory(Rest,T,Rest1). 1092 1093 1094 1095cycle_beam([],_Mod,_Pos,_Neg,CL,CL,_M0,_M,_BS,_MC):-!. 1096 1097cycle_beam(_Beam,_Mod,_Pos,_Neg,CL,CL,M,M,_BS,_MC):-!. 1098 1099cycle_beam(Beam,Mod,Pos,Neg,CL0,CL,M0,M,BS,MC):- 1100 M1 is M0+1,%decreases the number of max_iter M 1101 format2(Mod,"Clause iteration ~d~n~n",[M1]), 1102 /*write('\n\ncurrent beam\n\n'), 1103 write(Beam), 1104 write('\n\n'),*/ 1105 cycle_clauses(Beam,Mod,Pos,Neg,[],NB0,CL0,CL1), 1106 (length(NB,BS),append(NB,_,NB0)-> 1107 true 1108 ; 1109 NB=NB0 1110 ), 1111 (MC=:= inf -> 1112 CL2=CL1 1113 ; 1114 (length(CL2,MC),append(CL2,_,CL1)-> 1115 true 1116 ; 1117 CL2=CL1 1118 ) 1119 ), 1120 cycle_beam(NB,Mod,Pos,Neg,CL2,CL,M1,M,BS,MC). 1121 1122cycle_clauses([],_M,_Pos,_Neg,NB,NB,CL,CL):-!. 1123 1124cycle_clauses([c(_ScoreH,RH,_)|T],M,Pos,Neg,NB0,NB,CL0,CL):- 1125% write3('\n\nRevising clause\n'), 1126% write_rules3([RH],user_output), 1127% RH=rule(_,H,B,Lits), 1128% write3(H),write3(' '),write3(B), 1129% write3('\n'),write3(Lits),write3('\n'), 1130 findall(RS,specialize_rule(RH,M,RS,_L),LR),!, %-LR:list of lists, each one correponding to a different revised theory; specialize_rule defined in revise.pl 1131 length(LR,NR), 1132 write3(M,'Number of revisions '),write3(M,NR),write3(M,'\n'), 1133 score_clause_refinements(LR,M,Pos,Neg,NB0,NB1,CL0,CL1), 1134 cycle_clauses(T,M,Pos,Neg,NB1,NB,CL1,CL). 1135 1136 1137score_clause_refinements(LR,M,Pos,Neg,NB0,NB,CL0,CL):- %scans the list of revised theories 1138 number_of_threads(M,Th), 1139 (Th=1-> 1140 score_clause_refinements_int(M,1,Pos,Neg,LR,NB1,CL1), 1141 list_to_ord_set(NB1,NB1OS), 1142 ord_union(NB1OS,NB0,NB), 1143 list_to_ord_set(CL1,CL1OS), 1144 ord_union(CL1OS,CL0,CL) 1145 ; 1146 chunks(LR,Th,LRC), 1147 concurrent_maplist(score_clause_refinements_int(M,1,Pos,Neg),LRC,NBs,CLs), 1148 merge_ordsets(NBs,NB0,NB), 1149 merge_ordsets(CLs,CL0,CL) 1150 ). 1151 1152merge_ordsets([],OS,OS). 1153 1154merge_ordsets([H|T],OS0,OS):- 1155 list_to_ord_set(H,HOS), 1156 ord_union(HOS,OS0,OS1), 1157 merge_ordsets(T,OS1,OS). 1158 1159 1160score_clause_refinements_int(_M,_N,_Pos,_Neg,[],[],[]):-!. 1161 1162score_clause_refinements_int(M,Nrev,Pos,Neg,[R1|T],[c(Score,R3,_)|NB],CL):- %scans the list of revised theories 1163 already_scored_clause(R1,R3,M,Score),!, 1164 format3(M,'Score ref. ~d~n',[Nrev]), 1165 write3(M,'Already scored, updated refinement\n'), 1166 write_rules3(M,[R3],user_output), 1167 write3(M,'Score '),write3(M,Score),write3(M,'\n\n\n'), 1168 Nrev1 is Nrev+1, 1169 score_clause_refinements_int(M,Nrev1,Pos,Neg,T,NB,CL). 1170 1171score_clause_refinements_int(M,Nrev,Pos,Neg,[R1|T],NB,CL):- 1172 format3(M,'Score ref. ~d~n',[Nrev]), 1173 write_rules3(M,[R1],user_output), 1174 M:local_setting(random_restarts_number_str_learn,NR), 1175 learn_param([R1],M,Pos,Neg,NR,1,NewR,Score,MI,MIN), 1176 write3(M,'Updated refinement\n'), 1177 write_rules3(M,NewR,user_output), 1178 write3(M,'Score (CLL) '),write3(M,Score),write3(M,'\n\n\n'), 1179 (NewR=[R3]-> 1180 NB=[c(Score,R3,_)|NB0], 1181 (range_restricted(R3)-> 1182 CL=[c(Score,R3,[MI,MIN])|CL0] 1183 ; 1184 CL=CL0 1185 ), 1186 format2(M,"Added a target clause~n",[]), 1187 store_clause_refinement(R1,R3,M,Score), 1188 Nrev1 is Nrev+1 1189 ; 1190 NB=NB0, 1191 CL=CL0, 1192 Nrev1=Nrev+1 1193 ), 1194 score_clause_refinements_int(M,Nrev1,Pos,Neg,T,NB0,CL0). 1195 1196range_restricted(rule(_N,HL,BL,_Lit)):- 1197 term_variables(HL,VH), 1198 term_variables(BL,VB), 1199 sublisteq(VH,VB). 1200 1201sublisteq([],_). 1202 1203sublisteq([H|T],L):- 1204 member_eq(H,L), 1205 sublisteq(T,L). 1206 1207target(R,M):- 1208 get_output_preds(R,O), 1209 member(T,O), 1210 M:output(T),!. 1211 1212get_output_preds(rule(_N,HL,_BL,_Lit),O):- 1213 scan_head(HL,[],O). 1214 1215scan_head(['':_],O,O):-!. 1216scan_head([],O,O):-!. 1217scan_head([H:_P|T],O0,O):- 1218 functor(H,F,N), 1219 (member(F/N,O0)-> 1220 O1=O0 1221 ; 1222 O1=[F/N|O0] 1223 ), 1224 scan_head(T,O1,O). 1225 1226 1227store_clause_refinement(Ref,RefP,M,Score):- 1228 elab_clause_ref(Ref,Ref1), 1229 assert(M:ref_clause(r(Ref1,RefP,Score))). 1230 1231store_refinement(Ref,RefP,M,Score):- 1232 elab_ref(Ref,Ref1), 1233 assert(M:ref(r(Ref1,RefP,Score))). 1234 1235already_scored_clause(R,R1,M,Score):- 1236 elab_ref([R],[rule(H,B)]), 1237 M:ref_clause(r(rule(H,B1),R1,Score)), 1238 permutation(B,B1). 1239 1240already_scored(R,R1,M,Score):- 1241 elab_ref(R,RR), 1242 M:ref(r(RR,R1,Score)). 1243 1244 1245elab_clause_ref(rule(_NR,H,B,_Lits),rule(H1,B1)):- 1246 copy_term((H,B),(H1,B1)). 1247 1248elab_ref([],[]). 1249 1250elab_ref([rule(_NR,H,B,_Lits)|T],[rule(H1,B1)|T1]):-!, 1251 copy_term((H,B),(H1,B1)), 1252 numbervars((H1,B1),0,_N), 1253 elab_ref(T,T1). 1254 1255elab_ref([def_rule(H,B,_Lits)|T],[rule(H1,B1)|T1]):- 1256 copy_term((H,B),(H1,B1)), 1257 numbervars((H1,B1),0,_N), 1258 elab_ref(T,T1). 1259 1260%insertion in the beam 1261insert_in_order([],C,BeamSize,[C]):- 1262 BeamSize>0,!. 1263 1264insert_in_order(Beam,_New,0,Beam):-!. 1265 1266insert_in_order([[Th1,Heuristic1|Rest1]|RestBeamIn],[Th,Heuristic|Rest],BeamSize,BeamOut):- 1267 Heuristic>Heuristic1,!, 1268 % larger heuristic, insert here 1269 NewBeam=[[Th,Heuristic|Rest],[Th1,Heuristic1|Rest1]|RestBeamIn], 1270 length(NewBeam,L), 1271 (L>BeamSize-> 1272 nth1(L,NewBeam,_Last,BeamOut) 1273 ; 1274 BeamOut=NewBeam 1275 ). 1276 1277insert_in_order([[Th1,Heuristic1|Rest1]|RestBeamIn],[Th,Heuristic|Rest],BeamSize, 1278[[Th1,Heuristic1|Rest1]|RestBeamOut]):- 1279 BeamSize1 is BeamSize -1, 1280 insert_in_order(RestBeamIn,[Th,Heuristic|Rest],BeamSize1, 1281 RestBeamOut). 1282 1283 1284 1285remove_int_atom_list([],[]). 1286 1287remove_int_atom_list([\+ A|T],[\+ A1|T1]):-!, 1288 A=..[F,_|Arg], 1289 A1=..[F|Arg], 1290 remove_int_atom_list(T,T1). 1291 1292remove_int_atom_list([A|T],[A1|T1]):- 1293 A=..[F,_|Arg], 1294 A1=..[F|Arg], 1295 remove_int_atom_list(T,T1). 1296 1297 1298 1299remove_int_atom(\+ A,\+ A1):-!, 1300 A=..[F,_|T], 1301 A1=..[F|T]. 1302 1303remove_int_atom(A,A1):- 1304 A=..[F,_|T], 1305 A1=..[F|T]. 1306 1307 1308get_heads([],[]). 1309 1310get_heads([_-H|T],[H|TN]):- 1311 get_heads(T,TN). 1312 1313randomize([],[]):-!. 1314 1315randomize([rule(N,V,NH,HL,BL,LogF)|T],[rule(N,V,NH,HL1,BL,LogF)|T1]):- 1316 length(HL,L), 1317 Int is 1.0/L, 1318 randomize_head(Int,HL,0,HL1), 1319 randomize(T,T1). 1320 1321randomize_head(_Int,['':_],P,['':PNull1]):-!, 1322 PNull is 1.0-P, 1323 (PNull>=0.0-> 1324 PNull1 =PNull 1325 ; 1326 PNull1=0.0 1327 ). 1328 1329randomize_head(Int,[H:_|T],P,[H:PH1|NT]):- 1330 PMax is 1.0-P, 1331 random(0,PMax,PH1), 1332 P1 is P+PH1, 1333 randomize_head(Int,T,P1,NT). 1334 1335 1336 1337update_head([],[],_N,[]):-!. 1338 1339update_head([H:_P|T],[PU|TP],N,[H:P|T1]):- 1340 P is PU/N, 1341 update_head(T,TP,N,T1). 1342 1343/* utilities */ 1344 1345 1346rules2terms(R,T):- 1347 maplist(rule2term,R,T). 1348 1349rule2term(rule(_N,HL,BL,_Lit),(H:-B)):-!, 1350 list2or(HL,H), 1351 list2and(BL,B). 1352 1353rule2term(def_rule(H,BL,_Lit),((H:1.0):-B)):- 1354 list2and(BL,B). 1355 1356 1357write_rules([],_S). 1358 1359write_rules([rule(_N,HL,BL,Lit)|T],S):-!, 1360 copy_term((HL,BL,Lit),(HL1,BL1,Lit1)), 1361 numbervars((HL1,BL1,Lit1),0,_M), 1362 write_disj_clause(S,(HL1:-BL1)), 1363 write_rules(T,S). 1364 1365write_rules([def_rule(H,BL,Lit)|T],S):- 1366 copy_term((H,BL,Lit),(H1,BL1,Lit1)), 1367 numbervars((H1,BL1,Lit1),0,_M), 1368 write_disj_clause(S,([H1:1.0]:-BL1)), 1369 write_rules(T,S). 1370 1371 1372new_par([],[],[]). 1373 1374new_par([HP|TP],[Head:_|TO],[Head:HP|TN]):- 1375 new_par(TP,TO,TN). 1376 1377 1378 1379write_disj_clause(S,(H:-[])):-!, 1380 write_head(S,H), 1381 format(S,".~n~n",[]). 1382 1383write_disj_clause(S,(H:-B)):- 1384 write_head(S,H), 1385 format(S,' :-',[]), 1386 nl(S), 1387 write_body(S,B). 1388 1389 1390write_head(S,[A:1.0|_Rest]):-!, 1391 format(S,"~q:1.0",[A]). 1392 1393write_head(S,[A:P,'':_P]):-!, 1394 format(S,"~q:~g",[A,P]). 1395 1396write_head(S,[A:P]):-!, 1397 format(S,"~q:~g",[A,P]). 1398 1399write_head(S,[A:P|Rest]):- 1400 format(S,"~q:~g ; ",[A,P]), 1401 write_head(S,Rest). 1402 1403write_body(S,[]):-!, 1404 format(S," true.~n~n",[]). 1405 1406write_body(S,[A]):-!, 1407 format(S," ~q.~n~n",[A]). 1408 1409write_body(S,[A|T]):- 1410 format(S," ~q,~n",[A]), 1411 write_body(S,T).
1420list2or([],true):-!. 1421 1422list2or([X],X):- 1423 X\=;(_,_),!. 1424 1425list2or([H|T],(H ; Ta)):-!, 1426 list2or(T,Ta).
1436list2and([],true):-!. 1437 1438list2and([X],X):- 1439 X\=(_,_),!. 1440 1441list2and([H|T],(H,Ta)):-!, 1442 list2and(T,Ta). 1443 1444 1445deduct(0,_Mod,_DB,Th,Th):-!. 1446 1447deduct(NM,Mod,DB,InTheory0,InTheory):- 1448 get_head_atoms(O,Mod), 1449 sample_lift(1,DB,Sampled,DB1), 1450 (Sampled=[M]-> 1451 generate_head(O,M,Mod,[],HL), 1452 %gtrace, 1453 ( HL \== [] -> 1454 (generate_body(HL,Mod,InTheory1), 1455 append(InTheory0,InTheory1,InTheory2), 1456 NM1 is NM-1, 1457 deduct(NM1,Mod,DB1,InTheory2,InTheory) 1458 ) 1459 ; 1460 deduct(NM,Mod,DB,InTheory0,InTheory) 1461 ) 1462 ; 1463 InTheory=InTheory0 1464 ). 1465 1466 1467get_head_atoms(O,M):- 1468 findall(A,M:modeh(_,A),O). 1469 1470generate_top_cl([],_M,[]):-!. 1471 1472generate_top_cl([A|T],M,[(rule(R,[A1:0.5,'':0.5],[],true),-1e20)|TR]):- 1473 A=..[F|ArgM], 1474 keep_const(ArgM,Arg), 1475 A1=..[F|Arg], 1476 get_next_rule_number(M,R), 1477 generate_top_cl(T,M,TR). 1478 1479 1480generate_head([],_M,_Mod,HL,HL):-!. 1481 1482generate_head([A|T],M,Mod,H0,H1):- 1483 functor(A,F,N), 1484 functor(F1,F,N), 1485 F1=..[F|Arg], 1486 Pred1=..[F,M|Arg], 1487 A=..[F|ArgM], 1488 keep_const(ArgM,Arg), 1489 findall((A,Pred1),call(Mod:Pred1),L), 1490 Mod:local_setting(initial_clauses_per_megaex,IC), 1491 sample_lift(IC,L,L1), 1492 append(H0,L1,H2), 1493 generate_head(T,M,Mod,H2,H1). 1494 1495generate_head_goal([],_M,[]). 1496 1497generate_head_goal([H|T],M,[H1|T1]):- 1498 H=..[F|Arg], 1499 H1=..[F,M|Arg], 1500 generate_head_goal(T,M,T1). 1501 1502keep_const([],[]). 1503 1504keep_const([- _|T],[_|T1]):-!, 1505 keep_const(T,T1). 1506 1507keep_const([+ _|T],[_|T1]):-!, 1508 keep_const(T,T1). 1509 1510keep_const([-# _|T],[_|T1]):-!, 1511 keep_const(T,T1). 1512 1513keep_const([H|T],[H1|T1]):- 1514 H=..[F|Args], 1515 keep_const(Args,Args1), 1516 H1=..[F|Args1], 1517 keep_const(T,T1).
1528sample_lift(0,List,[],List):-!. 1529 1530sample_lift(N,List,List,[]):- 1531 length(List,L), 1532 L=<N,!. 1533 1534sample_lift(N,List,[El|List1],Li):- 1535 length(List,L), 1536 random(0,L,Pos), 1537 nth0(Pos,List,El,Rest), 1538 N1 is N-1, 1539 sample_lift(N1,Rest,List1,Li). 1540 1541sample_lift(0,_List,[]):-!. 1542 1543sample_lift(N,List,List):- 1544 length(List,L), 1545 L=<N,!. 1546 1547sample_lift(N,List,[El|List1]):- 1548 length(List,L), 1549 random(0,L,Pos), 1550 nth0(Pos,List,El,Rest), 1551 N1 is N-1, 1552 sample_lift(N1,Rest,List1). 1553 1554get_args([],[],[],A,A,AT,AT,_). 1555 1556get_args([HM|TM],[H|TH],[(H,HM)|TP],A0,A,AT0,AT,M):- 1557 HM=..[F|ArgsTypes], 1558 H=..[F,M|Args], 1559 append(A0,Args,A1), 1560 append(AT0,ArgsTypes,AT1), 1561 get_args(TM,TH,TP,A1,A,AT1,AT,M). 1562 1563/* Generation of the bottom clauses */ 1564 1565gen_head([],P,['':P]). 1566 1567gen_head([H|T],P,[H:P|TH]):- 1568 gen_head(T,P,TH). 1569 1570get_modeb([],_Mod,B,B). 1571 1572get_modeb([F/AA|T],Mod,B0,B):- 1573 findall((R,B),(Mod:modeb(R,B),functor(B,F,AA)),BL), 1574 (Mod:local_setting(neg_literals,true)-> 1575 findall((R,(\+ B)),(Mod:modeb(R,B),functor(B,F,AA),all_plus(B)),BNL) 1576 ; 1577 BNL=[] 1578 ), 1579 append([B0,BL,BNL],B1), 1580 get_modeb(T,Mod,B1,B). 1581 1582all_plus(B):- 1583 B=..[_|Args], 1584 all_plus_args(Args). 1585 1586all_plus_args([]). 1587 1588all_plus_args([+ _ |T]):-!, 1589 all_plus_args(T). 1590 1591all_plus_args([H|T]):- 1592 H \= - _, 1593 H \= # _, 1594 H \= -# _, 1595 H=..[_|Args], 1596 all_plus_args(Args), 1597 all_plus_args(T). 1598 1599generate_body([],_Mod,[]):-!. 1600 1601generate_body([(A,H)|T],Mod,Out):- 1602 functor(A,F,AA), 1603% findall((R,B),(Mod:modeb(R,B),functor(B,FB,AB),Mod:determination(F/AA,FB/AB)),BL), 1604 findall(FB/AB,Mod:determination(F/AA,FB/AB),Det), 1605 get_modeb(Det,Mod,[],BL), 1606 A=..[F|ArgsTypes], 1607 H=..[F,M|Args], 1608 Mod:local_setting(d,D), 1609 format2(Mod,"Bottom clause: example ~q~n",[H]), 1610 cycle_modeb(ArgsTypes,Args,[],[],Mod,BL,a,[],BLout0,D,M), 1611 variabilize(([(H,A)]:-BLout0),CLV), %+(Head):-Bodylist; -CLV:(Head):-Bodylist with variables _num in place of constants 1612 CLV=([Head1]:-BodyList1), 1613 (range_restricted(rule(_,Head1,BodyList1,_))-> 1614 remove_int_atom(Head1,Head), 1615 remove_int_atom_list(BodyList1,BodyList2), 1616 remove_duplicates(BodyList2,BodyList), 1617 get_next_rule_number(Mod,R), 1618 copy_term((Head,BodyList),(HeadV,BodyListV)), 1619 numbervars((HeadV,BodyListV),0,_V), 1620 format2(Mod,"Clause~n~q:0.5 :-~n",[HeadV]), 1621 write_body2(Mod,user_output,BodyListV), 1622 Out=[c(-inf, rule(R,[Head:0.5,'':0.5],[],BodyList),_)|CL0] 1623 ; 1624 format2(Mod,"No range restricted bottom clause~n~n",[]), 1625 Out=CL0 1626 ), 1627 generate_body(T,Mod,CL0). 1628 1629 1630variabilize((H:-B),(H1:-B1)):- 1631 variabilize_list(H,H1,[],AS,M), 1632 variabilize_list(B,B1,AS,_AS,M). 1633 1634 1635variabilize_list([],[],A,A,_M). 1636 1637variabilize_list([(\+ H,Mode)|T],[\+ H1|T1],A0,A,M):- 1638 builtin(H),!, 1639 H=..[F|Args], 1640 Mode=..[F|ArgTypes], 1641 variabilize_args(Args,ArgTypes, Args1,A0,A1), 1642 H1=..[F,M|Args1], 1643 variabilize_list(T,T1,A1,A,M). 1644 1645variabilize_list([(\+ H,Mode)|T],[\+ H1|T1],A0,A,M):-!, 1646 H=..[F,_M|Args], 1647 Mode=..[F|ArgTypes], 1648 variabilize_args(Args,ArgTypes, Args1,A0,A1), 1649 H1=..[F,M|Args1], 1650 variabilize_list(T,T1,A1,A,M). 1651 1652variabilize_list([(H,Mode)|T],[H1|T1],A0,A,M):- 1653 builtin(H),!, 1654 H=..[F|Args], 1655 Mode=..[F|ArgTypes], 1656 variabilize_args(Args,ArgTypes, Args1,A0,A1), 1657 H1=..[F,M|Args1], 1658 variabilize_list(T,T1,A1,A,M). 1659 1660variabilize_list([(H,Mode)|T],[H1|T1],A0,A,M):- 1661 H=..[F,_M|Args], 1662 Mode=..[F|ArgTypes], 1663 variabilize_args(Args,ArgTypes, Args1,A0,A1), 1664 H1=..[F,M|Args1], 1665 variabilize_list(T,T1,A1,A,M). 1666 1667 1668variabilize_args([],[],[],A,A). 1669 1670variabilize_args([C|T],[C|TT],[C|TV],A0,A):-!, 1671 variabilize_args(T,TT,TV,A0,A). 1672 1673variabilize_args([C|T],[# _Ty|TT],[C|TV],A0,A):-!, 1674 variabilize_args(T,TT,TV,A0,A). 1675 1676variabilize_args([C|T],[-# _Ty|TT],[C|TV],A0,A):-!, 1677 variabilize_args(T,TT,TV,A0,A). 1678 1679variabilize_args([C|T],[Ty|TT],[V|TV],A0,A):- 1680 (Ty = +Ty1;Ty = -Ty1), 1681 member(C/Ty1/V,A0),!, 1682 variabilize_args(T,TT,TV,A0,A). 1683 1684variabilize_args([C|T],[Ty|TT],[V|TV],A0,A):- 1685 (Ty = +Ty1;Ty = -Ty1),!, 1686 variabilize_args(T,TT,TV,[C/Ty1/V|A0],A). 1687 1688variabilize_args([C|T],[Ty|TT],[V|TV],A0,A):- 1689 compound(C), 1690 C=..[F|Args], 1691 Ty=..[F|ArgsT], 1692 variabilize_args(Args,ArgsT,ArgsV,A0,A1), 1693 V=..[F|ArgsV], 1694 variabilize_args(T,TT,TV,A1,A). 1695 1696 1697cycle_modeb(ArgsTypes,Args,ArgsTypes,Args,_Mod,_BL,L,L,L,_,_M):-!. 1698 1699cycle_modeb(_ArgsTypes,_Args,_ArgsTypes1,_Args1,_Mod,_BL,_L,L,L,0,_M):-!. 1700 1701cycle_modeb(ArgsTypes,Args,_ArgsTypes0,_Args0,Mod,BL,_L0,L1,L,D,M):- 1702 find_atoms(BL,Mod,ArgsTypes,Args,ArgsTypes1,Args1,L1,L2,M), 1703 D1 is D-1, 1704 cycle_modeb(ArgsTypes1,Args1,ArgsTypes,Args,Mod,BL,L1,L2,L,D1,M). 1705 1706 1707find_atoms([],_Mod,ArgsTypes,Args,ArgsTypes,Args,L,L,_M). 1708 1709find_atoms([(R,\+ H)|T],Mod,ArgsTypes0,Args0,ArgsTypes,Args,L0,L1,M):-!, 1710 H=..[F|ArgsT], 1711 findall((A,H),instantiate_query_neg(ArgsT,ArgsTypes0,Args0,F,M,A),L), 1712 call_atoms(L,Mod,[],At), 1713 remove_duplicates(At,At1), 1714 ((R = '*' ) -> 1715 R1= +1e20 1716 ; 1717 R1=R 1718 ), 1719 sample_lift(R1,At1,At2), 1720 append(L0,At2,L2), 1721 find_atoms(T,Mod,ArgsTypes0,Args0,ArgsTypes,Args,L2,L1,M). 1722 1723find_atoms([(R,H)|T],Mod,ArgsTypes0,Args0,ArgsTypes,Args,L0,L1,M):- 1724 H=..[F|ArgsT], 1725 findall((A,H),instantiate_query(ArgsT,ArgsTypes0,Args0,F,M,A),L), 1726 call_atoms(L,Mod,[],At), 1727 remove_duplicates(At,At1), 1728 ((R = '*' ) -> 1729 R1= +1e20 1730 ; 1731 R1=R 1732 ), 1733 sample_lift(R1,At1,At2), 1734 extract_output_args(At2,ArgsT,ArgsTypes0,Args0,ArgsTypes1,Args1), 1735 append(L0,At2,L2), 1736 find_atoms(T,Mod,ArgsTypes1,Args1,ArgsTypes,Args,L2,L1,M). 1737 1738 1739call_atoms([],_Mod,A,A). 1740 1741call_atoms([(H,M)|T],Mod,A0,A):- 1742 findall((H,M),Mod:H,L), 1743 append(A0,L,A1), 1744 call_atoms(T,Mod,A1,A). 1745 1746 1747extract_output_args([],_ArgsT,ArgsTypes,Args,ArgsTypes,Args). 1748 1749extract_output_args([(H,_At)|T],ArgsT,ArgsTypes0,Args0,ArgsTypes,Args):- 1750 builtin(H),!, 1751 H=..[_F|ArgsH], 1752 add_const(ArgsH,ArgsT,ArgsTypes0,Args0,ArgsTypes1,Args1), 1753 extract_output_args(T,ArgsT,ArgsTypes1,Args1,ArgsTypes,Args). 1754 1755extract_output_args([(H,_At)|T],ArgsT,ArgsTypes0,Args0,ArgsTypes,Args):- 1756 H=..[_F,_M|ArgsH], 1757 add_const(ArgsH,ArgsT,ArgsTypes0,Args0,ArgsTypes1,Args1), 1758 extract_output_args(T,ArgsT,ArgsTypes1,Args1,ArgsTypes,Args). 1759 1760 1761add_const([],[],ArgsTypes,Args,ArgsTypes,Args). 1762 1763add_const([_A|T],[+_T|TT],ArgsTypes0,Args0,ArgsTypes,Args):-!, 1764 add_const(T,TT,ArgsTypes0,Args0,ArgsTypes,Args). 1765 1766add_const([A|T],[-Type|TT],ArgsTypes0,Args0,ArgsTypes,Args):-!, 1767 (already_present(ArgsTypes0,Args0,A,Type)-> 1768 ArgsTypes1=ArgsTypes0, 1769 Args1=Args0 1770 ; 1771 ArgsTypes1=[+Type|ArgsTypes0], 1772 Args1=[A|Args0] 1773 ), 1774 add_const(T,TT,ArgsTypes1,Args1,ArgsTypes,Args). 1775 1776add_const([A|T],[-# Type|TT],ArgsTypes0,Args0,ArgsTypes,Args):-!, 1777 (already_present(ArgsTypes0,Args0,A,Type)-> 1778 ArgsTypes1=ArgsTypes0, 1779 Args1=Args0 1780 ; 1781 ArgsTypes1=[+Type|ArgsTypes0], 1782 Args1=[A|Args0] 1783 ), 1784 add_const(T,TT,ArgsTypes1,Args1,ArgsTypes,Args). 1785 1786add_const([_A|T],[# _|TT],ArgsTypes0,Args0,ArgsTypes,Args):-!, 1787 add_const(T,TT,ArgsTypes0,Args0,ArgsTypes,Args). 1788 1789add_const([A|T],[A|TT],ArgsTypes0,Args0,ArgsTypes,Args):- 1790 atomic(A),!, 1791 add_const(T,TT,ArgsTypes0,Args0,ArgsTypes,Args). 1792 1793add_const([A|T],[AT|TT],ArgsTypes0,Args0,ArgsTypes,Args):- 1794 A=..[F|Ar], 1795 AT=..[F|ArT], 1796 add_const(Ar,ArT,ArgsTypes0,Args0,ArgsTypes1,Args1), 1797 add_const(T,TT,ArgsTypes1,Args1,ArgsTypes,Args). 1798 1799 1800already_present([+T|_TT],[C|_TC],C,T):-!. 1801 1802already_present([_|TT],[_|TC],C,T):- 1803 already_present(TT,TC,C,T). 1804 1805 1806instantiate_query_neg(ArgsT,ArgsTypes,Args,F,M,A):- 1807 instantiate_input(ArgsT,ArgsTypes,Args,ArgsB), 1808 A1=..[F|ArgsB], 1809 (builtin(A1)-> 1810 A= (\+ A1) 1811 ; 1812 A0=..[F,M|ArgsB], 1813 A = (\+ A0) 1814 ). 1815 1816instantiate_query(ArgsT,ArgsTypes,Args,F,M,A):- 1817 instantiate_input(ArgsT,ArgsTypes,Args,ArgsB), 1818 A1=..[F|ArgsB], 1819 (builtin(A1)-> 1820 A=A1 1821 ; 1822 A=..[F,M|ArgsB] 1823 ). 1824 1825 1826instantiate_input([],_AT,_A,[]). 1827 1828instantiate_input([-_Type|T],AT,A,[_V|TA]):-!, 1829 instantiate_input(T,AT,A,TA). 1830 1831instantiate_input([+Type|T],AT,A,[H|TA]):-!, 1832 find_val(AT,A,+Type,H), 1833 instantiate_input(T,AT,A,TA). 1834 1835instantiate_input([# Type|T],AT,A,[H|TA]):-!, 1836 find_val(AT,A,+Type,H), 1837 instantiate_input(T,AT,A,TA). 1838 1839instantiate_input([-# _Type|T],AT,A,[_V|TA]):-!, 1840 instantiate_input(T,AT,A,TA). 1841 1842instantiate_input([C|T],AT,A,[C1|TA]):- 1843 C=..[F|Args], 1844 instantiate_input(Args,AT,A,Args1), 1845 C1=..[F|Args1], 1846 instantiate_input(T,AT,A,TA). 1847 1848 1849find_val([T|_TT],[A|_TA],T,A). 1850 1851find_val([HT|_TT],[HA|_TA],T,A):- 1852 nonvar(HA), 1853 HT=..[F|ArgsT], 1854 HA=..[F|Args], 1855 find_val(ArgsT,Args,T,A). 1856 1857find_val([_T|TT],[_A|TA],T,A):- 1858 find_val(TT,TA,T,A). 1859 1860 1861get_output_atoms(O,M):- 1862 findall((A/Ar),M:output((A/Ar)),O). 1863 1864 1865generate_goal([],_M,_H,G,G):-!. 1866 1867generate_goal([P/A|T],M,H,G0,G1):- 1868 functor(Pred,P,A), 1869 Pred=..[P|Rest], 1870 Pred1=..[P,H|Rest], 1871 findall(Pred1,call(M:Pred1),L), 1872 findall(\+ Pred1,call(M:neg(Pred1)),LN), 1873 append(G0,L,G2), 1874 append(G2,LN,G3), 1875 generate_goal(T,M,H,G3,G1). 1876 1877remove_duplicates(L0,L):- 1878 remove_duplicates(L0,[],L1), 1879 reverse(L1,L). 1880 1881remove_duplicates([],L,L). 1882 1883remove_duplicates([H|T],L0,L):- 1884 member_eq(H,L0),!, 1885 remove_duplicates(T,L0,L). 1886 1887remove_duplicates([H|T],L0,L):- 1888 remove_duplicates(T,[H|L0],L). 1889 1890 1891/* 1892 1893EMBLEM and SLIPCASE 1894 1895Copyright (c) 2011, Fabrizio Riguzzi, Nicola di Mauro and Elena Bellodi 1896 1897*/ 1898 1899 1900 1901 1902 1903specialize_rule(Rule,M,_SpecRule,_Lit):- 1904 M:local_setting(max_body_length,ML), 1905 Rule = rule(_ID,_LH,BL,_Lits), 1906 length(BL,L), 1907 L=ML,!, 1908 fail. 1909 1910specialize_rule(Rule,M,SpecRule,Lit):- 1911 M:local_setting(max_body_length,ML), 1912 Rule = rule(_ID,_LH,BL,_Lits), 1913 length(BL,L), 1914 (L=ML-> 1915 !, 1916 fail 1917 ; 1918 specialize_rule_int(Rule,M,SpecRule,Lit), 1919 (L=:=ML-1-> 1920 range_restricted(SpecRule) 1921 ; 1922 true 1923 ) 1924 ). 1925 1926 1927%used by cycle_clauses in slipcover.pl 1928specialize_rule_int(Rule,M,SpecRule,Lit):- 1929 M:local_setting(specialization,bottom), 1930 Rule = rule(ID,LH,BL,Lits), 1931 delete_one(Lits,RLits,Lit), 1932 \+ M:lookahead_cons(Lit,_), 1933 \+ M:lookahead_cons_var(Lit,_), 1934 \+ member_eq(Lit,BL), 1935 append(BL,[Lit],BL1), 1936 remove_prob(LH,LH1), 1937 delete(LH1,'',LH2), 1938 append(LH2,BL1,ALL2), 1939 dv(LH2,BL1,M,DList), %-DList: list of couples (variable,depth) 1940 extract_fancy_vars(ALL2,Vars1), 1941 length(Vars1,NV), 1942 M:local_setting(max_var,MV), 1943 NV=<MV, 1944 linked_clause(BL1,M,LH2), 1945 M:local_setting(maxdepth_var,MD), 1946 exceed_depth(DList,MD), 1947 \+ banned_clause(LH2,BL1), 1948 SpecRule=rule(ID,LH,BL1,RLits). 1949 1950specialize_rule_int(Rule,M,SpecRule,Lit):- 1951 M:local_setting(specialization,bottom), 1952 Rule = rule(ID,LH,BL,Lits), 1953 delete_one(Lits,RLits,Lit), 1954 \+ member_eq(Lit,BL), 1955 append(BL,[Lit],BL0), 1956 \+M:lookahead_cons_var(Lit,_), 1957 (M:lookahead(Lit,LLit1);M:lookahead_cons(Lit,LLit1)), 1958 copy_term(LLit1,LLit2), 1959 specialize_rule_la_bot(LLit2,RLits,RLits1,BL0,BL1), 1960 remove_prob(LH,LH1), 1961 delete(LH1,'',LH2), 1962 append(LH2,BL1,ALL2), 1963 dv(LH2,BL1,M,DList), 1964 extract_fancy_vars(ALL2,Vars1), 1965 length(Vars1,NV), 1966 M:local_setting(max_var,MV), 1967 NV=<MV, 1968 linked_clause(BL1,M,LH2), 1969 M:local_setting(maxdepth_var,MD), 1970 exceed_depth(DList,MD), 1971 \+ banned_clause(LH2,BL1), 1972 SpecRule=rule(ID,LH,BL1,RLits1). 1973 1974specialize_rule_int(Rule,M,SpecRule,Lit):- 1975 M:local_setting(specialization,bottom), 1976 Rule = rule(ID,LH,BL,Lits), 1977 delete_one(Lits,RLits,Lit), 1978 \+ member_eq(Lit,BL), 1979 append(BL,[Lit],BL0), 1980 M:lookahead_cons_var(Lit,LLit2), 1981 specialize_rule_la_bot(LLit2,RLits,_RLits1,BL0,BL1), 1982 remove_prob(LH,LH1), 1983 delete(LH1,'',LH2), 1984 append(LH2,BL1,ALL2), 1985 dv(LH2,BL1,M,DList), 1986 extract_fancy_vars(ALL2,Vars1), 1987 length(Vars1,NV), 1988 M:local_setting(max_var,MV), 1989 NV=<MV, 1990 linked_clause(BL1,M,LH2), 1991 M:local_setting(maxdepth_var,MD), 1992 exceed_depth(DList,MD), 1993 \+ banned_clause(LH2,BL1), 1994 SpecRule=rule(ID,LH,BL1,[]). 1995 1996specialize_rule_int(Rule,M,SpecRule,Lit):- 1997 M:local_setting(specialization,mode),%!, 1998 findall(BL , M:modeb(_,BL), BLS), 1999 specialize_rule(BLS,Rule,M,SpecRule,Lit). 2000 2001 2002update_head1([],_N,[]):-!. 2003 2004update_head1([H:_P|T],N,[H:P|T1]):- 2005 P is 1/N, 2006 update_head1(T,N,T1). 2007 2008 2009banned_clause(H,B):- 2010 lift_input_mod(M), 2011 numbervars((H,B),0,_N), 2012 M:banned(H2,B2), 2013 mysublist(H2,H), 2014 mysublist(B2,B). 2015 2016 2017mysublist([],_). 2018 2019mysublist([H|T],L):- 2020 member(H,L), 2021 mysublist(T,L). 2022 2023 2024specialize_rule([Lit|_RLit],Rule,M,SpecRul,SLit):- 2025 Rule = rule(ID,LH,BL,true), 2026 remove_prob(LH,LH1), 2027 append(LH1,BL,ALL), 2028 specialize_rule1(Lit,ALL,SLit), 2029 append(BL,[SLit],BL1), 2030 (M:lookahead(SLit,LLit1);M:lookahead_cons(SLit,LLit1)), 2031 specialize_rule_la(LLit1,LH1,BL1,BL2), 2032 append(LH1,BL2,ALL2), 2033 extract_fancy_vars(ALL2,Vars1), 2034 length(Vars1,NV), 2035 M:local_setting(max_var,MV), 2036 NV=<MV, 2037 SpecRul = rule(ID,LH,BL2,true). 2038 2039specialize_rule([Lit|_RLit],Rule,M,SpecRul,SLit):- 2040 Rule = rule(ID,LH,BL,true), 2041 remove_prob(LH,LH1), 2042 append(LH1,BL,ALL), 2043 specialize_rule1(Lit,ALL,SLit), 2044 \+ M:lookahead_cons(SLit,_), 2045 append(BL,[SLit],BL1), 2046 append(LH1,BL1,ALL1), 2047 extract_fancy_vars(ALL1,Vars1), 2048 length(Vars1,NV), 2049 M:local_setting(max_var,MV), 2050 NV=<MV, 2051 SpecRul = rule(ID,LH,BL1,true). 2052 2053specialize_rule([_|RLit],Rule,M,SpecRul,Lit):- 2054 specialize_rule(RLit,Rule,M,SpecRul,Lit). 2055 2056 2057specialize_rule_la([],_LH1,BL1,BL1). 2058 2059specialize_rule_la([Lit1|T],LH1,BL1,BL3):- 2060 copy_term(Lit1,Lit2), 2061 lift_input_mod(M), 2062 M:modeb(_,Lit2), 2063 append(LH1,BL1,ALL1), 2064 specialize_rule1(Lit2,ALL1,SLit1), 2065 append(BL1,[SLit1],BL2), 2066 specialize_rule_la(T,LH1,BL2,BL3). 2067 2068 2069specialize_rule_la_bot([],Bot,Bot,BL,BL). 2070 2071specialize_rule_la_bot([Lit|T],Bot0,Bot,BL1,BL3):- 2072 delete_one(Bot0,Bot1,Lit), 2073 \+ member_eq(Lit,BL1), 2074 append(BL1,[Lit],BL2), 2075 specialize_rule_la_bot(T,Bot1,Bot,BL2,BL3). 2076 2077 2078remove_prob(['':_P],[]):-!. 2079 2080remove_prob([X:_|R],[X|R1]):- 2081 remove_prob(R,R1). 2082 2083 2084specialize_rule1(Lit,Lits,SpecLit):- 2085 Lit =.. [Pred|Args], 2086 exctract_type_vars(Lits,TypeVars0), 2087 remove_duplicates(TypeVars0,TypeVars), 2088 take_var_args(Args,TypeVars,Args1), 2089 SpecLit =.. [Pred|Args1], 2090 \+ member_eq(SpecLit,Lits). 2091 2092 2093convert_to_input_vars([],[]):-!. 2094 2095convert_to_input_vars([+T|RT],[+T|RT1]):- 2096 !, 2097 convert_to_input_vars(RT,RT1). 2098 2099convert_to_input_vars([-T|RT],[+T|RT1]):- 2100 convert_to_input_vars(RT,RT1). 2101 2102 2103 2104remove_eq(X,[Y|R],R):- 2105 X == Y, 2106 !. 2107 2108remove_eq(X,[_|R],R1):- 2109 remove_eq(X,R,R1). 2110 2111linked_clause(BodyLits,M,[Head]):- 2112 input_head_variables(Head,M,InputHeadVars), 2113 linked_clause_int(BodyLits,M,InputHeadVars). 2114 2115linked_clause_int([],_M,_). 2116 2117linked_clause_int([L|R],M,PrevVars):- 2118 input_variables(L,M,InputVars), 2119 linked(InputVars,PrevVars),!, 2120 term_variables(L,LVars), 2121 append(LVars,PrevVars,PrevVars1), 2122 linked_clause_int(R,M,PrevVars1). 2123 2124 2125linked([],_). 2126 2127linked([X|R],L) :- 2128 member_eq(X,L), 2129 !, 2130 linked(R,L). 2131 2132 2133input_variables(\+ LitM,M,InputVars):- 2134 !, 2135 LitM=..[P|Args], 2136 length(Args,LA), 2137 length(Args1,LA), 2138 Lit1=..[P|Args1], 2139% copy_term(LitM,Lit0), 2140 M:modeb(_,Lit1), 2141 Lit1 =.. [P|Args1], 2142 convert_to_input_vars(Args1,Args2), 2143 Lit2 =.. [P|Args2], 2144 input_vars(LitM,Lit2,InputVars). 2145 2146input_variables(LitM,M,InputVars):- 2147 LitM=..[P|Args], 2148 length(Args,LA), 2149 length(Args1,LA), 2150 Lit1=..[P|Args1], 2151 M:modeb(_,Lit1), 2152 input_vars(LitM,Lit1,InputVars). 2153 2154input_head_variables(LitM,M,InputVars):- 2155 LitM=..[P|Args], 2156 length(Args,LA), 2157 length(Args1,LA), 2158 Lit1=..[P|Args1], 2159 M:modeh(_,Lit1), 2160 input_vars(LitM,Lit1,InputVars). 2161 2162input_vars(Lit,Lit1,InputVars):- 2163 Lit =.. [_|Vars], 2164 Lit1 =.. [_|Types], 2165 input_vars1(Vars,Types,InputVars). 2166 2167 2168input_vars1([],_,[]). 2169 2170input_vars1([V|RV],[+_T|RT],[V|RV1]):- 2171 !, 2172 input_vars1(RV,RT,RV1). 2173 2174input_vars1([_V|RV],[_|RT],RV1):- 2175 input_vars1(RV,RT,RV1). 2176 2177 2178exctract_type_vars([],[]). 2179 2180exctract_type_vars([Lit|RestLit],TypeVars):- 2181 Lit =.. [Pred|Args], 2182 length(Args,L), 2183 length(Args1,L), 2184 Lit1 =.. [Pred|Args1], 2185 take_mode(Lit1), 2186 type_vars(Args,Args1,Types), 2187 exctract_type_vars(RestLit,TypeVars0), 2188 !, 2189 append(Types,TypeVars0,TypeVars). 2190 2191 2192take_mode(Lit):- 2193 lift_input_mod(M), 2194 M:modeh(_,Lit),!. 2195 2196take_mode(Lit):- 2197 lift_input_mod(M), 2198 M:modeb(_,Lit),!. 2199 2200take_mode(Lit):- 2201 lift_input_mod(M), 2202 M:mode(_,Lit),!. 2203 2204 2205type_vars([],[],[]). 2206 2207type_vars([V|RV],[+T|RT],[V=T|RTV]):- 2208 !, 2209 type_vars(RV,RT,RTV). 2210 2211type_vars([V|RV],[-T|RT],[V=T|RTV]):-atom(T),!, 2212 type_vars(RV,RT,RTV). 2213 2214type_vars([_V|RV],[_T|RT],RTV):- 2215 type_vars(RV,RT,RTV). 2216 2217 2218take_var_args([],_,[]). 2219 2220take_var_args([+T|RT],TypeVars,[V|RV]):- 2221 !, 2222 member(V=T,TypeVars), 2223 take_var_args(RT,TypeVars,RV). 2224 2225take_var_args([-T|RT],TypeVars,[_V|RV]):- 2226 atom(T), 2227 take_var_args(RT,TypeVars,RV). 2228 2229take_var_args([-T|RT],TypeVars,[V|RV]):- 2230 member(V=T,TypeVars), 2231 take_var_args(RT,TypeVars,RV). 2232 2233take_var_args([T|RT],TypeVars,[T|RV]):- 2234 T\= + _,(T\= - _; T= - A,number(A)), 2235 take_var_args(RT,TypeVars,RV). 2236 2237 2238choose_rule(Theory,Rule):- 2239 member(Rule,Theory). 2240 2241 2242add_rule(Theory,add(rule(ID,H,[],true))):- 2243 new_id(ID), 2244 findall(HL , modeh(_,HL), HLS), 2245 length(HLS,NH), 2246 P is 1/(NH+1), 2247 add_probs(HLS,H,P), 2248 \+ member(rule(_,H,[],true),Theory). 2249 2250add_rule(Theory,TheoryGen):- 2251 findall(HL , modeh(_,HL), HLS), 2252 add_rule(HLS,Theory,TheoryGen). 2253 2254add_rule([X|_R],Theory,TheoryGen) :- 2255 new_id(ID), 2256 X =.. [P|A], 2257 length(A,LA), 2258 length(A1,LA), 2259 PH =.. [P|A1], 2260 TheoryGen = add(rule(ID,[PH:0.5,'':0.5],[],true)), 2261 \+ member(rule(_,[PH:_,'':_],[],true),Theory). 2262 2263add_rule([_X|R],Theory,TheoryGen) :- 2264 add_rule(R,Theory,TheoryGen). 2265 2266 2267add_probs([],['':P],P):-!. 2268 2269add_probs([H|T],[H:P|T1],P):- 2270 add_probs(T,T1,P). 2271 2272 2273extract_fancy_vars(List,Vars):- 2274 term_variables(List,Vars0), 2275 fancy_vars(Vars0,1,Vars). 2276 2277 2278fancy_vars([],_,[]). 2279 2280fancy_vars([X|R],N,[NN2=X|R1]):- 2281 name(N,NN), 2282 append([86],NN,NN1), 2283 name(NN2,NN1), 2284 N1 is N + 1, 2285 fancy_vars(R,N1,R1). 2286 2287 2288delete_one([X|R],R,X). 2289 2290delete_one([X|R],[X|R1],D):- 2291 delete_one(R,R1,D). 2292 2293 2294remove_last([_X],[]) :- 2295 !. 2296 2297remove_last([X|R],[X|R1]):- 2298 remove_last(R,R1). 2299 2300 2301delete_matching([],_El,[]). 2302 2303delete_matching([El|T],El,T1):-!, 2304 delete_matching(T,El,T1). 2305 2306delete_matching([H|T],El,[H|T1]):- 2307 delete_matching(T,El,T1). 2308 2309 2310%Computation of the depth of the variables in the clause's head/body 2311dv(H,B,M,DV1):- %DV1: returns a list of couples (Variable, Max depth) 2312 term_variables(H,V), 2313 head_depth(V,DV0), 2314 findall((MD-DV),var_depth(B,M,DV0,DV,0,MD),LDs), 2315 get_max(LDs,-1,-,DV1). 2316 2317 2318input_variables_b(\+ LitM,M,InputVars):-!, 2319 LitM=..[P|Args], 2320 length(Args,LA), 2321 length(Args1,LA), 2322 Lit1=..[P|Args1], 2323 M:modeb(_,Lit1), 2324 all_plus(Lit1), 2325 input_vars(LitM,Lit1,InputVars). 2326 2327input_variables_b(LitM,M,InputVars):- 2328 LitM=..[P|Args], 2329 length(Args,LA), 2330 length(Args1,LA), 2331 Lit1=..[P|Args1], 2332 M:modeb(_,Lit1), 2333 input_vars(LitM,Lit1,InputVars). 2334 2335 2336 2337%associates depth 0 to each variable in the clause's head 2338head_depth([],[]). 2339head_depth([V|R],[[V,0]|R1]):- 2340 head_depth(R,R1). 2341 2342%associates a depth to each variable in the clause's body 2343var_depth([],_M,PrevDs1,PrevDs1,MD,MD):-!. 2344 2345var_depth([L|R],M,PrevDs,PrevDs1,_MD,MD):- %L = a body literal, MD = maximum depth set by the user 2346 input_variables_b(L,M,InputVars), 2347 term_variables(L, BodyAtomVars), 2348 output_vars(BodyAtomVars,InputVars,OutputVars), 2349 depth_InputVars(InputVars,PrevDs,0,MaxD), %MaxD: maximum depth of the input variables in the body literal 2350 D is MaxD+1, 2351 compute_depth(OutputVars,D,PrevDs,PrevDs0), %Computes the depth for the output variables in the body literal 2352 var_depth(R,M,PrevDs0,PrevDs1,D,MD). 2353 2354get_max([],_,Ds,Ds). 2355 2356get_max([(MD-DsH)|T],MD0,_Ds0,Ds):- 2357 MD>MD0,!, 2358 get_max(T,MD,DsH,Ds). 2359 2360get_max([_H|T],MD,Ds0,Ds):- 2361 get_max(T,MD,Ds0,Ds). 2362 2363delete_eq([],_E,[]). 2364 2365delete_eq([H|T],E,T1):- 2366 H==E,!, 2367 delete_eq(T,E,T1). 2368 2369delete_eq([H|T],E,[H|T1]):- 2370 delete_eq(T,E,T1). 2371 2372output_vars(OutVars,[],OutVars):-!. 2373output_vars(BodyAtomVars,[I|InputVars],OutVars):- 2374 delete_eq(BodyAtomVars, I, Residue), 2375 output_vars(Residue,InputVars, OutVars). 2376 2377% returns D as the maximum depth of the variables in the list (first argument) 2378depth_InputVars([],_,D,D). 2379depth_InputVars([I|Input],PrevDs,D0,D):- 2380 member_l(PrevDs,I,MD), 2381 (MD>D0-> 2382 D1=MD 2383 ; 2384 D1=D0 2385 ), 2386 depth_InputVars(Input,PrevDs,D1,D). 2387 2388member_l([[L,D]|_P],I,D):- 2389 I==L,!. 2390member_l([_|P],I,D):- 2391 member_l(P,I,D). 2392 2393compute_depth([],_,PD,PD):-!. 2394compute_depth([O|Output],D,PD,RestO):- 2395 member_l(PD,O,_),!, 2396 compute_depth(Output,D,PD,RestO). 2397 2398compute_depth([O|Output],D,PD,[[O,D]|RestO]):- 2399 compute_depth(Output,D,PD,RestO). 2400 2401 2402 2403%checks if a variable's depth exceeds the setting_lift 2404exceed_depth([],_):-!. 2405exceed_depth([H|T],MD):- 2406 nth1(2,H,Dep), 2407 Dep<MD, %setting_lift(maxdepth_var,MD), 2408 exceed_depth(T,MD). 2409 2410/* 2411 2412EMBLEM and SLIPCASE 2413 2414Copyright (c) 2011, Fabrizio Riguzzi and Elena Bellodi 2415 2416*/ 2417 2418 2419 2420 2421%:- yap_flag(single_var_warnings, on). 2422 2423 2424load(FileIn,C1,R):- 2425 open(FileIn,read,SI), 2426 read_clauses_dir(SI,C), 2427 close(SI), 2428 process_clauses(C,[],C1,[],R). 2429 2430 2431add_inter_cl(CL):- 2432 %findall(A,(input(A);output(A)),L), 2433 findall(A,(input(A)),L), 2434 gen_cl(L,CL). 2435 2436 2437gen_cl([],[]). 2438 2439gen_cl([H/A|T],[C|T1]):- 2440 functor(F,H,A), 2441 add_mod_arg(F,Module,F1), 2442 add_bdd_arg(F,BDD,Module,F2), 2443 C=(F2:-(F1,one(BDD))), 2444 gen_cl(T,T1). 2445 2446 2447assert_all([],_M,[]). 2448 2449assert_all([H|T],M,[HRef|TRef]):- 2450 assertz(M:,HRef), 2451 assert_all(T,M,TRef). 2452 2453assert_all([],[]). 2454 2455assert_all([H|T],[HRef|TRef]):- 2456 assertz(slipcover:,HRef), 2457 assert_all(T,TRef). 2458 2459 2460retract_all([],_):-!. 2461 2462retract_all([H|T],M):- 2463 erase(M,H), 2464 retract_all(T,M). 2465 2466retract_all([]):-!. 2467 2468retract_all([H|T]):- 2469 erase(H), 2470 retract_all(T). 2471 2472 2473read_clauses_dir(S,[Cl|Out]):- 2474 read_term(S,Cl,[]), 2475 (Cl=end_of_file-> 2476 Out=[] 2477 ; 2478 read_clauses_dir(S,Out) 2479 ). 2480 2481 2482process_clauses([],_M,[]):-!. 2483 2484process_clauses([end_of_file],_M,[]):-!. 2485 2486process_clauses([H|T],M,[H1|T1]):- 2487 copy_term(H,H0), 2488 term_expansion_int(H0,M,(_,[H1])), 2489 process_clauses(T,M,T1). 2490 2491 2492get_next_rule_number(M,R):- 2493 retract(M:rule_lift_n(R)), 2494 R1 is R+1, 2495 assert(M:rule_lift_n(R1)). 2496 2497add_bdd_arg(A,Env,BDD,A1):- 2498 A=..[P|Args], 2499 append(Args,[Env,BDD],Args1), 2500 A1=..[P|Args1]. 2501 2502 2503add_bdd_arg_db(A,Env,BDD,DB,A1):- 2504 A=..[P|Args], 2505 append(Args,[DB,Env,BDD],Args1), 2506 A1=..[P|Args1]. 2507 2508 2509add_bdd_arg(A,_Env,_BDD,Module,A1):- 2510 A=..[P|Args], 2511 A1=..[P,Module|Args]. 2512 2513 2514add_bdd_arg_db(A,_Env,_BDD,DB,Module,A1):- 2515 A=..[P|Args], 2516 append(Args,[DB],Args1), 2517 A1=..[P,Module|Args1]. 2518 2519add_mod_arg(A,Module,A1):- 2520 A=..[P|Args], 2521 A1=..[P,Module|Args]. 2522 2523 2524generate_rules_fact([],_Env,_VC,_R,_Probs,_N,[],_Module). 2525 2526generate_rules_fact([Head:_P1,'':_P2],Env,VC,R,Probs,N,[Clause],Module):-!, 2527 add_bdd_arg(Head,Env,BDD,Module,Head1), 2528 Clause=(Head1:-(pita:get_var_n(Env,R,VC,Probs,V),pita:equality(Env,V,N,BDD))). 2529 2530generate_rules_fact([Head:_P|T],Env,VC,R,Probs,N,[Clause|Clauses],Module):- 2531 add_bdd_arg(Head,Env,BDD,Module,Head1), 2532 Clause=(Head1:-(pita:get_var_n(Env,R,VC,Probs,V),pita:equality(Env,V,N,BDD))), 2533 N1 is N+1, 2534 generate_rules_fact(T,Env,VC,R,Probs,N1,Clauses,Module). 2535 2536 2537generate_rules_fact_db([],_Env,_VC,_R,_Probs,_N,[],_Module). 2538 2539generate_rules_fact_db([Head:_P1,'':_P2],Env,VC,R,Probs,N,[Clause],Module):-!, 2540 add_bdd_arg_db(Head,Env,BDD,_DB,Module,Head1), 2541 Clause=(Head1:-(pita:get_var_n(Env,R,VC,Probs,V),pita:equality(Env,V,N,BDD))). 2542 2543generate_rules_fact_db([Head:_P|T],Env,VC,R,Probs,N,[Clause|Clauses],Module):- 2544 add_bdd_arg_db(Head,Env,BDD,_DB,Module,Head1), 2545 Clause=(Head1:-(pita:get_var_n(Env,R,VC,Probs,V),pita:equality(Env,V,N,BDD))), 2546 N1 is N+1, 2547 generate_rules_fact_db(T,Env,VC,R,Probs,N1,Clauses,Module). 2548 2549 2550generate_clause(Head,Env,Body,_VC,_R,_Probs,_BDDAnd,_N,Clause,Module):- 2551 add_bdd_arg(Head,Env,_BDD,Module,Head1), 2552 Clause=(Head1:-Body). 2553 2554 2555generate_clause_db(Head,Env,Body,_VC,_R,_Probs,DB,_BDDAnd,_N,Clause,Module):- 2556 add_bdd_arg_db(Head,Env,_BDD,DBH,Module,Head1), 2557 Clause=(Head1:-(DBH>=1,DB is DBH-1,Body)). 2558 2559 2560generate_rules([],_Env,_Body,_VC,_R,_Probs,_BDDAnd,_N,[],_Module). 2561 2562generate_rules([Head:_P1,'':_P2],Env,Body,VC,R,Probs,BDDAnd,N,[Clause],Module):-!, 2563 generate_clause(Head,Env,Body,VC,R,Probs,BDDAnd,N,Clause,Module). 2564 2565generate_rules([Head:_P|T],Env,Body,VC,R,Probs,BDDAnd,N,[Clause|Clauses],Module):- 2566 generate_clause(Head,Env,Body,VC,R,Probs,BDDAnd,N,Clause,Module), 2567 N1 is N+1, 2568 generate_rules(T,Env,Body,VC,R,Probs,BDDAnd,N1,Clauses,Module). 2569 2570 2571generate_rules_db([],_Env,_Body,_VC,_R,_Probs,_DB,_BDDAnd,_N,[],_Module):-!. 2572 2573generate_rules_db([Head:_P1,'':_P2],Env,Body,VC,R,Probs,DB,BDDAnd,N,[Clause],Module):-!, 2574 generate_clause_db(Head,Env,Body,VC,R,Probs,DB,BDDAnd,N,Clause,Module). 2575 2576generate_rules_db([Head:_P|T],Env,Body,VC,R,Probs,DB,BDDAnd,N,[Clause|Clauses],Module):- 2577 generate_clause_db(Head,Env,Body,VC,R,Probs,DB,BDDAnd,N,Clause,Module),!,%agg.cut 2578 N1 is N+1, 2579 generate_rules_db(T,Env,Body,VC,R,Probs,DB,BDDAnd,N1,Clauses,Module). 2580 2581process_body_bg([],[],_Module). 2582 2583process_body_bg([\+ H|T],[\+ H|Rest],Module):- 2584 builtin(H),!, 2585 process_body_bg(T,Rest,Module). 2586 2587process_body_bg([\+ H|T],[\+ H1|Rest],Module):-!, 2588 add_mod_arg(H,Module,H1), 2589 process_body_bg(T,Rest,Module). 2590 2591process_body_bg([H|T],[H|Rest],Module):- 2592 builtin(H),!, 2593 process_body_bg(T,Rest,Module). 2594 2595process_body_bg([H|T],[H1|Rest],Module):-!, 2596 add_mod_arg(H,Module,H1), 2597 process_body_bg(T,Rest,Module). 2598 2599 2600 2601process_body([],BDD,BDD,Vars,Vars,[],_Env,_Module). 2602 2603process_body([\+ H|T],BDD,BDD1,Vars,Vars1,[\+ H|Rest],Env,Module):- 2604 builtin(H),!, 2605 process_body(T,BDD,BDD1,Vars,Vars1,Rest,Env,Module). 2606 2607process_body([\+ H|T],BDD,BDD1,Vars,Vars1,[ 2608(\+ H1)|Rest],Env,Module):- 2609 add_mod_arg(H,Module,H1), 2610 process_body(T,BDD,BDD1,Vars,Vars1,Rest,Env,Module). 2611 2612process_body([H|T],BDD,BDD1,Vars,Vars1,[H|Rest],Env,Module):- 2613 builtin(H),!, 2614 process_body(T,BDD,BDD1,Vars,Vars1,Rest,Env,Module). 2615 2616process_body([H|T],BDD,BDD1,Vars,Vars1, 2617[H1|Rest],Env,Module):- 2618 add_mod_arg(H,Module,H1), 2619 process_body(T,BDD,BDD1,Vars,Vars1,Rest,Env,Module). 2620 2621process_body_db([],BDD,BDD,_DB,Vars,Vars,[],_Env,_Module):-!. 2622 2623process_body_db([\+ H|T],BDD,BDD1,DB,Vars,Vars1,[\+ H|Rest],Env,Module):- 2624 builtin(H),!, 2625 process_body_db(T,BDD,BDD1,DB,Vars,Vars1,Rest,Env,Module). 2626 2627process_body_db([\+ H|T],BDD,BDD1,DB,Vars,Vars1,[ 2628 (\+ H1)|Rest],Env,Module):-!, 2629 add_mod_arg(H,Module,H1), 2630 process_body_db(T,BDD,BDD1,DB,Vars,Vars1,Rest,Env,Module). 2631 2632process_body_db([H|T],BDD,BDD1,DB,Vars,Vars1,[H|Rest],Env,Module):- 2633 builtin(H),!, 2634 process_body_db(T,BDD,BDD1,DB,Vars,Vars1,Rest,Env,Module). 2635 2636process_body_db([H|T],BDD,BDD1,DB,Vars,Vars1, 2637[H1|Rest],Env,Module):- 2638 add_mod_arg(H,Module,H1), 2639 process_body_db(T,BDD,BDD1,DB,Vars,Vars1,Rest,Env,Module). 2640 2641 2642 2643given(H):- 2644 lift_input_mod(M), 2645 functor(H,P,Ar), 2646 (M:input(P/Ar)). 2647 2648 2649given_cw(H):- 2650 lift_input_mod(M), 2651 functor(H,P,Ar), 2652 (M:input_cw(P/Ar)). 2653 2654 2655and_list([],B,B). 2656 2657and_list([H|T],B0,B1):- 2658 and(B0,H,B2), 2659 and_list(T,B2,B1). 2660 2661/* 2662or_list([H],_Env,H):-!. 2663 2664or_list([H|T],Env,B):- 2665 or_list1(T,Env,H,B). 2666 2667 2668or_list1([],_Env,B,B). 2669 2670or_list1([H|T],Env,B0,B1):- 2671 or(Env,B0,H,B2), 2672 or_list1(T,Env,B2,B1). 2673*/
2682set_lift(M:Parameter,Value):-
2683 retract(M:local_setting(Parameter,_)),
2684 assert(M:local_setting(Parameter,Value)).
2693setting_lift(M:P,V):- 2694 M:local_setting(P,V). 2695 2696 2697difference([],_,[]). 2698 2699difference([H|T],L2,L3):- 2700 member_eq(H,L2),!, 2701 difference(T,L2,L3). 2702 2703difference([H|T],L2,[H|L3]):- 2704 difference(T,L2,L3). 2705 2706 2707member_eq(E,[H|_T]):- 2708 E==H,!. 2709 2710member_eq(E,[_H|T]):- 2711 member_eq(E,T). 2712 2713 2714 2715 2716 2717process_head(HeadList,M, GroundHeadList) :- 2718 ground_prob(HeadList), !, 2719 process_head_ground(HeadList,M, 0, GroundHeadList). 2720 2721process_head(HeadList,_M, HeadList). 2722 2723 2724/* process_head_ground([Head:ProbHead], Prob, [Head:ProbHead|Null]) 2725 * ---------------------------------------------------------------- 2726 */ 2727process_head_ground([Head:ProbHead],M, Prob, [Head:ProbHead1|Null]) :-!, 2728 ProbHead1 is ProbHead, 2729 ProbLast is 1 - Prob - ProbHead1, 2730 M:local_setting(epsilon_parsing, Eps), 2731 EpsNeg is - Eps, 2732 ProbLast > EpsNeg, 2733 (ProbLast > Eps -> 2734 Null = ['':ProbLast] 2735 ; 2736 Null = [] 2737 ). 2738 2739process_head_ground([Head:ProbHead|Tail], M, Prob, [Head:ProbHead1|Next]) :- 2740 ProbHead1 is ProbHead, 2741 ProbNext is Prob + ProbHead1, 2742 process_head_ground(Tail, M, ProbNext, Next). 2743 2744 2745ground_prob([]). 2746 2747ground_prob([_Head:ProbHead|Tail]) :- 2748 ground(ProbHead), % Succeeds if there are no free variables in the term ProbHead. 2749 ground_prob(Tail). 2750 2751get_probs([], []). 2752 2753get_probs([_H:P|T], [P1|T1]) :- 2754 P1 is P, 2755 get_probs(T, T1). 2756 2757 2758 2759 2760generate_clauses([],_M,_N,[]):-!. 2761 2762generate_clauses([H|T],M,N,[(Head,BA,V,P)|C]):- 2763 term_variables(H,V), 2764 gen_clause(H,M,N,N1,rule(_,[_:P|_],_,_),[(Head:-BA)]),!, %agg.cut 2765 generate_clauses(T,M,N1,C). 2766 2767 2768gen_clause((H :- Body),_M,N,N,(H :- Body),[(H :- Body)]):-!. 2769 2770 2771 2772gen_clause(rule(_R,HeadList,BodyList,Lit),_M,N,N1, 2773 rule(N,HeadList,BodyList,Lit),Clauses):-!, 2774% disjunctive clause with more than one head atom senza depth_bound 2775 process_body(BodyList,_BDD,BDDAnd,[],_Vars,BodyList1,Env,Module), 2776 list2and(BodyList1,Body1), 2777 get_probs(HeadList,Probs), 2778 generate_rules(HeadList,Env,Body1,[],N,Probs,BDDAnd,0,Clauses,Module), 2779 N1 is N+1. 2780 2781gen_clause(def_rule(H,BodyList,Lit),_M,N,N,def_rule(H,BodyList,Lit),Clauses) :- !,%agg. cut 2782% disjunctive clause with a single head atom senza depth_bound con prob =1 2783 process_body(BodyList,_BDD,BDDAnd,[],_Vars,BodyList2,Env,Module), 2784 list2and(BodyList2,Body1), 2785 add_bdd_arg(H,Env,BDDAnd,Module,Head1), 2786 Clauses=[(Head1 :- Body1)]. 2787 2788 2789generate_clauses_bg([],[]):-!. 2790 2791generate_clauses_bg([H|T],[CL|T1]):- 2792 gen_clause_bg(H,CL), %agg.cut 2793 generate_clauses_bg(T,T1). 2794 2795gen_clause_bg(def_rule(H,BodyList,_Lit),Clauses) :- 2796% disjunctive clause with a single head atom e depth_bound 2797 process_body_bg(BodyList,BodyList2,Module), 2798 list2and(BodyList2,Body1), 2799 add_mod_arg(H,Module,Head1), 2800 Clauses=(Head1 :- Body1).
2809builtin(G):- 2810 builtin_int(G),!. 2811 2812builtin_int(average(_L,_Av)). 2813builtin_int(G):- 2814 predicate_property(G,built_in). 2815builtin_int(G):- 2816 predicate_property(G,imported_from(lists)). 2817builtin_int(G):- 2818 predicate_property(G,imported_from(apply)). 2819builtin_int(G):- 2820 predicate_property(G,imported_from(nf_r)). 2821builtin_int(G):- 2822 predicate_property(G,imported_from(matrix)). 2823builtin_int(G):- 2824 predicate_property(G,imported_from(clpfd)). 2825 2826 2827 2828term_expansion_int((Head :- Body),M, (_Clauses,[rule(R,HeadList,BodyList,true)])) :- 2829% disjunctive clause with a single head atom senza DB, con prob. diversa da 1 2830 ((Head:-Body) \= ((user:term_expansion(_,_) ):- _ )), 2831 (Head = ((_H:_);_);Head=(_H:_)), !, 2832 list2or(HeadListOr, Head), 2833 get_next_rule_number(M,R), 2834 process_head(HeadListOr,M, HeadList), 2835 list2and(BodyList, Body). 2836 2837 2838term_expansion_int((Head :- Body),_M,(Clauses,[def_rule(Head,BodyList,true)])) :- 2839% definite clause senza DB 2840 ((Head:-Body) \= ((user:term_expansion(_,_)) :- _ )),!, 2841 list2and(BodyList, Body), 2842 process_body(BodyList,BDD,BDDAnd,[],_Vars,BodyList2,Env,Module), 2843 append([pita:one(Env,BDD)],BodyList2,BodyList3), 2844 list2and(BodyList3,Body2), 2845 add_bdd_arg(Head,Env,BDDAnd,Module,Head1), 2846 Clauses=(Head1 :- Body2). 2847 2848 2849term_expansion_int(Head,M,(_,[rule(R,HeadList,[],true)])) :- 2850% disjunctive fact with a single head atom e prob. generiche, senza db 2851 (Head \= ((user:term_expansion(_,_)) :- _ )), 2852 Head=(_H:_), !, 2853 list2or(HeadListOr, Head), 2854 process_head(HeadListOr,M, HeadList), 2855 get_next_rule_number(M,R). 2856 2857term_expansion_int(Head, _M,((Head1:-pita:one(Env,One)),[def_rule(Head,[],true)])) :- 2858% definite fact without db 2859 (Head \= ((user:term_expansion(_,_) ):- _ )), 2860 (Head\= end_of_file),!, 2861 add_bdd_arg(Head,Env,One,_Module,Head1). 2862 2863 2864test_no_area(TestSet,M,Prog,NPos,NNeg,LL,Results):- 2865% S= user_output, 2866% SA= user_output, 2867% format(SA,"Fold;\tCLL;\t AUCROC;\t AUCPR~n",[]), 2868 %gtrace, 2869 test_folds(TestSet,M,Prog,Results,NPos,NNeg,LL). 2870 2871 2872/* 2873 ROC = c3{data:_{x:x, rows:[x-'ROC'|ROC0]}, 2874 axis:_{x:_{min:0.0,max:1.0,padding:0.0, 2875 tick:_{values:[0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0]}}, 2876 y:_{min:0.0,max:1.0,padding:_{bottom:0.0,top:0.0}, 2877 tick:_{values:[0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0]}}}}, 2878 PR = c3{data:_{x:x, rows:[x-'PR'|PR0]}, 2879 axis:_{x:_{min:0.0,max:1.0,padding:0.0, 2880 tick:_{values:[0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0]}}, 2881 y:_{min:0.0,max:1.0,padding:_{bottom:0.0,top:0.0}, 2882 tick:_{values:[0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0]}}}}. 2883*/ 2884test_folds(F,M,Prog,LG,NPos,NNeg,LL):- 2885 find_ex(F,M,Pos,Neg,NPos,NNeg), 2886 M:local_setting(threads,Th), 2887 current_prolog_flag(cpu_count,Cores), 2888 ((Th=cpu;Th>Cores)-> 2889 Chunks = Cores 2890 ; 2891 Chunks = Th 2892 ), 2893 chunks(Pos,Chunks,PosC), 2894 chunks(Neg,Chunks,NegC), 2895 concurrent_maplist(compute_prob_ex_pos_list(Prog,M),PosC,LGP), 2896 append(LGP,LG0), 2897 concurrent_maplist(compute_prob_ex_neg_list(Prog,M),NegC,LGN), 2898 append(LGN,LG1), 2899 append(LG0,LG1,LG2), 2900 keysort(LG2,LG), 2901 foldl(ll(M),LG,0,LL). 2902 2903compute_prob_ex_pos_list(Prog,M,Pos,LGP):- 2904 maplist(compute_prob_ex_pos(Prog,M),Pos,LGP). 2905 2906compute_prob_ex_neg_list(Prog,M,Neg,LGN):- 2907 maplist(compute_prob_ex_neg(Prog,M),Neg,LGN). 2908 2909ll(M,P- (\+ _),LL0,LL):-!, 2910 (P=:=1.0-> 2911 M:local_setting(logzero,LZ), 2912 LL is LL0+LZ 2913 ; 2914 LL is LL0+ log(1-P) 2915 ). 2916 2917ll(M,P- _,LL0,LL):- 2918 (P=:=0.0-> 2919 M:local_setting(logzero,LZ), 2920 LL is LL0+LZ 2921 ; 2922 LL is LL0+ log(P) 2923 ). 2924 2925 2926 2927 2928 2929find_ex(DB,M,Pos,Neg,NPos,NNeg):- 2930 M:local_setting(neg_ex,given),!, 2931 M:output(P/A),!, 2932 find_ex_pred([P/A],M,DB,[],Pos,[],Neg), 2933 length(Pos,NPos), 2934 length(Neg,NNeg). 2935 2936find_ex(DB,M,Pos,Neg,NPos,NNeg):- 2937 M:local_setting(neg_ex,cw), 2938 M:output(P/A),!, 2939 find_ex_pred_cw([P/A],M,DB,[],Pos,[],Neg), 2940 length(Pos,NPos), 2941 length(Neg,NNeg). 2942 2943 2944find_ex_pred([],_M,_DB,Pos,Pos,Neg,Neg). 2945 2946find_ex_pred([P/A|T],M,DB,Pos0,Pos,Neg0,Neg):- 2947 functor(At,P,A), 2948 find_ex_db(DB,M,At,Pos0,Pos1,Neg0,Neg1), 2949 find_ex_pred(T,M,DB,Pos1,Pos,Neg1,Neg). 2950 2951find_ex_db([],_M,_At,Pos,Pos,Neg,Neg). 2952 2953find_ex_db([H|T],M,At,Pos0,Pos,Neg0,Neg):- 2954 At=..[P|L], 2955 At1=..[P,H|L], 2956 findall(At1,M:At1,LP), 2957 findall(At1,M:neg(At1),LN), 2958 append([Pos0,LP],Pos1), 2959 append([Neg0,LN],Neg1), 2960 find_ex_db(T,M,At,Pos1,Pos,Neg1,Neg). 2961 2962 2963find_ex_pred_cw([],_M,_DB,Pos,Pos,Neg,Neg). 2964 2965find_ex_pred_cw([P/A|T],M,DB,Pos0,Pos,Neg0,Neg):- 2966 functor(At,P,A), 2967 findall(Types,get_types(At,M,Types),LT), 2968 append(LT,LLT), 2969 remove_duplicates(LLT,Types1), 2970 find_ex_db_cw(DB,M,At,Types1,Pos0,Pos1,Neg0,Neg1), 2971 find_ex_pred_cw(T,M,DB,Pos1,Pos,Neg1,Neg). 2972 2973get_types(At,_M,[]):- 2974 At=..[_],!. 2975 2976get_types(At,M,Types):- 2977 M:modeh(_,At), 2978 At=..[_|Args], 2979 get_args(Args,Types). 2980 2981get_types(At,M,Types):- 2982 M:modeh(_,HT,_,_), 2983 member(At,HT), 2984 At=..[_|Args], 2985 get_args(Args,Types). 2986 2987 2988get_args([],[]). 2989 2990get_args([+H|T],[H|T1]):-!, 2991 get_args(T,T1). 2992 2993get_args([-H|T],[H|T1]):-!, 2994 get_args(T,T1). 2995 2996get_args([#H|T],[H|T1]):-!, 2997 get_args(T,T1). 2998 2999get_args([-#H|T],[H|T1]):-!, 3000 get_args(T,T1). 3001 3002get_args([H|T],[H|T1]):- 3003 get_args(T,T1). 3004 3005 3006 3007 3008get_constants([],_Mod,_M,[]). 3009 3010get_constants([Type|T],Mod,M,[(Type,Co)|C]):- 3011 find_pred_using_type(Type,Mod,LP), 3012 find_constants(LP,Mod,M,[],Co), 3013 get_constants(T,Mod,M,C). 3014 3015find_pred_using_type(T,M,L):- 3016 (setof((P,Ar,A),pred_type(T,M,P,Ar,A),L)-> 3017 true 3018 ; 3019 L=[] 3020 ). 3021 3022pred_type(T,M,P,Ar,A):- 3023 M:modeh(_,S), 3024 S=..[P|Args], 3025 length(Args,Ar), 3026 scan_args(Args,T,1,A). 3027 3028pred_type(T,M,P,Ar,A):- 3029 M:modeb(_,S), 3030 S=..[P|Args], 3031 length(Args,Ar), 3032 scan_args(Args,T,1,A). 3033 3034scan_args([+T|_],T,A,A):-!. 3035 3036scan_args([-T|_],T,A,A):-!. 3037 3038scan_args([#T|_],T,A,A):-!. 3039 3040scan_args([-#T|_],T,A,A):-!. 3041 3042scan_args([_|Tail],T,A0,A):- 3043 A1 is A0+1, 3044 scan_args(Tail,T,A1,A). 3045 3046find_constants([],_Mod,_M,C,C). 3047 3048find_constants([(P,Ar,A)|T],Mod,M,C0,C):- 3049 gen_goal(1,Ar,A,Args,ArgsNoV,V), 3050 G=..[P,M|Args], 3051 (setof(V,ArgsNoV^call_goal(Mod,G),LC)-> 3052 true 3053 ; 3054 LC=[] 3055 ), 3056 append(C0,LC,C1), 3057 remove_duplicates(C1,C2), 3058 find_constants(T,Mod,M,C2,C). 3059 3060call_goal(M,G):- 3061 M:G. 3062 3063gen_goal(Arg,Ar,_A,[],[],_):- 3064 Arg =:= Ar+1,!. 3065 3066gen_goal(A,Ar,A,[V|Args],ArgsNoV,V):-!, 3067 Arg1 is A+1, 3068 gen_goal(Arg1,Ar,A,Args,ArgsNoV,V). 3069 3070gen_goal(Arg,Ar,A,[ArgV|Args],[ArgV|ArgsNoV],V):- 3071 Arg1 is Arg+1, 3072 gen_goal(Arg1,Ar,A,Args,ArgsNoV,V). 3073 3074 3075 3076find_ex_db_cw([],_M,_At,_Ty,Pos,Pos,Neg,Neg). 3077 3078find_ex_db_cw([H|T],M,At,Types,Pos0,Pos,Neg0,Neg):- 3079 get_constants(Types,M,H,C), 3080 At=..[P|L], 3081 get_types(At,M,TypesA),!, 3082 length(L,N), 3083 length(LN,N), 3084 At1=..[P,H|LN], 3085 findall(At1,M:At1,LP), 3086 (setof(At1,neg_ex(LN,TypesA,M,At1,C),LNeg)->true;LNeg=[]), 3087 append([Pos0,LP],Pos1), 3088 append([Neg0,LNeg],Neg1), 3089 find_ex_db_cw(T,M,At,Types,Pos1,Pos,Neg1,Neg). 3090 3091neg_ex([],[],M,At1,_C):- 3092 \+ M:At1. 3093 3094neg_ex([H|T],[HT|TT],M,At1,C):- 3095 member((HT,Co),C), 3096 member(H,Co), 3097 neg_ex(T,TT,M,At1,C).
3109explain_lift(M:H,Expl):-
3110 M:in(R00),
3111 explain_lift(M:H,R00,Expl).
3118explain_lift(M:H,R00,Expl):- 3119 process_clauses(R00,M,R0), 3120 generate_clauses(R0,M,0,Prog), 3121 maplist(explain_rule(M,H),Prog,Expls), 3122 append(Expls,Expl). 3123 3124 3125explain_rule(M,H,(H,B,_V,P),Expl):- 3126 findall((P-B),M:B,Expl).
3134hits_at_k(M:Folds,TargetPred,Arg,K,HitsAtK,FilteredHitsAtK):-
3135 M:in(P),
3136 hits_at_k(M:Folds,TargetPred,Arg,K,P,HitsAtK,FilteredHitsAtK).
3144hits_at_k(M:Folds,TargetPred,Arg,K,R00,HitsAtK,FilteredHitsAtK):- 3145 process_clauses(R00,M,R0), 3146 generate_clauses(R0,M,0,Prog), 3147 findall(IDs,(member(F,Folds),M:fold(F,IDs)),L), 3148 append(L,DB), 3149 find_ex_pred([TargetPred],M,DB,[],Exs,[],_), 3150 M:local_setting(threads,Th), 3151 current_prolog_flag(cpu_count,Cores), 3152 ((Th=cpu;Th>Cores)-> 3153 Chunks = Cores 3154 ; 3155 Chunks = Th 3156 ), 3157 chunks(Exs,Chunks,ExsC), 3158 Arg1 is Arg+1, 3159 concurrent_maplist(hits(Prog,M,Arg1,K),ExsC,LHits0,LFHits0), 3160 append(LHits0,LHits), 3161 average(LHits,HitsAtK), 3162 append(LFHits0,LFHits), 3163 average(LFHits,FilteredHitsAtK). 3164 3165hits(Prog,M,Arg,K,Exs,Hits,FilteredHits):- 3166 maplist(hit(Prog,M,Arg,K),Exs,Hits,FilteredHits). 3167 3168hit(Prog,M,Arg,K,Ex,Hit,FilteredHit):- 3169 arg(Arg,Ex,Ent), 3170 rank_answer_int(Ex,M,Arg,Prog,Rank,FRank), 3171 write_canonical(rank(Ex,Ent,Rank,FRank)),nl, 3172 (Rank=<K-> 3173 Hit = 1.0 3174 ; 3175 Hit = 0.0 3176 ), 3177 (FRank=<K-> 3178 FilteredHit = 1.0 3179 ; 3180 FilteredHit = 0.0 3181 ).
3189inst_exs(M:Folds,TargetPred,Arg,R00):- 3190 process_clauses(R00,M,R0), 3191 generate_clauses(R0,M,0,Prog), 3192 findall(IDs,(member(F,Folds),M:fold(F,IDs)),L), 3193 append(L,DB), 3194 find_ex_pred([TargetPred],M,DB,[],Exs,[],_), 3195 M:local_setting(threads,Th), 3196 current_prolog_flag(cpu_count,Cores), 3197 ((Th=cpu;Th>Cores)-> 3198 Chunks = Cores 3199 ; 3200 Chunks = Th 3201 ), 3202 chunks(Exs,Chunks,ExsC), 3203 Arg1 is Arg+1, 3204 concurrent_maplist(inst_list(Prog,M,Arg1),ExsC). 3205 3206inst_list(Prog,M,Arg,Exs):- 3207 maplist(inst_ex(Prog,M,Arg),Exs). 3208 3209inst_ex(Prog,M,Arg,Ex):- 3210 arg(Arg,Ex,Ent), 3211 setarg(Arg,Ex,_Var), 3212 find_instantions(Ex,Prog,M,Inst), 3213 maplist(extract_arg(Arg),Inst,InstV), 3214 write_canonical(inst(Ex,Ent,InstV)),writeln('.'). 3215 3216extract_arg(Arg,G,V):- 3217 arg(Arg,G,V).
3225rank_exs(M:Folds,TargetPred,Arg,R00):- 3226 process_clauses(R00,M,R0), 3227 generate_clauses(R0,M,0,Prog), 3228 findall(IDs,(member(F,Folds),M:fold(F,IDs)),L), 3229 append(L,DB), 3230 find_ex_pred([TargetPred],M,DB,[],Exs,[],_), 3231 M:local_setting(threads,Th), 3232 current_prolog_flag(cpu_count,Cores), 3233 ((Th=cpu;Th>Cores)-> 3234 Chunks = Cores 3235 ; 3236 Chunks = Th 3237 ), 3238 chunks(Exs,Chunks,ExsC), 3239 Arg1 is Arg+1, 3240 concurrent_maplist(rank_list(Prog,M,Arg1),ExsC). 3241 3242rank_list(Prog,M,Arg,Exs):- 3243 maplist(rank_ex(Prog,M,Arg),Exs).
3251rank_ex(M:Ex,R00,Arg):- 3252 process_clauses(R00,M,R0), 3253 generate_clauses(R0,M,0,Prog), 3254 rank_ex(Prog,M,Arg,Ex). 3255 3256rank_ex(Prog,M,Arg,Ex):- 3257 arg(Arg,Ex,Ent), 3258 setarg(Arg,Ex,_Var), 3259 find_instantions(Ex,Prog,M,Inst), 3260 maplist(compute_prob(Prog,M,Arg),Inst,Answers), 3261 sort(0,@>=,Answers,RankedAnswers), 3262 write_canonical(rank(Ex,Ent,RankedAnswers)),writeln('.'). 3263 3264compute_prob(Prog,M,Arg,G,(P-V)):- 3265 prob_lift_int(G,M,Prog,P), 3266 arg(Arg,G,V). 3267 3268find_instantions(Ex,Prog,M,Inst):- 3269 setof(Ex,Prog^find_inst(Prog,M,Ex),Inst),!. 3270 3271find_instantions(_Ex,_Prog,_M,[]). 3272 3273find_inst(Prog,M,Ex):- 3274 member((H,B,_V,_P),Prog), 3275 H=Ex,M:B. 3276 3277average(L,Average):- 3278 sum_list(L,Sum), 3279 length(L,N), 3280 (N>0-> 3281 Average is Sum/N 3282 ; 3283 Average is 0.0 3284 ).
3291rank_answer(M:H,Arg,Rank):-
3292 M:in(R00),
3293 rank_answer(M:H,Arg,R00,Rank).
3301rank_answer(M:H,Arg,Prog,Rank):- 3302 arg(Arg,H,A), 3303 setarg(Arg,H,Var), 3304 ranked_answers(M:H,Var,Prog,RankedAnswers), 3305 rank(A,RankedAnswers,Rank). 3306 3307rank_answer_int(H,M,Arg,Prog,Rank,FRank):- 3308 arg(Arg,H,A), 3309 setarg(Arg,H,Var), 3310 ranked_answers_int(H,M,Var,Prog,RankedAnswers), 3311 rank(A,RankedAnswers,Rank), 3312 filter(RankedAnswers,FilteredRankedAnswers,H,Var), 3313 rank(A,FilteredRankedAnswers,FRank). 3314 3315filter([],[],_H,_Var). 3316 3317filter([P-A|T],[P-A|T1],H,V):- 3318 copy_term((H,V),(H1,V1)), 3319 H1=..[_|Args], 3320 H2=..[t|Args], 3321 V1=A, 3322 (;),!, 3323 filter(T,T1,H,V). 3324 3325filter([_P-_A|T],T1,H,V):- 3326 filter(T,T1,H,V).
3337ranked_answers(M:H,Var,RankedNaswers):-
3338 M:in(P),
3339 ranked_answers(M:H,Var,P,RankedNaswers).
3347ranked_answers(M:H,Var,Prog,RankedNaswers):- 3348 findall((P-Var),prob_lift(M:H,Prog,P),Answers), 3349 sort(0,@>=,Answers,RankedNaswers). 3350 3351ranked_answers_int(H,M,Var,Prog,RankedNaswers):- 3352 findall((P-Var),prob_lift_int(H,M,Prog,P),Answers), 3353 sort(0,@>=,Answers,RankedNaswers).
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.rank.html /
3364rank(E,L,R):-
3365 rank_group(L,E,+inf,0.0,1.0,R).
3373rank_group([],_E,_S,_NG,_N,+inf). 3374 3375rank_group([(S1 - E1)|T],E,S,NG,N,R):- 3376 N1 is N+1.0, 3377 (E1==E-> 3378 (S1<S-> 3379 rank_group_found(T,S1,1.0,N1,R) 3380 ; 3381 NG1 is NG+1.0, 3382 rank_group_found(T,S1,NG1,N1,R) 3383 ) 3384 ; 3385 (S1<S-> 3386 rank_group(T,E,S1,1.0,N1,R) 3387 ; 3388 NG1 is NG+1.0, 3389 rank_group(T,E,S1,NG1,N1,R) 3390 ) 3391 ).
3399rank_group_found([],_S,NG,N,R):- 3400 R is N-(NG+1.0)/2. 3401 3402rank_group_found([(S1 - _E1)|T],S,NG,N,R):- 3403 (S1<S-> 3404 R is N-(NG+1.0)/2 3405 ; 3406 N1 is N+1.0, 3407 NG1 is NG+1.0, 3408 rank_group_found(T,S1,NG1,N1,R) 3409 ).
3424prob_lift(M:H,P):-
3425 M:in(R00),
3426 prob_lift(M:H,R00,P).
3436prob_lift(M:H,R00,P):- 3437 process_clauses(R00,M,R0), 3438 generate_clauses(R0,M,0,Prog), 3439 prob_lift_int(H,M,Prog,P). 3440 3441prob_lift_int(H,M,Prog,P):- 3442 (M:local_setting(single_var,true)-> 3443 theory_counts_sv(Prog,M,H,MI) 3444 ; 3445 theory_counts(Prog,M,H,MI) 3446 ), 3447 compute_prob_ex(Prog,MI,1,PG0), 3448 P is 1-PG0. 3449 3450theory_counts([],_M,_H,[]). 3451 3452theory_counts([(H,B,_V,_P)|Rest],M,E,[MI|RestMI]):- 3453 test_rule(H,B,M,E,MI), 3454 theory_counts(Rest,M,E,RestMI). 3455 3456 3457test_rule(H,B,M,E,N):- 3458 findall(1,(H=E,M:B),L), 3459 length(L,N). 3460/* 3461 term_variables(B,Vars), 3462 term_variables(H,V), 3463 subtract_eq(Vars,V,VB), 3464 aggregate(count,VB^(H=E,M:B),N),!. 3465 3466 3467test_rule(_H,_B,_M,_E,0). 3468*/ 3469theory_counts_sv([],_M,_H,[]). 3470 3471theory_counts_sv([(H,B,_V,_P)|Rest],M,E,[MI|RestMI]):- 3472 copy_term((H,B),(H1,B1)), 3473 test_rule_sv(H1,B1,M,E,MI), 3474 theory_counts_sv(Rest,M,E,RestMI). 3475 3476test_rule_sv(H,B,M,E,N):- 3477 H=E,M:B,!, 3478 N=1. 3479 3480test_rule_sv(_H,_B,_M,_E,0). 3481/* term_variables(B,Vars), 3482 term_variables(H,V), 3483 subtract_eq(Vars,V,VB), 3484 \+ aggregate(count,VB^(H=E,M:B),_), 3485 % (H=E,M:(\+ B);H\=E),*/ 3486 % N=0. 3487 3488subtract_eq([], _, R) => 3489 R = []. 3490subtract_eq([E|T], D, R) => 3491 ( member_eq(E, D) 3492 -> subtract_eq(T, D, R) 3493 ; R = [E|R1], 3494 subtract_eq(T, D, R1) 3495 ). 3496 3497 3498compute_prob_ex_neg(Prog,M,H,PG- (\+ H)):- 3499 length(Prog,N), 3500 gen_initial_counts(N,MI0), 3501 test_theory_neg_prob([H],M,Prog,MI0,MI), 3502 compute_prob_ex(Prog,MI,1,PG0), 3503 PG is 1-PG0. 3504 3505compute_prob_ex_pos(Prog,M,H,PG- H):- 3506 length(Prog,N), 3507 gen_initial_counts(N,MI0), 3508 test_theory_neg_prob([H],M,Prog,MI0,MI), 3509 compute_prob_ex(Prog,MI,1,PG0), 3510 PG is 1-PG0. 3511 3512compute_prob_ex([],[],PG,PG). 3513 3514compute_prob_ex([(_,_,_,P)|R],[MIH|MIT],PG0,PG):- 3515 PG1 is PG0*(1-P)^MIH, 3516 compute_prob_ex(R,MIT,PG1,PG). 3517 3518writes([H-H1],S):- 3519 format(S,"~f - (~q)]).~n~n",[H,H1]). 3520 3521writes([H-H1|T],S):- 3522 format(S,"~f - (~q),~n",[H,H1]), 3523 writes(T,S). 3524 3525 3526write_p(P,S):- 3527 get_xy(P,PX,PY), 3528 format(S,"x=[",[]), 3529 writesf(PX,S), 3530 format(S,"y=[",[]), 3531 writesf(PY,S), 3532 format(S," 3533figure('Name','roc','NumberTitle','off') 3534set(gca,'XLim',[0.0 1.0]) 3535set(gca,'YLim',[0.0 1.0]) 3536x=[x 1.0] 3537y=[y 0.0] 3538k=convhull(x,y) 3539plot(x(k),y(k),'r-',x,y,'--b+') 3540%A = polyarea(x,y)~n~n 3541%save area_roc.csv A -ascii -append 3542", 3543 []). 3544 3545get_xy([],[],[]). 3546 3547get_xy([X-Y|T],[X|TX],[Y|TY]):- 3548 get_xy(T,TX,TY). 3549 3550 3551writesf([H],S):- 3552 format(S,"~f]~n",[H]). 3553 3554writesf([H|T],S):- 3555 format(S,"~f ",[H]), 3556 writesf(T,S). 3557 3558write_ppr(P,S):- 3559 get_xy(P,PX,PY), 3560 format(S,"rec=[",[A]), 3561 writesf(PX,S), 3562 format(S,"prec=[",[A]), 3563 writesf(PY,S), 3564 format(S," 3565figure('Name','pr','NumberTitle','off') 3566set(gca,'XLim',[0.0 1.0]) 3567set(gca,'YLim',[0.0 1.0]) 3568rec=[0.0 rec 1.0]; 3569prec=[0.0 prec 0.0]; 3570plot(rec,prec,'--*k') 3571%A=polyarea(rec,prec) 3572%save area_pr.csv A -ascii -append 3573~n~n", 3574 []).
write(Message)
if the verbosity is at least 2.
Module is used to get the verbosity setting
/
3582write2(M,A):-
3583 M:local_setting(verbosity,Ver),
3584 (Ver>1->
3585 write(A)
3586 ;
3587 true
3588 ).
write(Message)
if the verbosity is at least 3.
Module is used to get the verbosity setting.
/
3595write3(M,A):-
3596 M:local_setting(verbosity,Ver),
3597 (Ver>2->
3598 write(A)
3599 ;
3600 true
3601 ).
write(Message)
if the verbosity is at least 4.
Module is used to get the verbosity setting.
/
3609write4(M,A):-
3610 M:local_setting(verbosity,Ver),
3611 (Ver>3->
3612 write(A)
3613 ;
3614 true
3615 ).
3622nl2(M):-
3623 M:local_setting(verbosity,Ver),
3624 (Ver>1->
3625 nl
3626 ;
3627 true
3628 ).
3635nl3(M):-
3636 M:local_setting(verbosity,Ver),
3637 (Ver>2->
3638 nl
3639 ;
3640 true
3641 ).
3649nl4(M):-
3650 M:local_setting(verbosity,Ver),
3651 (Ver>3->
3652 nl
3653 ;
3654 true
3655 ).
format(Format,Arguments)
if the verbosity is at least 2.
Module is used to get the verbosity setting.
/
3662format2(M,A,B):-
3663 M:local_setting(verbosity,Ver),
3664 (Ver>1->
3665 format(A,B)
3666 ;
3667 true
3668 ).
format(Format,Arguments)
if the verbosity is at least 3.
Module is used to get the verbosity setting.
/
3675format3(M,A,B):-
3676 M:local_setting(verbosity,Ver),
3677 (Ver>2->
3678 format(A,B)
3679 ;
3680 true
3681 ).
format(Format,Arguments)
if the verbosity is at least 4.
Module is used to get the verbosity setting.
/
3688format4(M,A,B):-
3689 M:local_setting(verbosity,Ver),
3690 (Ver>3->
3691 format(A,B)
3692 ;
3693 true
3694 ).
3701write_rules2(M,A,B):-
3702 M:local_setting(verbosity,Ver),
3703 (Ver>1->
3704 write_rules(A,B)
3705 ;
3706 true
3707 ).
3714write_rules3(M,A,B):- 3715 M:local_setting(verbosity,Ver), 3716 (Ver>2-> 3717 write_rules(A,B) 3718 ; 3719 true 3720 ). 3721 3722 3723write_disj_clause2(M,A,B):- 3724 M:local_setting(verbosity,Ver), 3725 (Ver>1-> 3726 write_disj_clause(A,B) 3727 ; 3728 true 3729 ). 3730 3731write_disj_clause3(M,A,B):- 3732 M:local_setting(verbosity,Ver), 3733 (Ver>2-> 3734 write_disj_clause(A,B) 3735 ; 3736 true 3737 ). 3738 3739write_body2(M,A,B):- 3740 M:local_setting(verbosity,Ver), 3741 (Ver>1-> 3742 write_body(A,B) 3743 ; 3744 true 3745 ). 3746 3747write_body3(M,A,B):- 3748 M:local_setting(verbosity,Ver), 3749 (Ver>2-> 3750 write_body(A,B) 3751 ; 3752 true 3753 ). 3754 3755 3756 3757 3758lift_expansion((:- begin_bg), []) :- 3759 prolog_load_context(module, M), 3760 lift_input_mod(M),!, 3761 assert(M:bg_on). 3762 3763lift_expansion(C, M:bgc(C)) :- 3764 prolog_load_context(module, M), 3765 C\= (:- end_bg), 3766 lift_input_mod(M), 3767 M:bg_on,!. 3768 3769lift_expansion((:- end_bg), []) :- 3770 prolog_load_context(module, M), 3771 lift_input_mod(M),!, 3772 retractall(M:bg_on), 3773 findall(C,M:bgc(C),L), 3774 retractall(M:bgc(_)), 3775 (M:bg(BG0)-> 3776 retract(M:bg(BG0)), 3777 append(BG0,L,BG), 3778 assert(M:bg(BG)) 3779 ; 3780 assert(M:bg(L)) 3781 ). 3782 3783 3784 3785 3786 3787 3788lift_expansion((:- begin_in), []) :- 3789 prolog_load_context(module, M), 3790 lift_input_mod(M),!, 3791 assert(M:in_on). 3792 3793lift_expansion(C, M:inc(C)) :- 3794 prolog_load_context(module, M), 3795 C\= (:- end_in), 3796 lift_input_mod(M), 3797 M:in_on,!. 3798 3799lift_expansion((:- end_in), []) :- 3800 prolog_load_context(module, M), 3801 lift_input_mod(M),!, 3802 retractall(M:in_on), 3803 findall(C,M:inc(C),L), 3804 retractall(M:inc(_)), 3805 (M:in(IN0)-> 3806 retract(M:in(IN0)), 3807 append(IN0,L,IN), 3808 assert(M:in(IN)) 3809 ; 3810 assert(M:in(L)) 3811 ). 3812 3813lift_expansion(begin(model(I)), []) :- 3814 prolog_load_context(module, M), 3815 lift_input_mod(M),!, 3816 retractall(M:model(_)), 3817 assert(M:model(I)), 3818 assert(M:int(I)). 3819 3820lift_expansion(end(model(_I)), []) :- 3821 prolog_load_context(module, M), 3822 lift_input_mod(M),!, 3823 retractall(M:model(_)). 3824 3825lift_expansion(At, A) :- 3826 prolog_load_context(module, M), 3827 lift_input_mod(M), 3828 M:model(Name), 3829 At \= (_ :- _), 3830 At \= end_of_file, 3831 (At=neg(Atom)-> 3832 Atom=..[Pred|Args], 3833 Atom1=..[Pred,Name|Args], 3834 A=neg(Atom1) 3835 ; 3836 (At=prob(Pr)-> 3837 A='$prob'(Name,Pr) 3838 ; 3839 At=..[Pred|Args], 3840 Atom1=..[Pred,Name|Args], 3841 A=Atom1 3842 ) 3843 ). 3844 3845:- multifile sandbox:safe_meta/2. 3846 3847sandbox:safe_meta(liftcover:induce_par_lift(_,_) ,[]). 3848sandbox:safe_meta(liftcover:induce_lift(_,_), []). 3849sandbox:safe_meta(liftcover:test_prob_lift(_,_,_,_,_,_), []). 3850sandbox:safe_meta(liftcover:test_lift(_,_,_,_,_,_,_), []). 3851sandbox:safe_meta(liftcover:prob_lift(_,_), []). 3852sandbox:safe_meta(liftcover:prob_lift(_,_,_), []). 3853sandbox:safe_meta(liftcover:explain_lift(_,_), []). 3854sandbox:safe_meta(liftcover:explain_lift(_,_,_), []). 3855sandbox:safe_meta(liftcover:ranked_answers(_,_,_), []). 3856sandbox:safe_meta(liftcover:ranked_answers(_,_,_,_), []). 3857sandbox:safe_meta(liftcover:rank_answer(_,_,_), []). 3858sandbox:safe_meta(liftcover:rank_answer(_,_,_,_), []). 3859sandbox:safe_meta(liftcover:hits_at_k(_,_,_,_,_,_), []). 3860sandbox:safe_meta(liftcover:hits_at_k(_,_,_,_,_,_,_), []). 3861sandbox:safe_meta(liftcover:set_lift(_,_), []). 3862sandbox:safe_meta(liftcover:setting_lift(_,_), []). 3863sandbox:safe_meta(liftcover:filter_rules(_,_), []). 3864 3865:- multifile sandbox:safe_primitive/1. 3866sandboxsafe_primitive(liftcover:filter_rules(_,_,_), []). 3867sandboxsafe_primitive(liftcover:sort_rules(_,_,_), []). 3868sandboxsafe_primitive(liftcover:remove_zero(_,_), []). 3869sandboxsafe_primitive(liftcover:rank(_,_,_), []). 3870 3871 3872 3873:- thread_local lift_file/1. 3874 3875 3876userterm_expansion((:- lift), []) :-!, 3877 prolog_load_context(module, M), 3878 prolog_load_context(source, Source), 3879 asserta(lift_file(Source)), 3880% retractall(input_mod(_)), 3881% M:dynamic(model/1), 3882% M:set_prolog_flag(unkonw,fail), 3883 retractall(M:local_setting(_,_)), 3884 findall(local_setting(P,V),default_setting_lift(P,V),L), 3885 assert_all(L,M,_), 3886 assert(lift_input_mod(M)), 3887 retractall(M:rule_lift_n(_)), 3888 assert(M:rule_lift_n(0)), 3889 M:dynamic((modeh/2,modeh/4,fixed_rule/3,banned/2,lookahead/2, 3890 lookahead_cons/2,lookahead_cons_var/2,prob/2,output/1,input/1,input_cw/1, 3891 ref_clause/1,ref/1,model/1,neg/1,rule/4,determination/2, 3892 bg_on/0,bg/1,bgc/1,in_on/0,in/1,inc/1,int/1)), 3893 style_check(-discontiguous). 3894 3895userterm_expansion(end_of_file, C) :- 3896 lift_file(Source), 3897 prolog_load_context(source, Source), 3898 retractall(lift_file(Source)), 3899 prolog_load_context(module, M), 3900 lift_input_mod(M),!, 3901 retractall(lift_input_mod(M)), 3902 make_dynamic(M), 3903% retractall(M:tabled(_)), 3904 %retractall(lift_input_mod(M)), 3905 C=[(:- style_check(+discontiguous)),end_of_file]. 3906 3907userterm_expansion(In, Out) :- 3908 \+ current_prolog_flag(xref, true), 3909 lift_file(Source), 3910 prolog_load_context(source, Source), 3911 lift_expansion(In, Out). 3912 3913 3914 3915 3916 3917 3918%
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.