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