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.

author
- Fabrizio Riguzzi, Elena Bellodi
license
- Artistic License 2.0
   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.
 induce_lift(:TrainFolds:list_of_atoms, -P:probabilistic_program) is det
The predicate performs structure learning using the folds indicated in TrainFolds for training. It returns in P the learned probabilistic program. /
  155induce_lift(TrainFolds,P):-
  156  induce_rules(TrainFolds,P0),
  157  rules2terms(P0,P).
 test_lift(:P:probabilistic_program, +TestFolds:list_of_atoms, -LL:float, -AUCROC:float, -ROC:dict, -AUCPR:float, -PR:dict) is det
The predicate takes as input in P a probabilistic program, tests P on the folds indicated in TestFolds and returns the log likelihood of the test examples in LL, the area under the Receiver Operating Characteristic curve in AUCROC, a dict containing the points of the ROC curve in ROC, the area under the Precision Recall curve in AUCPR and a dict containing the points of the PR curve in PR /
  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).
 test_prob_lift(:P:probabilistic_program, +TestFolds:list_of_atoms, -NPos:int, -NNeg:int, -LL:float, -Results:list) is det
The predicate takes as input in P a probabilistic program, tests P on the folds indicated in TestFolds and returns the number of positive examples in NPos, the number of negative examples in NNeg, the log likelihood in LL and in Results a list containing the probabilistic result for each query contained in TestFolds. /
  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(_)).
 sort_rules(+RulesIn:list_of_rules, -RulesOut:list_of_rules) is det
The predicate sorts RulesIn according to the probability of the rules /
  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  ).
 induce_par_lift(:TrainFolds:list_of_atoms, -P:probabilistic_program) is det
The predicate learns the parameters of the program stored in the in/1 fact of the input file using the folds indicated in TrainFolds for training. It returns in P the input program with the updated parameters. /
  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).
 filter_rules(:RulesIn:list_of_rules, -RulesOut:list_of_rules) is det
The predicate removes the rules with a probability below or equal to the min_prob parmeter. /
  527filter_rules(M:R0,R):-
  528  M:local_setting(min_probability,Min_prob),
  529  filter_rules(R0,R,Min_prob).
 filter_rules(+RulesIn:list_of_rules, -RulesOut:list_of_rules, +Min_prob:float) is det
The predicate removes from the rules with a probability below or equal to 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  ).
 remove_zero(+RulesIn:list_of_rules, -RulesOut:list_of_rules) is det
The predicate removes the rules with a probability of 0.0. /
  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).
 list2or(+List:list, -Or:term) is det
list2or(-List:list, +Or:term) is det
The predicate succeeds when Or is a disjunction (using the ; operator) of the terms in List /
 1420list2or([],true):-!.
 1421
 1422list2or([X],X):-
 1423    X\=;(_,_),!.
 1424
 1425list2or([H|T],(H ; Ta)):-!,
 1426    list2or(T,Ta).
 list2and(+List:list, -And:term) is det
list2and(-List:list, +And:term) is det
The predicate succeeds when And is a conjunction (using the , operator) of the terms in List /
 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).
 sample_lift(+N, List:list, -Sampled:list, -Rest:list) is det
Samples N elements from List and returns them in Sampled. The rest of List is returned in Rest If List contains less than N elements, Sampled is List and Rest is []. */
 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:H,HRef),
 2451  assert_all(T,M,TRef).
 2452
 2453assert_all([],[]).
 2454
 2455assert_all([H|T],[HRef|TRef]):-
 2456  assertz(slipcover:H,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*/
 set_lift(:Parameter:atom, +Value:term) is det
The predicate sets the value of a parameter For a list of parameters see https://friguzzi.github.io/liftcover/ /
 2682set_lift(M:Parameter,Value):-
 2683  retract(M:local_setting(Parameter,_)),
 2684  assert(M:local_setting(Parameter,Value)).
 setting_lift(:Parameter:atom, -Value:term) is det
The predicate returns the value of a parameter For a list of parameters see https://friguzzi.github.io/liftcover/ /
 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).
 builtin(+Goal:atom) is det
Succeeds if Goal is an atom whose predicate is defined in Prolog (either builtin or defined in a standard library). /
 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).
 explain_lift(:At:atom, -Exp:list) is multi
The predicate returns the explanation of atom At given by the input program. The first argument of At should be the model name. The explanation is a list of pairs (P-Ex) where P is the probability in the head of a rule H:P:-B and Ex is a true grounding of B. /
 3109explain_lift(M:H,Expl):-
 3110  M:in(R00),
 3111  explain_lift(M:H,R00,Expl).
 explain_lift(:At:atom, +Program:probabilistic_program, -Exp:list) is multi
The predicate returns the explanation of atom At given by Program. /
 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).
 hits_at_k(:Folds:list_of_atoms, +TargetPred:predicate, +Arg:int, +K:int, -HitsAtK:float, -FilteredHitsAtK:float) is det
Returns the Hits@K and filtered Hits@K of the target predicate TargetPred on the list of folds Folds for the argument in position Arg. /
 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).
 hits_at_k(:Folds:list_of_atoms, +TargetPred:predicate, +Arg:int, +Prog:probabilistic_program, +K:int, -Hits:float, -FilteredHits:float) is det
Returns the Hits@K and filtered Hits@K of the target predicate TargetPred on the list of folds Folds for the argument in position Arg computed over Prog. /
 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  ).
 inst_exs(:Folds:list, +TargetPred:PredSpec, +Arg:int, +ProbabilisticProgram:list_of_probabilistic_clauses) is det
The predicate prints the list of answers for all the triples in Folds for predicate TaragetPredwhere argument in position Arg has been replaced by a variable. /
 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).
 rank_exs(:Folds:list, +TargetPred:PredSpec, +Arg:int, +ProbabilisticProgram:list_of_probabilistic_clauses) is det
The predicate prints the list of answers for all the triples in Folds for predicate TaragetPredwhere argument in position Arg has been replaced by a variable. /
 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).
 rank_ex(:At:atom, +ProbabilisticProgram:list_of_probabilistic_clauses, +Arg:int) is det
The predicate prints the list of answers for the query At where argument in position Arg has been replaced by a variable. The first argument of At should be the model name. /
 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  ).
 rank_answer(:At:atom, +Arg:integer, -Rank:float) is det
The predicate returns the rank of the constant in argument Arg of At in the list of answers for the query At. /
 3291rank_answer(M:H,Arg,Rank):-
 3292  M:in(R00),
 3293  rank_answer(M:H,Arg,R00,Rank).
 rank_answer(:At:atom, +Arg:integer, +Prog:probabilistic_program, -Rank:float) is det
The predicate returns the rank of the constant in argument Arg of At in the list of answers for the query At asked using the program Prog. /
 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  (H1;H2),!,
 3323  filter(T,T1,H,V).
 3324
 3325filter([_P-_A|T],T1,H,V):-
 3326  filter(T,T1,H,V).
 ranked_answers(:At:atom, +Var:var, -RankedAnswers:list) is multi
The predicate returns a list of answers for the query At. Var should be a variable in At. RankedAnswers is a list of pairs (P-A) where P is the probability of the answer At{Var/A}. The list is sorted in decreasing order of probability. The first argument of At should be the model name. The query is asked to the input program. /
 3337ranked_answers(M:H,Var,RankedNaswers):-
 3338  M:in(P),
 3339  ranked_answers(M:H,Var,P,RankedNaswers).
 ranked_answers(:At:atom, +Var:var, +Prog:probabilistic_program, -RankedAnswers:list) is multi
As ranked_answers/3 but the query is asked to the program Prog. /
 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).
 rank(:Element:term, +OrderedList:list, -Rank:float) is det
The predicate returns the rank of Element in the list OrderedList. Group of records with the same value are assigned the average of the ranks. OrderedList is a list of pairs (S - E) where S is the score and E is the element.

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).
 rank_group(+OrderedList:list, :Element:term, +CurrentScore:float, +LengthOfCurrentGroup:float, +CurrentPosition:float, -Rank:float) is det
CurrentScore is the score of the current group. LengthOfCurrentGroup is the number of elements in the current group. CurrentPosition is the position of the first element in the list. /
 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  ).
 rank_group_found(+OrderedList:list, +CurrentScore:float, +LengthOfCurrentGroup:float, +CurrentPosition:float, -Rank:float) is det
CurrentScore is the score of the current group. LengthOfCurrentGroup is the number of elements in the current group. CurrentPosition is the position of the first element in the list. The group contains the element to be ranked. /
 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  ).
 prob_lift(:At:atom, -P:float) is multi
The predicate computes the probability of atom At given by the input program. The first argument of At should be the model name. If At contains variables, the predicate returns all the instantiaions of At with their probabilities in backtracking. /
 3424prob_lift(M:H,P):-
 3425  M:in(R00),
 3426  prob_lift(M:H,R00,P).
 prob_lift(:At:atom, +Program:probabilistic_program, -P:float) is multi
The predicate computes the probability of atom At given by Program. The first argument of At should be the model name. If At contains variables, the predicate returns all the instantiaions of At with their probabilities in backtracking. /
 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  []).
 write2(+Module:atom, +Message:term) is det
The predicate calls 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  ).
 write3(+Module:atom, +Message:term) is det
The predicate calls 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  ).
 write4(+Module:atom, +Message:term) is det
The predicate calls 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  ).
 nl2(+Module:atom) is det
The predicate prints a newline if the verbosity is at least 2. Module is used to get the verbosity setting. /
 3622nl2(M):-
 3623  M:local_setting(verbosity,Ver),
 3624  (Ver>1->
 3625    nl
 3626  ;
 3627    true
 3628  ).
 nl3(+Module:atom) is det
The predicate prints a newline if the verbosity is at least 3. Module is used to get the verbosity setting. /
 3635nl3(M):-
 3636  M:local_setting(verbosity,Ver),
 3637  (Ver>2->
 3638    nl
 3639  ;
 3640    true
 3641  ).
 nl4(+Module:atom) is det
The predicate prints a newline if the verbosity is at least 4. Module is used to get the verbosity setting. /
 3649nl4(M):-
 3650  M:local_setting(verbosity,Ver),
 3651  (Ver>3->
 3652    nl
 3653  ;
 3654    true
 3655  ).
 format2(+Module:atom, +Format, :Arguments) is det
The predicate calls 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  ).
 format3(+Module:atom, +Format, :Arguments) is det
The predicate calls 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  ).
 format4(+Module:atom, +Format, :Arguments) is det
The predicate calls 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  ).
 write_rules2(+Module:atom, +Rules:list, +Stream:atom) is det
The predicate write the rules in Rules on stream Stream if the verbosity is at least 2. Module is used to get the verbosity setting. /
 3701write_rules2(M,A,B):-
 3702  M:local_setting(verbosity,Ver),
 3703  (Ver>1->
 3704    write_rules(A,B)
 3705  ;
 3706    true
 3707  ).
 write_rules3(+Module:atom, +Rules:list, +Stream:atom) is det
The predicate write the rules in Rules on stream Stream if the verbosity is at least 3. Module is used to get the verbosity setting. /
 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. 3866sandbox:safe_primitive(liftcover:filter_rules(_,_,_), []).
 3867sandbox:safe_primitive(liftcover:sort_rules(_,_,_), []).
 3868sandbox:safe_primitive(liftcover:remove_zero(_,_), []).
 3869sandbox:safe_primitive(liftcover:rank(_,_,_), []).
 3870
 3871
 3872
 3873:- thread_local lift_file/1. 3874
 3875
 3876user:term_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
 3895user:term_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
 3907user:term_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%