2:-module(slipcover,[set_sc/2,setting_sc/2,
    3  induce/2,induce_par/2,test/7,list2or/2,list2and/2,
    4  sample/4,learn_params/5,
    5  op(500,fx,#),op(500,fx,'-#'),
    6  test_prob/6,rules2terms/2,
    7  get_sc_var_n/6,
    8  process_clauses/6,
    9  generate_clauses/6,
   10  generate_clauses_bg/2,
   11  generate_body/3,
   12  make_dynamic/1,
   13  extract_fancy_vars/2,
   14  linked_clause/3,
   15  banned_clause/3,
   16  take_var_args/3,
   17  remove_duplicates/2,
   18  extract_type_vars/3,
   19  delete_one/3,
   20  get_next_rule_number/2,
   21  tab/3,
   22  zero_clause/3,
   23  member_eq/2,
   24  retract_all/1,assert_all/3,
   25  write2/2,write3/2,format2/3,format3/3,
   26  write_rules2/3,write_rules3/3,
   27  nl2/1,nl3/1]).

slipcover

This module performs learning over Logic Programs with Annotated Disjunctions and CP-Logic programs. It performs both parameter and structure learning.

See https://friguzzi.github.io/cplint/ for details.

Reexports bddem

author
- Fabrizio Riguzzi, Elena Bellodi
license
- Artistic License 2.0
   45/*
   46
   47SLIPCOVER
   48
   49Copyright (c) 2016, Fabrizio Riguzzi and Elena Bellodi
   50
   51*/
   52:-reexport(library(bddem)).   53:-use_module(library(auc)).   54:-use_module(library(lists)).   55:-use_module(library(random)).   56:-use_module(library(system)).   57:-use_module(library(terms)).   58:-use_module(library(apply)).   59:-use_module(cplint_util).   60:-set_prolog_flag(unknown,warning).   61
   62
   63:- dynamic db/1.   64
   65:- dynamic sc_input_mod/1.   66
   67:- thread_local  sc_input_mod/1.   68
   69:- meta_predicate induce(:,-).   70:- meta_predicate induce_rules(:,-).   71:- meta_predicate induce_par(:,-).   72:- meta_predicate induce_parameters(:,-).   73:- meta_predicate test(:,+,-,-,-,-,-).   74:- meta_predicate test_prob(:,+,-,-,-,-).   75:- meta_predicate set_sc(:,+).   76:- meta_predicate setting_sc(:,-).   77
   78default_setting_sc(epsilon_em,0.0001).
   79default_setting_sc(epsilon_em_fraction,0.00001).
   80default_setting_sc(eps,0.0001).
   81default_setting_sc(eps_f,0.00001).
   82
   83/* if the difference in log likelihood in two successive em iteration is smaller
   84than epsilon_em, then EM stops */
   85default_setting_sc(epsilon_sem,2).
   86
   87/* number of random restarts of em */
   88default_setting_sc(random_restarts_REFnumber,1).
   89default_setting_sc(random_restarts_number,1).
   90default_setting_sc(iterREF,-1).
   91default_setting_sc(iter,-1).
   92default_setting_sc(examples,atoms).
   93default_setting_sc(group,1).
   94default_setting_sc(d,1).
   95default_setting_sc(verbosity,1).
   96default_setting_sc(logzero,log(0.000001)).
   97default_setting_sc(megaex_bottom,1).
   98default_setting_sc(initial_clauses_per_megaex,1).
   99default_setting_sc(max_iter,10).
  100default_setting_sc(max_iter_structure,10000).
  101default_setting_sc(max_var,4).
  102default_setting_sc(max_rules,10).
  103default_setting_sc(maxdepth_var,2).
  104default_setting_sc(beamsize,100).
  105default_setting_sc(max_body_length,100).
  106default_setting_sc(neg_literals,false).
  107default_setting_sc(background_clauses,50).
  108
  109default_setting_sc(specialization,bottom).
  110/* allowed values: mode,bottom */
  111default_setting_sc(specialize_head,false).
  112
  113default_setting_sc(seed,seed(3032)).
  114default_setting_sc(c_seed,21344).
  115default_setting_sc(score,ll).
  116/* allowed values: ll aucpr */
  117default_setting_sc(neg_ex,cw).
  118
  119
  120default_setting_sc(epsilon_parsing, 1e-5).
  121default_setting_sc(tabling,auto).
  122/* values:
  123  auto
  124  explicit
  125*/
  126
  127default_setting_sc(bagof,false).
  128/* values: false, intermediate, all, extra */
  129
  130default_setting_sc(compiling,off).
  131
  132
  133default_setting_sc(depth_bound,true).  %if true, it limits the derivation of the example to the value of 'depth'
  134default_setting_sc(depth,2).
  135default_setting_sc(single_var,true). %false:1 variable for every grounding of a rule; true: 1 variable for rule (even if a rule has more groundings),simpler.
  136
  137default_setting_sc(prob_approx,false). %if true, it limits the number of different solutions found when computing the probability
  138default_setting_sc(approx_value,100).
  139
  140default_setting_sc(alpha,0.0).
  141% Sets the type of parameter initialization for EM on Environment:
  142% if alpha is 0.0, it uses a truncated Dirichlet process
  143% if alpha is a float > 0.0, it uses a symmetric Dirichlet distribution
  144% with that value as parameter
 induce(: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. /
  153induce(M:TrainFolds,P):-
  154  must_be(list,TrainFolds),
  155  must_be(var,P),
  156  induce_rules(M:TrainFolds,P0),
  157  rules2terms(P0,P).
 test(: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 /
  169test(M:P,TestFolds,LL,AUCROC,ROC,AUCPR,PR):-
  170  must_be(nonvar,P),
  171  must_be(list,TestFolds),
  172  must_be(var,LL),
  173  must_be(var,AUCROC),
  174  must_be(var,ROC),
  175  must_be(var,AUCPR),
  176  must_be(var,PR),
  177  test_prob(M:P,TestFolds,_NPos,_NNeg,LL,LG),
  178  compute_areas_diagrams(LG,AUCROC,ROC,AUCPR,PR).
 test_prob(: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. /
  189test_prob(M:P,TestFolds,NPos,NNeg,CLL,Results) :-
  190  must_be(nonvar,P),
  191  must_be(list,TestFolds),
  192  must_be(var,NNeg),
  193  must_be(var,CLL),
  194  must_be(var,NPos),
  195  must_be(var,Results),
  196  write2(M,'Testing\n'),
  197  findall(Exs,(member(F,TestFolds),M:fold(F,Exs)),L),
  198  append(L,TE),
  199  reset_next_rule_number(M),
  200  set_sc(M:compiling,on),
  201  process_clauses(P,M,[],_,[],PRules),
  202  generate_clauses(PRules,M,RuleFacts,0,[],Th),
  203  assert_all(Th,M,ThRef),
  204  assert_all(RuleFacts,M,RFRef),
  205  (M:bg(RBG0)->
  206    process_clauses(RBG0,M,[],_,[],RBG),
  207    generate_clauses(RBG,M,_RBGRF,0,[],ThBG),
  208    generate_clauses_bg(RBG,ClBG),
  209    assert_all(ClBG,M,ClBGRef),
  210    assert_all(ThBG,ThBGRef)
  211  ;
  212    true
  213  ),
  214  set_sc(M:compiling,off),
  215  test_no_area([TE],M,NPos,NNeg,CLL,Results),
  216  (M:bg(RBG0)->
  217    retract_all(ThBGRef),
  218    retract_all(ClBGRef)
  219  ;
  220    true
  221  ),
  222  retract_all(ThRef),
  223  retract_all(RFRef).
  224
  225induce_rules(M:Folds,R):-
  226  set_sc(M:compiling,on),
  227  M:local_setting(seed,Seed),
  228  set_random(Seed),
  229  M:local_setting(c_seed,CSeed),
  230  rand_seed(CSeed),
  231  findall(Exs,(member(F,Folds),M:fold(F,Exs)),L),
  232  append(L,DB),
  233  assert(M:database(DB)),
  234  (M:bg(RBG0)->
  235    process_clauses(RBG0,M,[],_,[],RBG),
  236    generate_clauses(RBG,M,_RBG1,0,[],ThBG),
  237    generate_clauses_bg(RBG,ClBG),
  238    assert_all(ThBG,M,ThBGRef),
  239    assert_all(ClBG,M,ClBGRef)
  240  ;
  241    true
  242  ),
  243  length(DB,NMegaEx),
  244  M:local_setting(megaex_bottom, NumMB),
  245  (NMegaEx >= NumMB ->
  246      true
  247    ;
  248      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", []),
  249      set_sc(M:megaex_bottom, NMegaEx)
  250  ),
  251
  252  statistics(walltime,[_,_]),
  253  (M:local_setting(specialization,bottom)->
  254    M:local_setting(megaex_bottom,MB),
  255    deduct(MB,M,DB,[],InitialTheory),
  256    length(InitialTheory,_LI),
  257    remove_duplicates(InitialTheory,R1)
  258  ;
  259    get_head_atoms(O,M),
  260    generate_top_cl(O,M,R1)
  261  ),
  262  learn_struct(DB,M,R1,R2,Score2),
  263  learn_params(DB,M,R2,R,Score),
  264  format2(M,"~nRefinement score  ~f - score after EMBLEM ~f~n",[Score2,Score]),
  265  statistics(walltime,[_,WT]),
  266  WTS is WT/1000.0,
  267  write2(M,'\n\n'),
  268  format2(M,'/* SLIPCOVER Final score ~f~n',[Score]),
  269  format2(M,'Wall time ~f */~n',[WTS]),
  270  write_rules2(M,R,user_output),
  271  set_sc(M:compiling,off),
  272  (M:bg(RBG0)->
  273    retract_all(ThBGRef),
  274    retract_all(ClBGRef)
  275  ;
  276    true
  277  ),
  278  clean_up_db_structure(M).
  279
  280clean_up_db_structure(M):-
  281  retractall(M:ref(_)),
  282  retractall(M:ref_clause(_)),
  283  clean_up_db(M).
 make_dynamic(+Module:atom) is det
Makes the predicates required for learning dynamic. /
  290make_dynamic(M):-
  291  M:(dynamic int/1),
  292  findall(O,M:output(O),LO),
  293  findall(I,M:input(I),LI),
  294  findall(I,M:input_cw(I),LIC),
  295  findall(D,M:determination(D,_DD),LDH),
  296  findall(DD,M:determination(_D,DD),LDD),
  297  findall(DH,(M:modeh(_,_,_,LD),member(DH,LD)),LDDH),
  298  append([LO,LI,LIC,LDH,LDD,LDDH],L0),
  299  remove_duplicates(L0,L),
  300  maplist(to_dyn(M),L).
  301
  302to_dyn(M,P/A):-
  303  A1 is A+1,
  304  M:(dynamic P/A1),
  305  A2 is A1+2,
  306  M:(dynamic P/A2),
  307  A3 is A2+1,
  308  M:(dynamic P/A3).
  309
  310
  311
  312gen_fixed([],_M,[]).
  313
  314gen_fixed([(H,B,BL)|T],M,[rule(R,H,B,BL,tunable)|T1]):-
  315  get_next_rule_number(M,R),
  316  gen_fixed(T,M,T1).
  317
  318
  319learn_struct(DB,Mod,R1,R,Score):-   %+R1:initial theory of the form [rule(NR,[h],[b]],...], -R:final theory of the same form, -CLL
  320  format2(Mod,"Clause search~n~n",[]),
  321  Mod:local_setting(max_iter,M),
  322  Mod:local_setting(depth_bound,DepthB),
  323  set_sc(Mod:depth_bound,false),
  324  findall((H,B,BL),Mod:fixed_rule(H,B,BL),LF),
  325  length(LF,LLF),
  326  gen_fixed(LF,Mod,LFR),
  327  format2(Mod,"Scoring fixed clauses: ~d clauses~n~n",[LLF]),
  328  score_clause_refinements(LFR,Mod,1,LLF,DB,[],NB1,[],CL0,[],CLBG0),
  329  append(NB1,R1,Beam),
  330  cycle_beam(Beam,Mod,DB,CL0,CL,CLBG0,BG,M),
  331  learn_params(DB,Mod,[],REmpty,S),
  332  set_sc(Mod:depth_bound,DepthB),
  333  format2(Mod,"Theory search~n~n",[]),
  334  Mod:local_setting(max_iter_structure,MS),
  335  cycle_structure(CL,Mod,REmpty,S,-1e20,DB,R2,Score,MS),
  336  format2(Mod,"Best target theory~n~n",[]),
  337  write_rules2(Mod,R2,user_output),
  338  Mod:local_setting(background_clauses,NBG1),
  339  length(BG,NBG),
  340  format2(Mod,"Background search: ~d of ~d clauses~n~n",[NBG1,NBG]),
  341  pick_first(NBG1,BG,BG1),
  342  remove_score(BG,BG2),
  343  write_rules2(Mod,BG2,user_output),
  344  write2(Mod,'\n'),
  345  append(R2,BG1,R).
  346
  347pick_first(0,_,[]):-!.
  348
  349pick_first(_,[],[]):-!.
  350
  351pick_first(N,[(H,_S)|T],[H|T1]):-
  352  N1 is N-1,
  353  pick_first(N1,T,T1).
  354
  355remove_score([],[]).
  356
  357remove_score([(H,_S)|T],[H|T1]):-
  358  remove_score(T,T1).
  359
  360cycle_structure([],_Mod,R,S,_SP,_DB,R,S,_I):-!.  %empty beam
  361
  362cycle_structure(_CL,_Mod,R,S,_SP,_DB,R,S,0):-!.  %0 iterations
  363
  364cycle_structure([(RH,_CLL)|RT],Mod,R0,S0,SP0,DB,R,S,M):-
  365  already_scored(Mod,[RH|R0],R3,Score),!,
  366  format2(Mod,"Theory iteration ~d~n~n",[M]),
  367  write3(Mod,'Already scored, updated refinement\n'),
  368  write_rules3(Mod,R3,user_output),
  369  write3(Mod,'Score '),write3(Mod,Score),write3(Mod,'\n\n\n'),
  370  (Score>S0->
  371    R4=R3,
  372    S4=Score,
  373    SP1=S0
  374  ;
  375    R4=R0,
  376    S4=S0,
  377    SP1=SP0
  378  ),
  379  M1 is M-1,
  380  cycle_structure(RT,Mod,R4,S4,SP1,DB,R,S,M1).
  381
  382cycle_structure([(RH,_Score)|RT],Mod,R0,S0,SP0,DB,R,S,M):-
  383  format2(Mod,"Theory iteration ~d~n~n",[M]),
  384  reset_next_rule_number(Mod),
  385  generate_clauses([RH|R0],Mod,R2,0,[],Th1),
  386  format3(Mod,"Initial theory~n~n",[]),
  387  write_rules3(Mod,[RH|R0],user_output),
  388  assert_all(Th1,Mod,Th1Ref),
  389  assert_all(R2,Mod,R2Ref),!,
  390  init_em(ExData),
  391  retractall(Mod:v(_,_,_)),
  392  length(DB,NEx),
  393  abolish_all_tables,
  394  (Mod:local_setting(examples,atoms)->
  395    Mod:local_setting(group,G),
  396    derive_bdd_nodes_groupatoms(DB,Mod,ExData,NEx,G,[],Nodes,0,CLL0,LE,[]),!   % 1 BDD per example if G=1
  397  ;
  398    derive_bdd_nodes(DB,Mod,ExData,NEx,[],Nodes,0,CLL0),! % 1 BDD per model
  399  ),
  400  Mod:local_setting(random_restarts_number,N),
  401  format3(Mod,"~nInitial CLL ~f~n~n",[CLL0]),
  402  random_restarts(N,Mod,ExData,Nodes,CLL0,Score,initial,Par,LE),   %output:CLL,Par
  403  format3(Mod,"Score after EMBLEM = ~f~n",[Score]),
  404  retract_all(Th1Ref),
  405  retract_all(R2Ref),!,
  406  end_ex(ExData),
  407  update_theory(R2,Par,R3),
  408  write3(Mod,'Updated Theory\n'),
  409  write_rules3(Mod,R3,user_output),   %definite rules without probabilities in the head are not written
  410  (Score>S0->
  411    R4=R3,
  412    S4=Score,
  413    SP1=S0,
  414    write3(Mod,'New best score\n')
  415  ;
  416    R4=R0,
  417    S4=S0,
  418    SP1=SP0
  419  ),
  420  store_refinement(Mod,[RH|R0],R3,Score),
  421  M1 is M-1,
  422  cycle_structure(RT,Mod,R4,S4,SP1,DB,R,S,M1).
 induce_par(: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. /
  431induce_par(M:Folds,ROut):-
  432  must_be(list,Folds),
  433  must_be(var,ROut),
  434  induce_parameters(M:Folds,R),
  435  rules2terms(R,ROut).
  436
  437induce_parameters(M:Folds,R):-
  438  set_sc(M:compiling,on),
  439  M:local_setting(seed,Seed),
  440  set_random(Seed),
  441  M:local_setting(c_seed,CSeed),
  442  rand_seed(CSeed),
  443  findall(Exs,(member(F,Folds),M:fold(F,Exs)),L),
  444  append(L,DB),
  445  assert(M:database(DB)),
  446  statistics(walltime,[_,_]),
  447  (M:bg(RBG0)->
  448    process_clauses(RBG0,M,[],_,[],RBG),
  449    generate_clauses(RBG,M,_RBG1,0,[],ThBG),
  450    generate_clauses_bg(RBG,ClBG),
  451    assert_all(ClBG,M,ClBGRef),
  452    assert_all(ThBG,ThBGRef)
  453  ;
  454    true
  455  ),
  456  set_sc(M:compiling,off),
  457  M:in(R00),
  458  set_sc(M:compiling,on),
  459  process_clauses(R00,M,[],_,[],R0),
  460  statistics(walltime,[_,_]),
  461  learn_params(DB,M,R0,R,Score),
  462  statistics(walltime,[_,CT]),
  463  CTS is CT/1000.0,
  464  format2(M,'/* EMBLEM Final score ~f~n',[Score]),
  465  format2(M,'Wall time ~f */~n',[CTS]),
  466  write_rules2(M,R,user_output),
  467  set_sc(M:compiling,off),
  468  (M:bg(RBG0)->
  469    retract_all(ThBGRef),
  470    retract_all(ClBGRef)
  471  ;
  472    true
  473  ),
  474  clean_up_db(M).
  475
  476clean_up_db(M):-
  477  retract(M:rule_sc_n(_)),
  478  assert(M:rule_sc_n(0)),
  479  retract(M:rule_ng_sc_n(_)),
  480  assert(M:rule_ng_sc_n(0)),
  481  retractall(M:v(_,_,_)),
  482  retractall(M:database(_)).
  483
  484get_rule_info(M,RI-Info):-
  485  M:rule(R,HL,_BL,_Lit,Tun),
  486  R\= ng(_,_),
  487  (R=g(RI)->
  488    true
  489  ;
  490    RI=R
  491  ),
  492  length(HL,N),
  493  ((Tun=tunable;Tun=initial)->
  494    Info=N
  495  ;
  496    Info=[N]
  497  ).
  498
  499get_rule_info_rand(M,RI-Info):-
  500  M:rule(R,HL,_BL,_Lit,Tun),
  501  R\= ng(_,_),
  502  (R=g(RI)->
  503    true
  504  ;
  505    RI=R
  506  ),
  507  length(HL,N),
  508  (Tun=tunable->
  509    Info=N
  510  ;
  511    get_probs(HL,Info0),
  512    (Tun=initial->
  513      Info=Info0
  514    ; % fixed parameters
  515      Info=[Info0]
  516    )
  517  ).
 learn_params(+DB:list_of_atoms, +M:atom, +R0:probabilistic_program, -P:probabilistic_program, -Score:float) is det
The predicate learns the parameters of the program R0 and returns the updated program in R and the score in Score. DB contains the list of interpretations ids and M the module where the data is stored. /
  529learn_params(DB,M,R0,R,Score):-  %Parameter Learning
  530  reset_next_rule_number(M),
  531  reset_next_nonground_rule_number(M),
  532  generate_clauses(R0,M,R1,0,[],Th0),
  533  format2(M,"Initial theory~n",[]),
  534  write_rules2(M,R1,user_output),
  535  assert_all(Th0,M,Th0Ref),
  536  assert_all(R1,M,R1Ref),!,
  537  init_em(ExData),
  538  retractall(M:v(_,_,_)),
  539  length(DB,NEx),
  540  abolish_all_tables,
  541  (M:local_setting(examples,atoms)->
  542    M:local_setting(group,G),
  543    derive_bdd_nodes_groupatoms(DB,M,ExData,NEx,G,[],Nodes,0,CLL0,LE,[]),!
  544  ;
  545    derive_bdd_nodes(DB,M,ExData,NEx,[],Nodes,0,CLL0),!
  546  ),
  547  format3(M,"Initial score ~f~n",[CLL0]),
  548  M:local_setting(random_restarts_number,N),
  549  random_restarts(N,M,ExData,Nodes,-1e20,Score,initial,Par,LE),  %computes new parameters Par
  550  end_ex(ExData),
  551  update_theory_par(M,R1,Par,R),
  552  retract_all(Th0Ref),
  553  retract_all(R1Ref),!,
  554  retractall(M:rule(_,_,_,_,_)).
  555
  556
  557update_theory_par(M,OldR,Par,Rules):-
  558   findall(def_rule(H,B,L),member(def_rule(H,B,L),OldR),DefRules0),
  559   findall((H:-B),member((H:-B),OldR),DefRules1),
  560   new_rules(Par,M,DisjRules0),
  561   sort(DisjRules0,DisjRules),
  562   append([DefRules0,DefRules1,DisjRules],Rules).
  563
  564new_rules([],_M,[]).
  565
  566new_rules([[_N,[1.0|_]]|T],M,R):-!,
  567  new_rules(T,M,R).
  568
  569
  570new_rules([[N,P]|T],M,[rule(N,H1,B,L,Tun)|R]):-
  571  reverse(P,P1),
  572  (M:rule(N,H,B,L,Tun);M:rule(g(N),H,B,L,Tun)),
  573  update_head_par(H,P1,H1),
  574  new_rules(T,M,R).
  575
  576
  577update_theory(R,initial,R):-!.
  578
  579update_theory([],_Par,[]).
  580
  581update_theory([def_rule(H,B,L)|T0],Par,[def_rule(H,B,L)|T]):-!,
  582  update_theory(T0,Par,T).
  583
  584update_theory([(H:-B)|T0],Par,[(H:-B)|T]):-!,
  585  update_theory(T0,Par,T).
  586
  587update_theory([rule(N,H,B,L,Tun)|T0],Par,[rule(N,H1,B,L,Tun)|T]):-
  588  member([N,P],Par),!,
  589  reverse(P,P1),
  590  update_head_par(H,P1,H1),
  591  update_theory(T0,Par,T).
  592
  593update_head_par([],[],[]).
  594
  595update_head_par([H:_P|T0],[HP|TP],[H:HP|T]):-
  596  update_head_par(T0,TP,T).
  597
  598cycle_beam([],_Mod,_DB,CL,CL,CLBG,CLBG,_M):-!.
  599
  600cycle_beam(_Beam,_Mod,_DB,CL,CL,CLBG,CLBG,0):-!.
  601
  602cycle_beam(Beam,Mod,DB,CL0,CL,CLBG0,CLBG,M):-
  603  format2(Mod,"Clause iteration ~d~n~n",[M]),
  604  cycle_clauses(Beam,Mod,DB,[],NB,CL0,CL1,CLBG0,CLBG1),
  605  M1 is M-1,%decreases the number of max_iter M
  606  cycle_beam(NB,Mod,DB,CL1,CL,CLBG1,CLBG,M1).
  607
  608cycle_clauses([],_M,_DB,NB,NB,CL,CL,CLBG,CLBG):-!.
  609
  610cycle_clauses([(RH,_ScoreH)|T],M,DB,NB0,NB,CL0,CL,CLBG0,CLBG):-
  611  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
  612  length(LR,NR),
  613  write3(M,'Number of revisions '),write3(M,NR),write3(M,'\n'),
  614  score_clause_refinements(LR,M,1,NR,DB,NB0,NB1,CL0,CL1,CLBG0,CLBG1),
  615  cycle_clauses(T,M,DB,NB1,NB,CL1,CL,CLBG1,CLBG).
  616
  617score_clause_refinements([],_M,_N,_NR,_DB,NB,NB,CL,CL,CLBG,CLBG).
  618
  619score_clause_refinements([R1|T],M,Nrev,NRef,DB,NB0,NB,CL0,CL,CLBG0,CLBG):-  %scans the list of revised theories
  620  already_scored_clause(M,R1,R3,Score),!,
  621  format3(M,'Score ref.  ~d of ~d~n',[Nrev,NRef]),
  622  write3(M,'Already scored, updated refinement\n'),
  623  write_rules3(M,[R3],user_output),
  624  write3(M,'Score '),write3(M,Score),write3(M,'\n\n\n'),
  625  M:local_setting(beamsize,BS),
  626  insert_in_order(NB0,(R3,Score),BS,NB1),
  627  Nrev1 is Nrev+1,
  628  score_clause_refinements(T,M,Nrev1,NRef,DB,NB1,NB,CL0,CL,CLBG0,CLBG).
  629
  630score_clause_refinements([R1|T],M,Nrev,NRef,DB,NB0,NB,CL0,CL,CLBG0,CLBG):-
  631  format3(M,'Score ref.  ~d of ~d~n',[Nrev,NRef]),
  632  write_rules3(M,[R1],user_output),
  633  generate_clauses_cw([R1],M,[R2],0,[],Th1),
  634  assert_all(Th1,M,Th1Ref),
  635  assert_all([R2],M,[R2Ref]),!,
  636  init_em(ExData),
  637  retractall(M:v(_,_,_)),
  638  length(DB,NEx),
  639  get_output_preds(R1,O),
  640  abolish_all_tables,
  641  (M:local_setting(examples,atoms)->
  642    M:local_setting(group,G),
  643    derive_bdd_nodes_groupatoms_output_atoms(DB,M,ExData,O,NEx,G,[],Nodes,0,CLL0,LE,[]),!
  644  ;
  645    derive_bdd_nodes(DB,M,ExData,NEx,[],Nodes,0,CLL0),!
  646  ),
  647  format3(M,"Initial CLL ~f~n",[CLL0]),
  648  M:local_setting(random_restarts_REFnumber,N),
  649  random_restarts_ref(N,M,ExData,Nodes,CLL0,Score,initial,Par,LE),
  650  end_ex(ExData),
  651  update_theory([R2],Par,[R3]),
  652  write3(M,'Updated refinement\n'),
  653  write_rules3(M,[R3],user_output),
  654  write3(M,'Score (CLL) '),write3(M,Score),write3(M,'\n\n\n'),
  655  retract_all(Th1Ref),
  656  retract_all([R2Ref]),!,
  657  M:local_setting(beamsize,BS),
  658  insert_in_order(NB0,(R3,Score),BS,NB1),
  659  (target(R3,M)->
  660    insert_in_order(CL0,(R3,Score),+1e20,CL1),
  661    length(CL1,LCL1),
  662    format2(M,"N. of target clauses ~d~n~n",[LCL1]),
  663    CLBG1=CLBG0
  664  ;
  665    (range_restricted(R3)->
  666      insert_in_order(CLBG0,(R3,Score),+1e20,CLBG1),
  667      length(CLBG1,LCL1),
  668      format2(M,"N. of background clauses ~d~n~n",[LCL1]),
  669      CL1=CL0
  670    ;
  671      format2(M,"Not range restricted~n~n",[]),
  672      CL1=CL0,
  673      CLBG1=CLBG0
  674    )
  675  ),
  676  store_clause_refinement(M,R1,R3,Score),
  677  Nrev1 is Nrev+1,
  678  score_clause_refinements(T,M,Nrev1,NRef,DB,NB1,NB,CL1,CL,CLBG1,CLBG).
  679
  680range_restricted(rule(_N,HL,BL,_Lit,_Tun)):-
  681  term_variables(HL,VH),
  682  term_variables(BL,VB),
  683  sublisteq(VH,VB).
  684
  685sublisteq([],_).
  686
  687sublisteq([H|T],L):-
  688  member_eq(H,L),
  689  sublisteq(T,L).
  690
  691target(R,M):-
  692  get_output_preds(R,O),
  693  member(T,O),
  694  M:output(T),!.
  695
  696get_output_preds(rule(_N,HL,_BL,_Lit,_Tun),O):-
  697  scan_head(HL,[],O).
  698
  699scan_head(['':_],O,O):-!.
  700scan_head([],O,O):-!.
  701scan_head([H:_P|T],O0,O):-
  702  functor(H,F,N),
  703  (member(F/N,O0)->
  704    O1=O0
  705  ;
  706    O1=[F/N|O0]
  707  ),
  708  scan_head(T,O1,O).
  709
  710
  711
  712store_clause_refinement(M,Ref,RefP,Score):-
  713  elab_clause_ref(Ref,Ref1),
  714  assert(M:ref_clause(r(Ref1,RefP,Score))).
  715
  716store_refinement(M,Ref,RefP,Score):-
  717  elab_ref(Ref,Ref1),
  718  assert(M:ref(r(Ref1,RefP,Score))).
  719
  720already_scored_clause(M,R,R1,Score):-
  721  elab_ref([R],[rule(H,B)]),
  722  M:ref_clause(r(rule(H,B1),R1,Score)),
  723  permutation(B,B1).
  724
  725already_scored(M,R,R1,Score):-
  726  elab_ref(R,RR),
  727  M:ref(r(RR,R1,Score)).
  728
  729
  730elab_clause_ref(rule(_NR,H,B,_Lits,_Tun),rule(H1,B1)):-
  731  copy_term((H,B),(H1,B1)).
  732
  733elab_ref([],[]).
  734
  735elab_ref([rule(_NR,H,B,_Lits,_Tun)|T],[rule(H1,B1)|T1]):-!,
  736  copy_term((H,B),(H1,B1)),
  737  numbervars((H1,B1),0,_N),
  738  elab_ref(T,T1).
  739
  740elab_ref([def_rule(H,B,_Lits)|T],[rule(H1,B1)|T1]):-
  741  copy_term((H,B),(H1,B1)),
  742  numbervars((H1,B1),0,_N),
  743  elab_ref(T,T1).
  744
  745% insertion in the beam
  746insert_in_order([],C,BeamSize,[C]):-
  747  BeamSize>0,!.
  748
  749insert_in_order(Beam,_New,0,Beam):-!.
  750
  751insert_in_order([(Th1,Heuristic1)|RestBeamIn],(Th,Heuristic),BeamSize,BeamOut):-
  752  Heuristic>Heuristic1,!,
  753  % larger heuristic, insert here
  754  NewBeam=[(Th,Heuristic),(Th1,Heuristic1)|RestBeamIn],
  755  length(NewBeam,L),
  756  (L>BeamSize->
  757    nth1(L,NewBeam,_Last,BeamOut)
  758  ;
  759    BeamOut=NewBeam
  760  ).
  761
  762insert_in_order([(Th1,Heuristic1)|RestBeamIn],(Th,Heuristic),BeamSize,
  763[(Th1,Heuristic1)|RestBeamOut]):-
  764  BeamSize1 is BeamSize -1,
  765  insert_in_order(RestBeamIn,(Th,Heuristic),BeamSize1,
  766  RestBeamOut).
  767
  768
  769
  770remove_int_atom_list([],[]).
  771
  772remove_int_atom_list([\+ A|T],[\+ A1|T1]):-!,
  773  A=..[F,_|Arg],
  774  A1=..[F|Arg],
  775  remove_int_atom_list(T,T1).
  776
  777remove_int_atom_list([A|T],[A1|T1]):-
  778  A=..[F,_|Arg],
  779  A1=..[F|Arg],
  780  remove_int_atom_list(T,T1).
  781
  782
  783
  784remove_int_atom(\+ A,\+ A1):-!,
  785  A=..[F,_|T],
  786  A1=..[F|T].
  787
  788remove_int_atom(A,A1):-
  789  A=..[F,_|T],
  790  A1=..[F|T].
  791
  792
  793get_heads([],[]).
  794
  795get_heads([_-H|T],[H|TN]):-
  796
  797  get_heads(T,TN).
  798
  799derive_bdd_nodes([],_M,_ExData,_E,Nodes,Nodes,CLL,CLL).
  800
  801derive_bdd_nodes([H|T],M,ExData,E,Nodes0,Nodes,CLL0,CLL):-
  802  get_output_atoms(O,M),
  803  generate_goal(O,M,H,[],GL),
  804  (M:'$prob'(H,P)->
  805    CardEx is P*E
  806
  807  ;
  808    CardEx is 1.0
  809  ),
  810  init_ex(ExData,Env),
  811  one(Env,One),
  812  get_node_list(GL,M,Env,One,BDD,CardEx),
  813  ret_prob(Env,BDD,HP),
  814  (HP=:=0.0->
  815    setting_sc(logzero,LZ),
  816    CLL1 is CLL0+LZ*CardEx
  817  ;
  818    CLL1 is CLL0+log(HP)*CardEx
  819  ),
  820  end_ex(ExData),
  821  append(Nodes0,[[BDD,CardEx]],Nodes1),
  822  derive_bdd_nodes(T,M,ExData,E,Nodes1,Nodes,CLL1,CLL).
  823
  824
  825get_node_list([],_M,_Env,BDD,BDD,_CE).
  826
  827
  828get_node_list([H|T],M,Env,BDD0,BDD,CE):-
  829  get_node(H,M,Env,BDD1),
  830  and(Env,BDD0,BDD1,BDD2),
  831  get_node_list(T,M,Env,BDD2,BDD,CE).
  832
  833
  834derive_bdd_nodes_groupatoms_output_atoms([],_M,_ExData,_O,_E,_G,Nodes,Nodes,CLL,CLL,LE,LE).
  835
  836derive_bdd_nodes_groupatoms_output_atoms([H|T],M,ExData,O,E,G,Nodes0,Nodes,CLL0,CLL,LE0,LE):-
  837  generate_goal(O,M,H,[],GL),
  838  length(GL,NA),
  839  (M:'$prob'(H,P)->
  840    CardEx is P*E/NA
  841  ;
  842    CardEx is 1.0
  843  ),
  844  get_node_list_groupatoms(GL,M,ExData,BDDs,CardEx,G,CLL0,CLL1,LE0,LE1),
  845  append(Nodes0,BDDs,Nodes1),
  846  derive_bdd_nodes_groupatoms_output_atoms(T,M,ExData,O,E,G,Nodes1,Nodes,CLL1,CLL,LE1,LE).
  847
  848
  849derive_bdd_nodes_groupatoms([],_M,_ExData,_E,_G,Nodes,Nodes,CLL,CLL,LE,LE).
  850
  851derive_bdd_nodes_groupatoms([H|T],M,ExData,E,G,Nodes0,Nodes,CLL0,CLL,LE0,LE):-
  852  get_output_atoms(O,M),
  853  generate_goal(O,M,H,[],GL),
  854  length(GL,NA),
  855  (M:'$prob'(H,P)->
  856    CardEx is P*E/NA
  857  ;
  858    CardEx is 1.0
  859  ),
  860  get_node_list_groupatoms(GL,M,ExData,BDDs,CardEx,G,CLL0,CLL1,LE0,LE1),
  861  append(Nodes0,BDDs,Nodes1),
  862  derive_bdd_nodes_groupatoms(T,M,ExData,E,G,Nodes1,Nodes,CLL1,CLL,LE1,LE).
  863
  864get_node_list_groupatoms([],_M,_ExData,[],_CE,_Gmax,CLL,CLL,LE,LE).
  865
  866get_node_list_groupatoms([H|T],M,ExData,[[BDD,CE1]|BDDT],CE,Gmax,CLL0,CLL,LE0,LE):-
  867  init_ex(ExData,Env),
  868  one(Env,One),
  869  get_bdd_group([H|T],M,Env,T1,Gmax,G,One,BDD,CE,LE0,LE1),  %output:BDD,CLL
  870  CE1 is CE*(Gmax-G),
  871  ret_prob(Env,BDD,HP),
  872  end_ex(ExData),
  873  (HP =:=0.0->
  874    M:local_setting(logzero,LZ),
  875    CLL2 is CLL0+LZ*CE1
  876  ;
  877    CLL2 is CLL0+log(HP)*CE1
  878  ),
  879  get_node_list_groupatoms(T1,M,ExData,BDDT,CE,Gmax,CLL2,CLL,LE1,LE).
  880
  881
  882get_bdd_group([],_M,_Env,[],G,G,BDD,BDD,_CE,LE,LE):-!.
  883
  884get_bdd_group(T,_M,_Env,T,0,0,BDD,BDD,_CE,LE,LE):- !.
  885
  886get_bdd_group([H|T],M,Env,T1,Gmax,G1,BDD0,BDD,CE,[H|LE0],LE):-
  887  get_node(H,M,Env,BDD1),		%creates the BDD for atom H
  888  and(Env,BDD0,BDD1,BDD2),
  889  G is Gmax-1,
  890  get_bdd_group(T,M,Env,T1,G,G1,BDD2,BDD,CE,LE0,LE).
  891
  892get_arg(_-A,A).
  893
  894/* EM start */
  895random_restarts(0,_M,_ExData,_Nodes,Score,Score,Par,Par,_LE):-!.
  896
  897random_restarts(N,M,ExData,Nodes,Score0,Score,Par0,Par,LE):-
  898  M:local_setting(random_restarts_number,NMax),
  899  Num is NMax-N+1,
  900  format3(M,"Restart number ~d~n~n",[Num]),
  901  findall(R-Info,get_rule_info_rand(M,R-Info),L),
  902  keysort(L,LS),
  903  maplist(get_arg,LS,LS1),
  904  M:local_setting(epsilon_em,EA),
  905  M:local_setting(epsilon_em_fraction,ER),
  906  M:local_setting(iter,Iter),
  907  M:local_setting(alpha,Alpha),
  908  initial_values(ExData,Alpha),
  909  em(ExData,LS1,Nodes,EA,ER,Iter,CLL,Par1,ExP),
  910  score(M,LE,ExP,CLL,ScoreR),
  911  format3(M,"Random_restart: Score ~f~n",[ScoreR]),
  912  N1 is N-1,
  913  (ScoreR>Score0->
  914    random_restarts(N1,M,ExData,Nodes,ScoreR,Score,Par1,Par,LE)
  915  ;
  916    random_restarts(N1,M,ExData,Nodes,Score0,Score,Par0,Par,LE)
  917  ).
  918
  919random_restarts_ref(0,_M,_ExData,_Nodes,Score,Score,Par,Par,_LE):-!.
  920
  921random_restarts_ref(N,M,ExData,Nodes,Score0,Score,Par0,Par,LE):-
  922  M:local_setting(random_restarts_REFnumber,NMax),
  923  Num is NMax-N+1,
  924  format3(M,"Restart number ~d~n~n",[Num]),
  925  findall(R-Info,get_rule_info_rand(M,R-Info),L),
  926  keysort(L,LS),
  927  maplist(get_arg,LS,LS1),
  928  M:local_setting(epsilon_em,EA),
  929  M:local_setting(epsilon_em_fraction,ER),
  930  M:local_setting(iterREF,Iter),
  931  M:local_setting(alpha,Alpha),
  932  initial_values(ExData,Alpha),
  933  em(ExData,LS1,Nodes,EA,ER,Iter,CLLR,Par1,ExP),
  934  score(M,LE,ExP,CLLR,ScoreR),
  935  format3(M,"Random_restart: Score ~f~n",[ScoreR]),
  936  N1 is N-1,
  937  (ScoreR>Score0->
  938    random_restarts_ref(N1,M,ExData,Nodes,ScoreR,Score,Par1,Par,LE)
  939  ;
  940    random_restarts_ref(N1,M,ExData,Nodes,Score0,Score,Par0,Par,LE)
  941  ).
  942
  943
  944score(M,_LE,_ExP,CLL,CLL):-
  945  M:local_setting(score,ll),!.
  946
  947score(_M,LE,ExP,_CLL,Score):-
  948  compute_prob(LE,ExP,LPU,0,Pos,0,Neg),
  949  keysort(LPU,LPO),
  950  reverse(LPO,LP),
  951  compute_aucpr(LP,Pos,Neg,Score).
  952
  953
  954compute_prob([],[],[],Pos,Pos,Neg,Neg).
  955
  956compute_prob([\+ HE|TE],[HP|TP],[P- (\+ HE)|T],Pos0,Pos,Neg0,Neg):-!,
  957  P is 1.0-HP,
  958  Neg1 is Neg0+1,
  959  compute_prob(TE,TP,T,Pos0,Pos,Neg1,Neg).
  960
  961compute_prob([ HE|TE],[HP|TP],[HP-  HE|T],Pos0,Pos,Neg0,Neg):-
  962  Pos1 is Pos0+1,
  963  compute_prob(TE,TP,T,Pos1,Pos,Neg0,Neg).
  964
  965
  966compute_aucpr(L,Pos,Neg,A):-
  967  L=[P_0-E|TL],
  968  (E= (\+ _ )->
  969    FP=1,
  970    TP=0,
  971    FN=Pos,
  972    TN is Neg -1
  973  ;
  974    FP=0,
  975    TP=1,
  976    FN is Pos -1,
  977    TN=Neg
  978  ),
  979  compute_curve_points(TL,P_0,TP,FP,FN,TN,Points),
  980  Points=[R0-P0|_TPoints],
  981  (R0=:=0,P0=:=0->
  982    Flag=true
  983  ;
  984    Flag=false
  985  ),
  986  area(Points,Flag,Pos,0,0,0,A).
  987
  988compute_curve_points([],_P0,TP,FP,_FN,_TN,[1.0-Prec]):-!,
  989  Prec is TP/(TP+FP).
  990
  991compute_curve_points([P- (\+ _)|T],P0,TP,FP,FN,TN,Pr):-!,
  992  (P<P0->
  993    Prec is TP/(TP+FP),
  994    Rec is TP/(TP+FN),
  995    Pr=[Rec-Prec|Pr1],
  996    P1=P
  997  ;
  998    Pr=Pr1,
  999    P1=P0
 1000  ),
 1001  FP1 is FP+1,
 1002  TN1 is TN-1,
 1003  compute_curve_points(T,P1,TP,FP1,FN,TN1,Pr1).
 1004
 1005compute_curve_points([P- _|T],P0,TP,FP,FN,TN,Pr):-!,
 1006  (P<P0->
 1007    Prec is TP/(TP+FP),
 1008    Rec is TP/(TP+FN),
 1009    Pr=[Rec-Prec|Pr1],
 1010    P1=P
 1011  ;
 1012    Pr=Pr1,
 1013    P1=P0
 1014  ),
 1015  TP1 is TP+1,
 1016  FN1 is FN-1,
 1017  compute_curve_points(T,P1,TP1,FP,FN1,TN,Pr1).
 1018
 1019area([],_Flag,_Pos,_TPA,_FPA,A,A).
 1020
 1021area([R0-P0|T],Flag,Pos,TPA,FPA,A0,A):-
 1022 TPB is R0*Pos,
 1023  (TPB=:=0->
 1024    A1=A0,
 1025    FPB=0
 1026  ;
 1027    R_1 is TPA/Pos,
 1028    (TPA=:=0->
 1029      (Flag=false->
 1030        P_1=P0
 1031      ;
 1032        P_1=0.0
 1033      )
 1034    ;
 1035      P_1 is TPA/(TPA+FPA)
 1036    ),
 1037    FPB is TPB*(1.0-P0)/P0,
 1038    N is TPB-TPA+0.5,
 1039    interpolate(1,N,Pos,R_1,P_1,TPA,FPA,TPB,FPB,A0,A1)
 1040  ),
 1041  area(T,Flag,Pos,TPB,FPB,A1,A).
 1042
 1043interpolate(I,N,_Pos,_R0,_P0,_TPA,_FPA,_TPB,_FPB,A,A):-I>N,!.
 1044
 1045interpolate(I,N,Pos,R0,P0,TPA,FPA,TPB,FPB,A0,A):-
 1046  R is (TPA+I)/Pos,
 1047  P is (TPA+I)/(TPA+I+FPA+(FPB-FPA)/(TPB-TPA)*I),
 1048  A1 is A0+(R-R0)*(P+P0)/2,
 1049  I1 is I+1,
 1050  interpolate(I1,N,Pos,R,P,TPA,FPA,TPB,FPB,A1,A).
 1051
 1052
 1053
 1054update_head([],[],_N,[]):-!.
 1055
 1056update_head([H:_P|T],[PU|TP],N,[H:P|T1]):-
 1057  P is PU/N,
 1058  update_head(T,TP,N,T1).
 1059
 1060
 1061/* EM end */
 1062
 1063
 1064/* utilities */
 rules2terms(:R:list_of_rules, -T:tern) is det
The predicate translates a list of rules from the internal representation format (rule/4 and def_rule/3) to the LPAD syntax. /
 1072rules2terms(R,T):-
 1073  maplist(rule2term,R,T).
 1074
 1075rule2term(rule(_N,HL,BL,_Lit,_Tun),(H:-B)):-
 1076  list2or(HL,H),
 1077  list2and(BL,B).
 1078
 1079rule2term(def_rule(H,BL,_Lit),((H:1.0):-B)):-
 1080  list2and(BL,B).
 1081
 1082
 1083write_rules([],_S).
 1084
 1085write_rules([rule(_N,HL,BL,Lit,_Tun)|T],S):-!,
 1086  copy_term((HL,BL,Lit),(HL1,BL1,Lit1)),
 1087  numbervars((HL1,BL1,Lit1),0,_M),
 1088  write_disj_clause(S,(HL1:-BL1)),
 1089  write_rules(T,S).
 1090
 1091write_rules([def_rule(H,BL,Lit)|T],S):-
 1092  copy_term((H,BL,Lit),(H1,BL1,Lit1)),
 1093  numbervars((H1,BL1,Lit1),0,_M),
 1094  write_disj_clause(S,([H1:1.0]:-BL1)),
 1095  write_rules(T,S).
 1096
 1097
 1098new_par([],[],[]).
 1099
 1100new_par([HP|TP],[Head:_|TO],[Head:HP|TN]):-
 1101  new_par(TP,TO,TN).
 1102
 1103
 1104
 1105write_disj_clause(S,(H:-[])):-!,
 1106  write_head(S,H),
 1107  format(S,".~n~n",[]).
 1108
 1109write_disj_clause(S,(H:-B)):-
 1110  write_head(S,H),
 1111  format(S,' :-',[]),
 1112  nl(S),
 1113  write_body(S,B).
 1114
 1115
 1116write_head(S,[A:1.0|_Rest]):-!,
 1117  format(S,"~q:1.0",[A]).
 1118
 1119write_head(S,[A:P,'':_P]):-!,
 1120  format(S,"~q:~g",[A,P]).
 1121
 1122write_head(S,[A:P]):-!,
 1123  format(S,"~q:~g",[A,P]).
 1124
 1125write_head(S,[A:P|Rest]):-
 1126  format(S,"~q:~g ; ",[A,P]),
 1127  write_head(S,Rest).
 1128
 1129write_body(S,[]):-!,
 1130  format(S,"  true.~n~n",[]).
 1131
 1132write_body(S,[A]):-!,
 1133  format(S,"  ~q.~n~n",[A]).
 1134
 1135write_body(S,[A|T]):-
 1136  format(S,"  ~q,~n",[A]),
 1137  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 /
 1146list2or([],true):-!.
 1147
 1148list2or([X],X):-
 1149    X\=;(_,_),!.
 1150
 1151list2or([H|T],(H ; Ta)):-!,
 1152    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 /
 1162list2and([],true):-!.
 1163
 1164list2and([X],X):-
 1165    X\=(_,_),!.
 1166
 1167list2and([H|T],(H,Ta)):-!,
 1168    list2and(T,Ta).
 1169
 1170
 1171deduct(0,_Mod,_DB,Th,Th):-!.
 1172
 1173deduct(NM,Mod,DB,InTheory0,InTheory):-
 1174  get_head_atoms(O,Mod),
 1175  sample(1,DB,Sampled,DB1),
 1176  (Sampled=[M]->
 1177    generate_head(O,M,Mod,[],HL),
 1178    NM1 is NM-1,
 1179    ( HL \== [] ->
 1180       (generate_body(HL,Mod,InTheory1),
 1181	append(InTheory0,InTheory1,InTheory2),
 1182	deduct(NM1,Mod,DB1,InTheory2,InTheory)
 1183       )
 1184      ;
 1185       deduct(NM1,Mod,DB1,InTheory0,InTheory)
 1186    )
 1187  ;
 1188    InTheory=InTheory0
 1189  ).
 1190
 1191
 1192get_head_atoms(O,M):-
 1193  findall(A,M:modeh(_,A),O0),
 1194  findall((A,B,D),M:modeh(_,A,B,D),O1),
 1195  append(O0,O1,O).
 1196
 1197generate_top_cl([],_M,[]):-!.
 1198
 1199generate_top_cl([A|T],M,[(rule(R,[A1:0.5,'':0.5],[],true,tunable),-1e20)|TR]):-
 1200  A=..[F|ArgM],
 1201  keep_const(ArgM,Arg),
 1202  A1=..[F|Arg],
 1203  get_next_rule_number(M,R),
 1204  generate_top_cl(T,M,TR).
 1205
 1206
 1207generate_head([],_M,_Mod,HL,HL):-!.
 1208
 1209generate_head([(A,G,D)|T],M,Mod,H0,H1):-!,
 1210  generate_head_goal(G,M,Goals),
 1211  findall((A,Goals,D),(member(Goal,Goals),call(Mod:Goal),ground(Goals)),L),
 1212  Mod:local_setting(initial_clauses_per_megaex,IC),   %IC: represents how many samples are extracted from the list L of example
 1213  sample(IC,L,L1),
 1214  append(H0,L1,H2),
 1215  generate_head(T,M,Mod,H2,H1).
 1216
 1217generate_head([A|T],M,Mod,H0,H1):-
 1218  functor(A,F,N),
 1219  functor(F1,F,N),
 1220  F1=..[F|Arg],
 1221  Pred1=..[F,M|Arg],
 1222  A=..[F|ArgM],
 1223  keep_const(ArgM,Arg),
 1224  findall((A,Pred1),call(Mod:Pred1),L),
 1225  Mod:local_setting(initial_clauses_per_megaex,IC),
 1226  sample(IC,L,L1),
 1227  append(H0,L1,H2),
 1228  generate_head(T,M,Mod,H2,H1).
 1229
 1230generate_head_goal([],_M,[]).
 1231
 1232generate_head_goal([H|T],M,[H1|T1]):-
 1233  H=..[F|Arg],
 1234  H1=..[F,M|Arg],
 1235  generate_head_goal(T,M,T1).
 1236
 1237keep_const([],[]).
 1238
 1239keep_const([- _|T],[_|T1]):-!,
 1240  keep_const(T,T1).
 1241
 1242keep_const([+ _|T],[_|T1]):-!,
 1243  keep_const(T,T1).
 1244
 1245keep_const([-# _|T],[_|T1]):-!,
 1246  keep_const(T,T1).
 1247
 1248keep_const([H|T],[H1|T1]):-
 1249  H=..[F|Args],
 1250  keep_const(Args,Args1),
 1251  H1=..[F|Args1],
 1252  keep_const(T,T1).
 sample(+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 []. */
 1263sample(0,List,[],List):-!.
 1264
 1265sample(N,List,List,[]):-
 1266  length(List,L),
 1267  L=<N,!.
 1268
 1269sample(N,List,[El|List1],Li):-
 1270  length(List,L),
 1271  random(0,L,Pos),
 1272  nth0(Pos,List,El,Rest),
 1273  N1 is N-1,
 1274  sample(N1,Rest,List1,Li).
 1275
 1276sample(0,_List,[]):-!.
 1277
 1278sample(N,List,List):-
 1279  length(List,L),
 1280  L=<N,!.
 1281
 1282sample(N,List,[El|List1]):-
 1283  length(List,L),
 1284  random(0,L,Pos),
 1285  nth0(Pos,List,El,Rest),
 1286  N1 is N-1,
 1287  sample(N1,Rest,List1).
 1288
 1289get_args([],[],[],A,A,AT,AT,_).
 1290
 1291get_args([HM|TM],[H|TH],[(H,HM)|TP],A0,A,AT0,AT,M):-
 1292  HM=..[F|ArgsTypes],
 1293  H=..[F,M|Args],
 1294  append(A0,Args,A1),
 1295  append(AT0,ArgsTypes,AT1),
 1296  get_args(TM,TH,TP,A1,A,AT1,AT,M).
 1297
 1298/* Generation of the bottom clauses */
 1299
 1300gen_head([],P,['':P]).
 1301
 1302gen_head([H|T],P,[H:P|TH]):-
 1303  gen_head(T,P,TH).
 1304
 1305get_modeb([],_Mod,B,B).
 1306
 1307get_modeb([F/AA|T],Mod,B0,B):-
 1308  findall((R,B),(Mod:modeb(R,B),functor(B,F,AA)),BL),
 1309  (Mod:local_setting(neg_literals,true)->
 1310    findall((R,(\+ B)),(Mod:modeb(R,B),functor(B,F,AA),all_plus(B)),BNL)
 1311  ;
 1312    BNL=[]
 1313  ),
 1314  append([B0,BL,BNL],B1),
 1315  get_modeb(T,Mod,B1,B).
 1316
 1317all_plus(B):-
 1318  B=..[_|Args],
 1319  all_plus_args(Args).
 1320
 1321all_plus_args([]).
 1322
 1323all_plus_args([+ _ |T]):-!,
 1324  all_plus_args(T).
 1325
 1326all_plus_args([H|T]):-
 1327  H \= - _,
 1328  H \= # _,
 1329  H \= -# _,
 1330  H=..[_|Args],
 1331  all_plus_args(Args),
 1332  all_plus_args(T).
 generate_body(+ModeDecs:list, +Module:atom, -BottomClauses:list) is det
Generates the body of bottom clauses and returns the bottom clauses in BottomClauses.

/

 1339generate_body([],_Mod,[]):-!.
 1340
 1341generate_body([(A,H,Det)|T],Mod,[(rule(R,HP,[],BodyList,tunable),-1e20)|CL0]):-!,
 1342  get_modeb(Det,Mod,[],BL),
 1343  get_args(A,H,Pairs,[],Args,[],ArgsTypes,M),
 1344  Mod:local_setting(d,D),
 1345  cycle_modeb(ArgsTypes,Args,[],[],Mod,BL,a,[],BLout0,D,M),
 1346  variabilize((Pairs:-BLout0),CLV),  %+(Head):-Bodylist;  -CLV:(Head):-Bodylist with variables _num in place of constants
 1347  CLV=(Head1:-BodyList1),
 1348  remove_int_atom_list(Head1,Head),
 1349  remove_int_atom_list(BodyList1,BodyList2),
 1350  remove_duplicates(BodyList2,BodyList),
 1351  get_next_rule_number(Mod,R),
 1352  length(Head,LH),
 1353  Prob is 1.0/(LH+1),
 1354  gen_head(Head,Prob,HP),
 1355  copy_term((HP,BodyList),(HeadV,BodyListV)),
 1356  numbervars((HeadV,BodyListV),0,_V),
 1357  format2(Mod,"Bottom clause: example ~q~nClause~n",[H]),
 1358  write_disj_clause2(Mod,user_output,(HeadV:-BodyListV)),
 1359  generate_body(T,Mod,CL0).
 1360
 1361generate_body([(A,H)|T],Mod,[(rule(R,[Head:0.5,'':0.5],[],BodyList,tunable),-1e20)|CL0]):-
 1362  functor(A,F,AA),
 1363  findall(FB/AB,Mod:determination(F/AA,FB/AB),Det),
 1364  get_modeb(Det,Mod,[],BL),
 1365  A=..[F|ArgsTypes],
 1366  H=..[F,M|Args],
 1367  Mod:local_setting(d,D),
 1368  cycle_modeb(ArgsTypes,Args,[],[],Mod,BL,a,[],BLout0,D,M),
 1369  variabilize(([(H,A)]:-BLout0),CLV),  %+(Head):-Bodylist;  -CLV:(Head):-Bodylist with variables _num in place of constants
 1370  CLV=([Head1]:-BodyList1),
 1371  remove_int_atom(Head1,Head),
 1372  remove_int_atom_list(BodyList1,BodyList2),
 1373  remove_duplicates(BodyList2,BodyList),
 1374  get_next_rule_number(Mod,R),
 1375  copy_term((Head,BodyList),(HeadV,BodyListV)),
 1376  numbervars((HeadV,BodyListV),0,_V),
 1377  format2(Mod,"Bottom clause: example ~q~nClause~n~q:0.5 :-~n",[H,HeadV]),
 1378  write_body2(Mod,user_output,BodyListV),
 1379  generate_body(T,Mod,CL0).
 1380
 1381
 1382variabilize((H:-B),(H1:-B1)):-
 1383  variabilize_list(H,H1,[],AS,M),
 1384  variabilize_list(B,B1,AS,_AS,M).
 1385
 1386
 1387variabilize_list([],[],A,A,_M).
 1388
 1389variabilize_list([(\+ H,Mode)|T],[\+ H1|T1],A0,A,M):-
 1390  builtin(H),!,
 1391  H=..[F|Args],
 1392  Mode=..[F|ArgTypes],
 1393  variabilize_args(Args,ArgTypes, Args1,A0,A1),
 1394  H1=..[F,M|Args1],
 1395  variabilize_list(T,T1,A1,A,M).
 1396
 1397variabilize_list([(\+ H,Mode)|T],[\+ H1|T1],A0,A,M):-!,
 1398  H=..[F,_M|Args],
 1399  Mode=..[F|ArgTypes],
 1400  variabilize_args(Args,ArgTypes, Args1,A0,A1),
 1401  H1=..[F,M|Args1],
 1402  variabilize_list(T,T1,A1,A,M).
 1403
 1404variabilize_list([(H,Mode)|T],[H1|T1],A0,A,M):-
 1405  builtin(H),!,
 1406  H=..[F|Args],
 1407  Mode=..[F|ArgTypes],
 1408  variabilize_args(Args,ArgTypes, Args1,A0,A1),
 1409  H1=..[F,M|Args1],
 1410  variabilize_list(T,T1,A1,A,M).
 1411
 1412variabilize_list([(H,Mode)|T],[H1|T1],A0,A,M):-
 1413  H=..[F,_M|Args],
 1414  Mode=..[F|ArgTypes],
 1415  variabilize_args(Args,ArgTypes, Args1,A0,A1),
 1416  H1=..[F,M|Args1],
 1417  variabilize_list(T,T1,A1,A,M).
 1418
 1419
 1420variabilize_args([],[],[],A,A).
 1421
 1422variabilize_args([C|T],[C|TT],[C|TV],A0,A):-!,
 1423  variabilize_args(T,TT,TV,A0,A).
 1424
 1425variabilize_args([C|T],[# _Ty|TT],[C|TV],A0,A):-!,
 1426  variabilize_args(T,TT,TV,A0,A).
 1427
 1428variabilize_args([C|T],[-# _Ty|TT],[C|TV],A0,A):-!,
 1429  variabilize_args(T,TT,TV,A0,A).
 1430
 1431variabilize_args([C|T],[Ty|TT],[V|TV],A0,A):-
 1432  (Ty = +Ty1;Ty = -Ty1),
 1433  member(C/Ty1/V,A0),!,
 1434  variabilize_args(T,TT,TV,A0,A).
 1435
 1436variabilize_args([C|T],[Ty|TT],[V|TV],A0,A):-
 1437  (Ty = +Ty1;Ty = -Ty1),!,
 1438  variabilize_args(T,TT,TV,[C/Ty1/V|A0],A).
 1439
 1440variabilize_args([C|T],[Ty|TT],[V|TV],A0,A):-
 1441  compound(C),
 1442  C=..[F|Args],
 1443  Ty=..[F|ArgsT],
 1444  variabilize_args(Args,ArgsT,ArgsV,A0,A1),
 1445  V=..[F|ArgsV],
 1446  variabilize_args(T,TT,TV,A1,A).
 1447
 1448
 1449cycle_modeb(ArgsTypes,Args,ArgsTypes,Args,_Mod,_BL,L,L,L,_,_M):-!.
 1450
 1451cycle_modeb(_ArgsTypes,_Args,_ArgsTypes1,_Args1,_Mod,_BL,_L,L,L,0,_M):-!.
 1452
 1453cycle_modeb(ArgsTypes,Args,_ArgsTypes0,_Args0,Mod,BL,_L0,L1,L,D,M):-
 1454  find_atoms(BL,Mod,ArgsTypes,Args,ArgsTypes1,Args1,L1,L2,M),
 1455  D1 is D-1,
 1456  cycle_modeb(ArgsTypes1,Args1,ArgsTypes,Args,Mod,BL,L1,L2,L,D1,M).
 1457
 1458
 1459find_atoms([],_Mod,ArgsTypes,Args,ArgsTypes,Args,L,L,_M).
 1460
 1461find_atoms([(R,\+ H)|T],Mod,ArgsTypes0,Args0,ArgsTypes,Args,L0,L1,M):-!,
 1462  H=..[F|ArgsT],
 1463  findall((A,H),instantiate_query_neg(ArgsT,ArgsTypes0,Args0,F,M,A),L),
 1464  call_atoms(L,Mod,[],At),
 1465  remove_duplicates(At,At1),
 1466  ((R = '*' ) ->
 1467    R1= +1e20
 1468  ;
 1469    R1=R
 1470  ),
 1471  sample(R1,At1,At2),
 1472  append(L0,At2,L2),
 1473  find_atoms(T,Mod,ArgsTypes0,Args0,ArgsTypes,Args,L2,L1,M).
 1474
 1475find_atoms([(R,H)|T],Mod,ArgsTypes0,Args0,ArgsTypes,Args,L0,L1,M):-
 1476  H=..[F|ArgsT],
 1477  findall((A,H),instantiate_query(ArgsT,ArgsTypes0,Args0,F,M,A),L),
 1478  call_atoms(L,Mod,[],At),
 1479  remove_duplicates(At,At1),
 1480  ((R = '*' ) ->
 1481    R1= +1e20
 1482  ;
 1483    R1=R
 1484  ),
 1485  sample(R1,At1,At2),
 1486  extract_output_args(At2,ArgsT,ArgsTypes0,Args0,ArgsTypes1,Args1),
 1487  append(L0,At2,L2),
 1488  find_atoms(T,Mod,ArgsTypes1,Args1,ArgsTypes,Args,L2,L1,M).
 1489
 1490
 1491call_atoms([],_Mod,A,A).
 1492
 1493call_atoms([(H,M)|T],Mod,A0,A):-
 1494  findall((H,M),Mod:H,L),
 1495  append(A0,L,A1),
 1496  call_atoms(T,Mod,A1,A).
 1497
 1498
 1499extract_output_args([],_ArgsT,ArgsTypes,Args,ArgsTypes,Args).
 1500
 1501extract_output_args([(H,_At)|T],ArgsT,ArgsTypes0,Args0,ArgsTypes,Args):-
 1502  builtin(H),!,
 1503  H=..[_F|ArgsH],
 1504  add_const(ArgsH,ArgsT,ArgsTypes0,Args0,ArgsTypes1,Args1),
 1505  extract_output_args(T,ArgsT,ArgsTypes1,Args1,ArgsTypes,Args).
 1506
 1507extract_output_args([(H,_At)|T],ArgsT,ArgsTypes0,Args0,ArgsTypes,Args):-
 1508  H=..[_F,_M|ArgsH],
 1509  add_const(ArgsH,ArgsT,ArgsTypes0,Args0,ArgsTypes1,Args1),
 1510  extract_output_args(T,ArgsT,ArgsTypes1,Args1,ArgsTypes,Args).
 1511
 1512
 1513add_const([],[],ArgsTypes,Args,ArgsTypes,Args).
 1514
 1515add_const([_A|T],[+_T|TT],ArgsTypes0,Args0,ArgsTypes,Args):-!,
 1516  add_const(T,TT,ArgsTypes0,Args0,ArgsTypes,Args).
 1517
 1518add_const([A|T],[-Type|TT],ArgsTypes0,Args0,ArgsTypes,Args):-!,
 1519  (already_present(ArgsTypes0,Args0,A,Type)->
 1520    ArgsTypes1=ArgsTypes0,
 1521    Args1=Args0
 1522  ;
 1523    ArgsTypes1=[+Type|ArgsTypes0],
 1524    Args1=[A|Args0]
 1525  ),
 1526  add_const(T,TT,ArgsTypes1,Args1,ArgsTypes,Args).
 1527
 1528add_const([A|T],[-# Type|TT],ArgsTypes0,Args0,ArgsTypes,Args):-!,
 1529  (already_present(ArgsTypes0,Args0,A,Type)->
 1530    ArgsTypes1=ArgsTypes0,
 1531    Args1=Args0
 1532  ;
 1533    ArgsTypes1=[+Type|ArgsTypes0],
 1534    Args1=[A|Args0]
 1535  ),
 1536  add_const(T,TT,ArgsTypes1,Args1,ArgsTypes,Args).
 1537
 1538add_const([_A|T],[# _|TT],ArgsTypes0,Args0,ArgsTypes,Args):-!,
 1539  add_const(T,TT,ArgsTypes0,Args0,ArgsTypes,Args).
 1540
 1541add_const([A|T],[A|TT],ArgsTypes0,Args0,ArgsTypes,Args):-
 1542  atomic(A),!,
 1543  add_const(T,TT,ArgsTypes0,Args0,ArgsTypes,Args).
 1544
 1545add_const([A|T],[AT|TT],ArgsTypes0,Args0,ArgsTypes,Args):-
 1546  A=..[F|Ar],
 1547  AT=..[F|ArT],
 1548  add_const(Ar,ArT,ArgsTypes0,Args0,ArgsTypes1,Args1),
 1549  add_const(T,TT,ArgsTypes1,Args1,ArgsTypes,Args).
 1550
 1551
 1552already_present([+T|_TT],[C|_TC],C,T):-!.
 1553
 1554already_present([_|TT],[_|TC],C,T):-
 1555  already_present(TT,TC,C,T).
 1556
 1557
 1558instantiate_query_neg(ArgsT,ArgsTypes,Args,F,M,A):-
 1559  instantiate_input(ArgsT,ArgsTypes,Args,ArgsB),
 1560  A1=..[F|ArgsB],
 1561  (builtin(A1)->
 1562    A= (\+ A1)
 1563  ;
 1564    A0=..[F,M|ArgsB],
 1565    A = (\+ A0)
 1566  ).
 1567
 1568instantiate_query(ArgsT,ArgsTypes,Args,F,M,A):-
 1569  instantiate_input(ArgsT,ArgsTypes,Args,ArgsB),
 1570  A1=..[F|ArgsB],
 1571  (builtin(A1)->
 1572    A=A1
 1573  ;
 1574    A=..[F,M|ArgsB]
 1575  ).
 1576
 1577
 1578instantiate_input([],_AT,_A,[]).
 1579
 1580instantiate_input([-_Type|T],AT,A,[_V|TA]):-!,
 1581  instantiate_input(T,AT,A,TA).
 1582
 1583instantiate_input([+Type|T],AT,A,[H|TA]):-!,
 1584  find_val(AT,A,+Type,H),
 1585  instantiate_input(T,AT,A,TA).
 1586
 1587instantiate_input([# Type|T],AT,A,[H|TA]):-!,
 1588  find_val(AT,A,+Type,H),
 1589  instantiate_input(T,AT,A,TA).
 1590
 1591instantiate_input([-# _Type|T],AT,A,[_V|TA]):-!,
 1592  instantiate_input(T,AT,A,TA).
 1593
 1594instantiate_input([C|T],AT,A,[C1|TA]):-
 1595  C=..[F|Args],
 1596  instantiate_input(Args,AT,A,Args1),
 1597  C1=..[F|Args1],
 1598  instantiate_input(T,AT,A,TA).
 1599
 1600
 1601find_val([T|_TT],[A|_TA],T,A).
 1602
 1603find_val([HT|_TT],[HA|_TA],T,A):-
 1604  nonvar(HA),
 1605  HT=..[F|ArgsT],
 1606  HA=..[F|Args],
 1607  find_val(ArgsT,Args,T,A).
 1608
 1609find_val([_T|TT],[_A|TA],T,A):-
 1610  find_val(TT,TA,T,A).
 1611
 1612
 1613get_output_atoms(O,M):-
 1614  findall((A/Ar),M:output((A/Ar)),O).
 1615
 1616generate_goal(LP,M,H,[],LG):-
 1617  M:local_setting(neg_ex,given),!,
 1618  find_ex_pred(LP,M,[H],[],LG,0,_Pos,0,_Neg).
 1619
 1620generate_goal(LP,M,H,[],LG):-
 1621  M:local_setting(neg_ex,cw),
 1622  (M:modeh(_,_)->
 1623    true
 1624  ;
 1625    throw(missing_mode_declarations)
 1626  ),
 1627  find_ex_pred_cw(LP,M,[H],[],LG,0,_Pos,0,_Neg).
 remove_duplicates(+List1:list, -List2:list) is det
Removes duplicates from List1. Equality is checked with ==. /
 1635remove_duplicates(L0,L):-
 1636  remove_duplicates(L0,[],L1),
 1637  reverse(L1,L).
 1638
 1639remove_duplicates([],L,L).
 1640
 1641remove_duplicates([H|T],L0,L):-
 1642  member_eq(H,L0),!,
 1643  remove_duplicates(T,L0,L).
 1644
 1645remove_duplicates([H|T],L0,L):-
 1646  remove_duplicates(T,[H|L0],L).
 1647
 1648
 1649/*
 1650
 1651EMBLEM and SLIPCASE
 1652
 1653Copyright (c) 2011, Fabrizio Riguzzi, Nicola di Mauro and Elena Bellodi
 1654
 1655*/
 1656
 1657
 1658specialize_rule(Rule,M,_SpecRule,_Lit):-
 1659  M:local_setting(max_body_length,ML),
 1660  Rule = rule(_ID,_LH,BL,_Lits,_Tun),
 1661  length(BL,L),
 1662  L=ML,!,
 1663  fail.
 1664
 1665%used by cycle_clauses in slipcover.pl
 1666specialize_rule(Rule,M,SpecRule,Lit):-
 1667  M:local_setting(specialization,bottom),
 1668  Rule = rule(ID,LH,BL,Lits,Tun),
 1669  delete_one(Lits,RLits,Lit),
 1670  \+ M:lookahead_cons(Lit,_),
 1671  \+ M:lookahead_cons_var(Lit,_),
 1672  \+ member_eq(Lit,BL),
 1673  append(BL,[Lit],BL1),
 1674  remove_prob(LH,LH1),
 1675  delete(LH1,'',LH2),
 1676  append(LH2,BL1,ALL2),
 1677  dv(LH2,BL1,M,DList),	%-DList: list of couples (variable,depth)
 1678  extract_fancy_vars(ALL2,Vars1),
 1679  length(Vars1,NV),
 1680  M:local_setting(max_var,MV),
 1681  NV=<MV,
 1682  linked_clause(BL1,M,LH2),
 1683  M:local_setting(maxdepth_var,MD),
 1684  exceed_depth(DList,MD),
 1685  \+ banned_clause(M,LH2,BL1),
 1686  SpecRule=rule(ID,LH,BL1,RLits,Tun).
 1687
 1688specialize_rule(Rule,M,SpecRule,Lit):-
 1689  M:local_setting(specialization,bottom),
 1690  Rule = rule(ID,LH,BL,Lits,Tun),
 1691  delete_one(Lits,RLits,Lit),
 1692  \+ member_eq(Lit,BL),
 1693  append(BL,[Lit],BL0),
 1694  \+M:lookahead_cons_var(Lit,_),
 1695  (M:lookahead(Lit,LLit1);M:lookahead_cons(Lit,LLit1)),
 1696  copy_term(LLit1,LLit2),
 1697  specialize_rule_la_bot(LLit2,RLits,RLits1,BL0,BL1),
 1698  remove_prob(LH,LH1),
 1699  delete(LH1,'',LH2),
 1700  append(LH2,BL1,ALL2),
 1701  dv(LH2,BL1,M,DList),
 1702  extract_fancy_vars(ALL2,Vars1),
 1703  length(Vars1,NV),
 1704  M:local_setting(max_var,MV),
 1705  NV=<MV,
 1706  linked_clause(BL1,M,LH2),
 1707  M:local_setting(maxdepth_var,MD),
 1708  exceed_depth(DList,MD),
 1709  \+ banned_clause(M,LH2,BL1),
 1710  SpecRule=rule(ID,LH,BL1,RLits1,Tun).
 1711
 1712specialize_rule(Rule,M,SpecRule,Lit):-
 1713  M:local_setting(specialization,bottom),
 1714  Rule = rule(ID,LH,BL,Lits,Tun),
 1715  delete_one(Lits,RLits,Lit),
 1716  \+ member_eq(Lit,BL),
 1717  append(BL,[Lit],BL0),
 1718  M:lookahead_cons_var(Lit,LLit2),
 1719  specialize_rule_la_bot(LLit2,RLits,_RLits1,BL0,BL1),
 1720  remove_prob(LH,LH1),
 1721  delete(LH1,'',LH2),
 1722  append(LH2,BL1,ALL2),
 1723  dv(LH2,BL1,M,DList),
 1724  extract_fancy_vars(ALL2,Vars1),
 1725  length(Vars1,NV),
 1726  M:local_setting(max_var,MV),
 1727  NV=<MV,
 1728  linked_clause(BL1,M,LH2),
 1729  M:local_setting(maxdepth_var,MD),
 1730  exceed_depth(DList,MD),
 1731  \+ banned_clause(M,LH2,BL1),
 1732  SpecRule=rule(ID,LH,BL1,[],Tun).
 1733
 1734specialize_rule(Rule,M,SpecRule,Lit):-
 1735  M:local_setting(specialization,mode),%!,
 1736  findall(BL , M:modeb(_,BL), BLS),
 1737  specialize_rule(BLS,Rule,M,SpecRule,Lit).
 1738
 1739%specializes the clause head
 1740specialize_rule(rule(ID,LH,BL,Lits,Tun),M,rule(ID,LH2,BL,Lits,Tun),Lit):-
 1741  M:local_setting(specialize_head,true),
 1742	length(LH,L),
 1743	L>2,
 1744	delete_one(LH,LH1,Lit),  %deletes Lit
 1745	Lit\='',
 1746	update_head1(LH1,L-1,LH2).  %updates parameters
 1747
 1748update_head1([],_N,[]):-!.
 1749
 1750update_head1([H:_P|T],N,[H:P|T1]):-
 1751	       P is 1/N,
 1752	       update_head1(T,N,T1).
 banned_clause(+Module:atom, -Head:term, -Body:term) is nondet
The predicate checks whether Head:-Body is a banned clause, as specified by the user in the input file. Module is the module of the input file. /
 1760banned_clause(M,H,B):-
 1761  numbervars((H,B),0,_N),
 1762  M:banned(H2,B2),
 1763  mysublist(H2,H),
 1764  mysublist(B2,B).
 1765
 1766
 1767mysublist([],_).
 1768
 1769mysublist([H|T],L):-
 1770  member(H,L),
 1771  mysublist(T,L).
 1772
 1773
 1774specialize_rule([Lit|_RLit],Rule,M,SpecRul,SLit):-
 1775  Rule = rule(ID,LH,BL,true,Tun),
 1776  remove_prob(LH,LH1),
 1777  append(LH1,BL,ALL),
 1778  specialize_rule1(Lit,M,ALL,SLit),
 1779  append(BL,[SLit],BL1),
 1780  (M:lookahead(SLit,LLit1);M:lookahead_cons(SLit,LLit1)),
 1781  specialize_rule_la(LLit1,M,LH1,BL1,BL2),
 1782  append(LH1,BL2,ALL2),
 1783  extract_fancy_vars(ALL2,Vars1),
 1784  length(Vars1,NV),
 1785  M:local_setting(max_var,MV),
 1786  NV=<MV,
 1787  SpecRul = rule(ID,LH,BL2,true,Tun).
 1788
 1789specialize_rule([Lit|_RLit],Rule,M,SpecRul,SLit):-
 1790  Rule = rule(ID,LH,BL,true,Tun),
 1791  remove_prob(LH,LH1),
 1792  append(LH1,BL,ALL),
 1793  specialize_rule1(Lit,M,ALL,SLit),
 1794  \+ M:lookahead_cons(SLit,_),
 1795  append(BL,[SLit],BL1),
 1796  append(LH1,BL1,ALL1),
 1797  extract_fancy_vars(ALL1,Vars1),
 1798  length(Vars1,NV),
 1799  M:local_setting(max_var,MV),
 1800  NV=<MV,
 1801  SpecRul = rule(ID,LH,BL1,true,Tun).
 1802
 1803specialize_rule([_|RLit],Rule,M,SpecRul,Lit):-
 1804  specialize_rule(RLit,Rule,M,SpecRul,Lit).
 1805
 1806
 1807specialize_rule_la([],_M,_LH1,BL1,BL1).
 1808
 1809specialize_rule_la([Lit1|T],M,LH1,BL1,BL3):-
 1810  copy_term(Lit1,Lit2),
 1811  M:modeb(_,Lit2),
 1812  append(LH1,BL1,ALL1),
 1813  specialize_rule1(Lit2,M,ALL1,SLit1),
 1814  append(BL1,[SLit1],BL2),
 1815  specialize_rule_la(T,M,LH1,BL2,BL3).
 1816
 1817
 1818specialize_rule_la_bot([],Bot,Bot,BL,BL).
 1819
 1820specialize_rule_la_bot([Lit|T],Bot0,Bot,BL1,BL3):-
 1821  delete_one(Bot0,Bot1,Lit),
 1822  \+ member_eq(Lit,BL1),
 1823  append(BL1,[Lit],BL2),
 1824  specialize_rule_la_bot(T,Bot1,Bot,BL2,BL3).
 1825
 1826
 1827remove_prob(['':_P],[]):-!.
 1828
 1829remove_prob([X:_|R],[X|R1]):-
 1830  remove_prob(R,R1).
 1831
 1832
 1833specialize_rule1(Lit,M,Lits,SpecLit):-
 1834  Lit =.. [Pred|Args],
 1835  extract_type_vars(Lits,M,TypeVars0),
 1836  remove_duplicates(TypeVars0,TypeVars),
 1837  take_var_args(Args,TypeVars,Args1),
 1838  SpecLit =.. [Pred|Args1],
 1839  \+ member_eq(SpecLit,Lits).
 1840
 1841
 1842convert_to_input_vars([],[]):-!.
 1843
 1844convert_to_input_vars([+T|RT],[+T|RT1]):-
 1845  !,
 1846  convert_to_input_vars(RT,RT1).
 1847
 1848convert_to_input_vars([-T|RT],[+T|RT1]):-
 1849  convert_to_input_vars(RT,RT1).
 1850
 1851
 1852
 1853remove_eq(X,[Y|R],R):-
 1854  X == Y,
 1855  !.
 1856
 1857remove_eq(X,[_|R],R1):-
 1858  remove_eq(X,R,R1).
 linked_clause(+Literals:list, +Module:atom, +PrevLits:list) is det
The predicate checks whether Literals form a linked list of literals given that PrevLits are the previous literals. In a linked list of literals input variables of a literal are output variables in a previous literal. /
 1869linked_clause([],_M,_).
 1870
 1871linked_clause([L|R],M,PrevLits):-
 1872  term_variables(PrevLits,PrevVars),
 1873  input_variables(L,M,InputVars),
 1874  linked(InputVars,PrevVars),!,
 1875  linked_clause(R,M,[L|PrevLits]).
 1876
 1877
 1878linked([],_).
 1879
 1880linked([X|R],L) :-
 1881  member_eq(X,L),
 1882  !,
 1883  linked(R,L).
 1884
 1885
 1886input_variables(\+ LitM,M,InputVars):-
 1887  !,
 1888  LitM=..[P|Args],
 1889  length(Args,LA),
 1890  length(Args1,LA),
 1891  Lit1=..[P|Args1],
 1892  M:modeb(_,Lit1),
 1893  Lit1 =.. [P|Args1],
 1894  convert_to_input_vars(Args1,Args2),
 1895  Lit2 =.. [P|Args2],
 1896  input_vars(LitM,Lit2,InputVars).
 1897
 1898input_variables(LitM,M,InputVars):-
 1899  LitM=..[P|Args],
 1900  length(Args,LA),
 1901  length(Args1,LA),
 1902  Lit1=..[P|Args1],
 1903  M:modeb(_,Lit1),
 1904  input_vars(LitM,Lit1,InputVars).
 1905
 1906input_variables(LitM,M,InputVars):-
 1907  LitM=..[P|Args],
 1908  length(Args,LA),
 1909  length(Args1,LA),
 1910  Lit1=..[P|Args1],
 1911  M:modeh(_,Lit1),
 1912  input_vars(LitM,Lit1,InputVars).
 1913
 1914input_vars(Lit,Lit1,InputVars):-
 1915  Lit =.. [_|Vars],
 1916  Lit1 =.. [_|Types],
 1917  input_vars1(Vars,Types,InputVars).
 1918
 1919
 1920input_vars1([],_,[]).
 1921
 1922input_vars1([V|RV],[+_T|RT],[V|RV1]):-
 1923  !,
 1924  input_vars1(RV,RT,RV1).
 1925
 1926input_vars1([_V|RV],[_|RT],RV1):-
 1927  input_vars1(RV,RT,RV1).
 extract_type_vars(+Literals:list, +Module:atom, +Types:term) is det
The predicate extracts the type of variables from the list of literals Literals. Types is a list of elements of the form Variable=Type /
 1935extract_type_vars([],_M,[]).
 1936
 1937extract_type_vars([Lit|RestLit],M,TypeVars):-
 1938  Lit =.. [Pred|Args],
 1939  length(Args,L),
 1940  length(Args1,L),
 1941  Lit1 =.. [Pred|Args1],
 1942  take_mode(M,Lit1),
 1943  type_vars(Args,Args1,Types),
 1944  extract_type_vars(RestLit,M,TypeVars0),
 1945  !,
 1946  append(Types,TypeVars0,TypeVars).
 1947
 1948
 1949take_mode(M,Lit):-
 1950  M:modeh(_,Lit),!.
 1951
 1952take_mode(M,Lit):-
 1953  M:modeb(_,Lit),!.
 1954
 1955take_mode(M,Lit):-
 1956  M:mode(_,Lit),!.
 1957
 1958
 1959type_vars([],[],[]).
 1960
 1961type_vars([V|RV],[+T|RT],[V=T|RTV]):-
 1962  !,
 1963  type_vars(RV,RT,RTV).
 1964
 1965type_vars([V|RV],[-T|RT],[V=T|RTV]):-atom(T),!,
 1966  type_vars(RV,RT,RTV).
 1967
 1968type_vars([_V|RV],[_T|RT],RTV):-
 1969  type_vars(RV,RT,RTV).
 take_var_args(+ArgSpec:list, +TypeVars:list, -Vars:list) is det
The predicate returns in Vars the list of vars corresponding to variables arguments in ArgSpec (those with argument specification +type or -type). TypeVars is a list of terns of the form Variable=Types as returnd by extract_type_vars/3. /
 1979take_var_args([],_,[]).
 1980
 1981take_var_args([+T|RT],TypeVars,[V|RV]):-
 1982  !,
 1983  member(V=T,TypeVars),
 1984  take_var_args(RT,TypeVars,RV).
 1985
 1986take_var_args([-T|RT],TypeVars,[_V|RV]):-
 1987  atom(T),
 1988  take_var_args(RT,TypeVars,RV).
 1989
 1990take_var_args([-T|RT],TypeVars,[V|RV]):-
 1991  member(V=T,TypeVars),
 1992  take_var_args(RT,TypeVars,RV).
 1993
 1994take_var_args([T|RT],TypeVars,[T|RV]):-
 1995  T\= + _,(T\= - _; T= - A,number(A)),
 1996  take_var_args(RT,TypeVars,RV).
 1997
 1998
 1999
 2000add_probs([],['':P],P):-!.
 2001
 2002add_probs([H|T],[H:P|T1],P):-
 2003  add_probs(T,T1,P).
 extract_fancy_vars(+Term:term, -Vars:list) is nondet
Given Term, it returns the list of all of its variables in the form 'VN'=Var where VN is an atom with N an increasing integer starting from 1 and Var a variable in Term. /
 2012extract_fancy_vars(List,Vars):-
 2013  term_variables(List,Vars0),
 2014  fancy_vars(Vars0,1,Vars).
 2015
 2016
 2017fancy_vars([],_,[]).
 2018
 2019fancy_vars([X|R],N,[NN2=X|R1]):-
 2020  name(N,NN),
 2021  append([86],NN,NN1),
 2022  name(NN2,NN1),
 2023  N1 is N + 1,
 2024  fancy_vars(R,N1,R1).
 delete_one(+List:list, -Rest:list, +Element:term) is nondet
As the library predicate delete(+List1, @Elem, -List2) but Element is unified with the deleted element (so it can be instantiated by the call). /
 2034delete_one([X|R],R,X).
 2035
 2036delete_one([X|R],[X|R1],D):-
 2037  delete_one(R,R1,D).
 2038
 2039
 2040
 2041
 2042%Computation of the depth of the variables in the clause head/body
 2043dv(H,B,M,DV1):-			%DV1: returns a list of couples (Variable, Max depth)
 2044	term_variables(H,V),
 2045	head_depth(V,DV0),
 2046	findall((MD-DV),var_depth(B,M,DV0,DV,0,MD),LDs),
 2047        get_max(LDs,-1,-,DV1).
 2048
 2049
 2050input_variables_b(\+ LitM,M,InputVars):-!,
 2051	  LitM=..[P|Args],
 2052	  length(Args,LA),
 2053	  length(Args1,LA),
 2054	  Lit1=..[P|Args1],
 2055	  M:modeb(_,Lit1),
 2056	  all_plus(Lit1),
 2057	  input_vars(LitM,Lit1,InputVars).
 2058
 2059input_variables_b(LitM,M,InputVars):-
 2060	  LitM=..[P|Args],
 2061	  length(Args,LA),
 2062	  length(Args1,LA),
 2063	  Lit1=..[P|Args1],
 2064	  M:modeb(_,Lit1),
 2065	  input_vars(LitM,Lit1,InputVars).
 2066
 2067
 2068
 2069%associates depth 0 to each variable in the clause head
 2070head_depth([],[]).
 2071head_depth([V|R],[[V,0]|R1]):-
 2072  head_depth(R,R1).
 2073
 2074%associates a depth to each variable in the clause body
 2075var_depth([],_M,PrevDs1,PrevDs1,MD,MD):-!.
 2076
 2077var_depth([L|R],M,PrevDs,PrevDs1,_MD,MD):-		%L = a body literal, MD = maximum depth set by the user
 2078  input_variables_b(L,M,InputVars),
 2079  term_variables(L, BodyAtomVars),
 2080  output_vars(BodyAtomVars,InputVars,OutputVars),
 2081  depth_InputVars(InputVars,PrevDs,0,MaxD),		%MaxD: maximum depth of the input variables in the body literal
 2082  D is MaxD+1,
 2083  compute_depth(OutputVars,D,PrevDs,PrevDs0),		%Computes the depth for the output variables in the body literal
 2084  var_depth(R,M,PrevDs0,PrevDs1,D,MD).
 2085
 2086get_max([],_,Ds,Ds).
 2087
 2088get_max([(MD-DsH)|T],MD0,_Ds0,Ds):-
 2089  MD>MD0,!,
 2090  get_max(T,MD,DsH,Ds).
 2091
 2092get_max([_H|T],MD,Ds0,Ds):-
 2093	get_max(T,MD,Ds0,Ds).
 2094
 2095delete_eq([],_E,[]).
 2096
 2097delete_eq([H|T],E,T1):-
 2098  H==E,!,
 2099  delete_eq(T,E,T1).
 2100
 2101delete_eq([H|T],E,[H|T1]):-
 2102  delete_eq(T,E,T1).
 2103
 2104output_vars(OutVars,[],OutVars):-!.
 2105output_vars(BodyAtomVars,[I|InputVars],OutVars):-
 2106  delete_eq(BodyAtomVars, I, Residue),
 2107  output_vars(Residue,InputVars, OutVars).
 2108
 2109% returns D as the maximum depth of the variables in the list (first argument)
 2110depth_InputVars([],_,D,D).
 2111depth_InputVars([I|Input],PrevDs,D0,D):-
 2112	 member_l(PrevDs,I,MD),
 2113	 (MD>D0->
 2114		D1=MD
 2115	;
 2116		D1=D0
 2117         ),
 2118	 depth_InputVars(Input,PrevDs,D1,D).
 2119
 2120member_l([[L,D]|_P],I,D):-
 2121     I==L,!.
 2122member_l([_|P],I,D):-
 2123     member_l(P,I,D).
 2124
 2125compute_depth([],_,PD,PD):-!.
 2126compute_depth([O|Output],D,PD,RestO):-
 2127	member_l(PD,O,_),!,
 2128	compute_depth(Output,D,PD,RestO).
 2129
 2130compute_depth([O|Output],D,PD,[[O,D]|RestO]):-
 2131	compute_depth(Output,D,PD,RestO).
 2132
 2133
 2134
 2135%checks if a variable depth exceeds the setting_sc
 2136exceed_depth([],_):-!.
 2137exceed_depth([H|T],MD):-
 2138	nth1(2,H,Dep),
 2139	Dep<MD, %setting_sc(maxdepth_var,MD),
 2140	exceed_depth(T,MD).
 2141
 2142/*
 2143
 2144EMBLEM and SLIPCASE
 2145
 2146Copyright (c) 2011, Fabrizio Riguzzi and Elena Bellodi
 2147
 2148*/
 assert_all(+Terms:list, +Module:atom, -Refs:list) is det
The predicate asserts all terms in Terms in module Module using assertz(M:Term,Ref) and returns the list of references in Refs /
 2156assert_all([],_M,[]).
 2157
 2158assert_all([H|T],M,[HRef|TRef]):-
 2159  assertz(M:H,HRef),
 2160  assert_all(T,M,TRef).
 2161
 2162assert_all([],[]).
 2163
 2164assert_all([H|T],[HRef|TRef]):-
 2165  assertz(slipcover:H,HRef),
 2166  assert_all(T,TRef).
 retract_all(+Refs:list) is det
The predicate erases all references in Refs (using erase/1). /
 2173retract_all([]):-!.
 2174
 2175retract_all([H|T]):-
 2176  erase(H),
 2177  retract_all(T).
 2178
 2179
 2180read_clauses_dir(S,[Cl|Out]):-
 2181  read_term(S,Cl,[]),
 2182  (Cl=end_of_file->
 2183    Out=[]
 2184  ;
 2185    read_clauses_dir(S,Out)
 2186  ).
 process_clauses(+InputClauses:list, +Module:atom, +Rules:list, -RulesOut:list, +Clauses:list, -ClausesOut:list) is det
InputClauses is a list of probabilistic clauses in input syntax. The predicate translates them into the internal format. RulesOut/Rules is a difference list of term of the form rule(R,HeadList,BodyList,Lit,Tun). ClausesOut/Clauses is a difference list of clauses to be asserted. /
 2196process_clauses([],_M,C,C,R,R):-!.
 2197
 2198process_clauses([end_of_file],_M,C,C,R,R):-!.
 2199
 2200process_clauses([H|T],M,C0,C1,R0,R1):-
 2201  (term_expansion_int(H,M,H1)->
 2202    true
 2203  ;
 2204    H1=(H,[])
 2205  ),
 2206  (H1=([_|_],R)->
 2207    H1=(List,R),
 2208    append(C0,List,C2),
 2209    append(R0,R,R2)
 2210  ;
 2211    (H1=([],_R)->
 2212      C2=C0,
 2213      R2=R0
 2214    ;
 2215      H1=(H2,R),
 2216      append(C0,[H2],C2),
 2217      append(R0,R,R2)
 2218    )
 2219  ),
 2220  process_clauses(T,M,C2,C1,R2,R1).
 get_next_rule_number(+Module:atom, -R:integer) is det
The predicate returns the next rule number. Module is used to access local data. /
 2230get_next_rule_number(M,R):-
 2231  retract(M:rule_sc_n(R)),
 2232  R1 is R+1,
 2233  assert(M:rule_sc_n(R1)).
 2234
 2235reset_next_rule_number(M):-
 2236  retract(M:rule_sc_n(_)),
 2237  assert(M:rule_sc_n(0)).
 get_next_nonground_rule_number(+Module:atom, -R:integer) is det
The predicate returns the next nonground rule number used when a different parameter for each rule grounding must be learned Module is used to access local data. /
 2247get_next_nonground_rule_number(M,R):-
 2248  retract(M:rule_ng_sc_n(R)),
 2249  R1 is R+1,
 2250  assert(M:rule_ng_sc_n(R1)).
 2251
 2252reset_next_nonground_rule_number(M):-
 2253  retract(M:rule_ng_sc_n(_)),
 2254  assert(M:rule_ng_sc_n(0)).
 2255
 2256get_node(\+ Goal,M,Env,BDD):-
 2257  M:local_setting(depth_bound,true),!,
 2258  M:local_setting(depth,DB),
 2259  retractall(M:v(_,_,_)),
 2260  abolish_all_tables,
 2261  add_bdd_arg_db(Goal,Env,B,DB,Goal1),
 2262  (M:Goal1->
 2263    bdd_notc(Env,B,(_,BDD))
 2264  ;
 2265    onec(Env,(_,BDD))
 2266  ).
 2267
 2268get_node(\+ Goal,M,Env,BDD):-!,
 2269  retractall(M:v(_,_,_)),
 2270  abolish_all_tables,
 2271  add_bdd_arg(Goal,Env,B,Goal1),
 2272  (M:Goal1->
 2273    bdd_notc(Env,B,(_,BDD))
 2274  ;
 2275    onec(Env,(_,BDD))
 2276  ).
 2277
 2278get_node(Goal,M,Env,BDD):-
 2279  M:local_setting(depth_bound,true),!,
 2280  M:local_setting(depth,DB),
 2281  retractall(M:v(_,_,_)),
 2282  abolish_all_tables,
 2283  add_bdd_arg_db(Goal,Env,B,DB,Goal1),%DB=depth bound
 2284  (M:Goal1->
 2285    (_,BDD)=B
 2286  ;
 2287    zeroc(Env,(_,BDD))
 2288  ).
 2289
 2290get_node(Goal,M,Env,BDD):- %with DB=false
 2291  retractall(M:v(_,_,_)),
 2292  add_bdd_arg(Goal,Env,B,Goal1),
 2293  abolish_all_tables,
 2294%  trace,
 2295  (M:Goal1->
 2296    (_,BDD)=B
 2297  ;
 2298    zeroc(Env,(_,BDD))
 2299  ).
 2300
 2301add_int_arg(_I,A,A):-
 2302  builtin(A),!.
 2303
 2304add_int_arg(I,A,A1):-
 2305  A=..[P|Args],
 2306  A1=..[P,I|Args].
 2307
 2308add_bdd_arg(A,Env,BDD,A1):-
 2309  A=..[P|Args],
 2310  append(Args,[Env,BDD],Args1),
 2311  A1=..[P|Args1].
 2312
 2313
 2314add_bdd_arg_db(A,Env,BDD,DB,A1):-
 2315  A=..[P|Args],
 2316  append(Args,[DB,Env,BDD],Args1),
 2317  A1=..[P|Args1].
 2318
 2319
 2320add_bdd_arg(A,Env,BDD,Module,A1):-
 2321  A=..[P|Args],
 2322  append(Args,[Env,BDD],Args1),
 2323  A1=..[P,Module|Args1].
 2324
 2325
 2326add_bdd_arg_db(A,Env,BDD,DB,Module,A1):-
 2327  A=..[P|Args],
 2328  append(Args,[DB,Env,BDD],Args1),
 2329  A1=..[P,Module|Args1].
 2330
 2331add_mod_arg(A,Module,A1):-
 2332  A=..[P|Args],
 2333  A1=..[P,Module|Args].
 2334
 2335
 2336generate_rules_fact([],_Env,_VC,_R,_Probs,_N,[],_Module,_M).
 2337
 2338generate_rules_fact([Head:_P1,'':_P2],Env,VC,R,Probs,N,[Clause],Module,M):-!,
 2339  add_bdd_arg(Head,Env,BDD,Module,Head1),
 2340  Clause=(Head1:-(slipcover:get_sc_var_n(M,Env,R,VC,Probs,V),slipcover:equalityc(Env,V,N,BDD))).
 2341
 2342generate_rules_fact([Head:_P|T],Env,VC,R,Probs,N,[Clause|Clauses],Module,M):-
 2343  add_bdd_arg(Head,Env,BDD,Module,Head1),
 2344  Clause=(Head1:-(slipcover:get_sc_var_n(M,Env,R,VC,Probs,V),slipcover:equalityc(Env,V,N,BDD))),
 2345  N1 is N+1,
 2346  generate_rules_fact(T,Env,VC,R,Probs,N1,Clauses,Module,M).
 2347
 2348
 2349generate_rules_fact_db([],_Env,_VC,_R,_Probs,_N,[],_Module,_M).
 2350
 2351generate_rules_fact_db([Head:_P1,'':_P2],Env,VC,R,Probs,N,[Clause],Module,M):-!,
 2352  add_bdd_arg_db(Head,Env,BDD,_DB,Module,Head1),
 2353  Clause=(Head1:-(slipcover:get_sc_var_n(M,Env,R,VC,Probs,V),slipcover:equalityc(Env,V,N,BDD))).
 2354
 2355generate_rules_fact_db([Head:_P|T],Env,VC,R,Probs,N,[Clause|Clauses],Module,M):-
 2356  add_bdd_arg_db(Head,Env,BDD,_DB,Module,Head1),
 2357  Clause=(Head1:-(slipcover:get_sc_var_n(M,Env,R,VC,Probs,V),slipcover:equalityc(Env,V,N,BDD))),
 2358  N1 is N+1,
 2359  generate_rules_fact_db(T,Env,VC,R,Probs,N1,Clauses,Module,M).
 2360
 2361
 2362generate_clause(Head,Env,Body,VC,R,Probs,BDDAnd,N,Clause,Module,M):-
 2363  add_bdd_arg(Head,Env,BDD,Module,Head1),
 2364  Clause=(Head1:-(Body,slipcover:get_sc_var_n(M,Env,R,VC,Probs,V),slipcover:equalityc(Env,V,N,B),slipcover:andc(Env,BDDAnd,B,BDD))).
 2365
 2366
 2367generate_clause_db(Head,Env,Body,VC,R,Probs,DB,BDDAnd,N,Clause,Module,M):-
 2368  add_bdd_arg_db(Head,Env,BDD,DBH,Module,Head1),
 2369  Clause=(Head1:-(DBH>=1,DB is DBH-1,Body,slipcover:get_sc_var_n(M,Env,R,VC,Probs,V),slipcover:equalityc(Env,V,N,B),slipcover:andc(Env,BDDAnd,B,BDD))).
 2370
 2371
 2372generate_rules([],_Env,_Body,_VC,_R,_Probs,_BDDAnd,_N,[],_Module,_M).
 2373
 2374generate_rules([Head:_P1,'':_P2],Env,Body,VC,R,Probs,BDDAnd,N,[Clause],Module,M):-!,
 2375  generate_clause(Head,Env,Body,VC,R,Probs,BDDAnd,N,Clause,Module,M).
 2376
 2377generate_rules([Head:_P|T],Env,Body,VC,R,Probs,BDDAnd,N,[Clause|Clauses],Module,M):-
 2378  generate_clause(Head,Env,Body,VC,R,Probs,BDDAnd,N,Clause,Module,M),
 2379  N1 is N+1,
 2380  generate_rules(T,Env,Body,VC,R,Probs,BDDAnd,N1,Clauses,Module,M).
 2381
 2382
 2383generate_rules_db([],_Env,_Body,_VC,_R,_Probs,_DB,_BDDAnd,_N,[],_Module,_M):-!.
 2384
 2385generate_rules_db([Head:_P1,'':_P2],Env,Body,VC,R,Probs,DB,BDDAnd,N,[Clause],Module,M):-!,
 2386  generate_clause_db(Head,Env,Body,VC,R,Probs,DB,BDDAnd,N,Clause,Module,M).
 2387
 2388generate_rules_db([Head:_P|T],Env,Body,VC,R,Probs,DB,BDDAnd,N,[Clause|Clauses],Module,M):-
 2389  generate_clause_db(Head,Env,Body,VC,R,Probs,DB,BDDAnd,N,Clause,Module,M),!,%agg.cut
 2390  N1 is N+1,
 2391  generate_rules_db(T,Env,Body,VC,R,Probs,DB,BDDAnd,N1,Clauses,Module,M).
 2392
 2393process_body_bg([],[],_Module).
 2394
 2395process_body_bg([\+ H|T],[\+ H|Rest],Module):-
 2396  builtin(H),!,
 2397  process_body_bg(T,Rest,Module).
 2398
 2399process_body_bg([\+ H|T],[\+ H1|Rest],Module):-!,
 2400  add_mod_arg(H,Module,H1),
 2401  process_body_bg(T,Rest,Module).
 2402
 2403process_body_bg([H|T],[H|Rest],Module):-
 2404  builtin(H),!,
 2405  process_body_bg(T,Rest,Module).
 2406
 2407process_body_bg([H|T],[H1|Rest],Module):-!,
 2408  add_mod_arg(H,Module,H1),
 2409  process_body_bg(T,Rest,Module).
 2410
 2411
 2412
 2413process_body([],BDD,BDD,Vars,Vars,[],_Env,_Module,_M).
 2414
 2415process_body([\+ H|T],BDD,BDD1,Vars,Vars1,[\+ H|Rest],Env,Module,M):-
 2416  builtin(H),!,
 2417  process_body(T,BDD,BDD1,Vars,Vars1,Rest,Env,Module,M).
 2418
 2419process_body([\+ H|T],BDD,BDD1,Vars,Vars1,[\+ H|Rest],Env,Module,M):-
 2420  db(H),!,
 2421  process_body(T,BDD,BDD1,Vars,Vars1,Rest,Env,Module,M).
 2422
 2423process_body([\+ H|T],BDD,BDD1,Vars,Vars1,[
 2424(((neg(H1);\+ H1),slipcover:onec(Env,BDDN));
 2425  (H2,slipcover:bdd_notc(Env,BDDH,BDDN))),
 2426  slipcover:andc(Env,BDD,BDDN,BDD2)
 2427  |Rest],Env,Module,M):-
 2428  given(M,H),!,
 2429  add_mod_arg(H,Module,H1),
 2430  add_bdd_arg(H,Env,BDDH,Module,H2),
 2431  process_body(T,BDD2,BDD1,Vars,Vars1,Rest,Env,Module,M).
 2432
 2433process_body([\+ H|T],BDD,BDD1,Vars,Vars1,[
 2434  \+(H1)|Rest],Env,Module,M):-
 2435  given_cw(M,H),!,
 2436  add_mod_arg(H,Module,H1),
 2437  process_body(T,BDD,BDD1,Vars,Vars1,Rest,Env,Module,M).
 2438
 2439process_body([\+ H|T],BDD,BDD1,Vars,[BDDH,BDDN,BDD2|Vars1],
 2440[H1,slipcover:bdd_notc(Env,BDDH,BDDN),
 2441  slipcover:andc(Env,BDD,BDDN,BDD2)|Rest],Env,Module,M):-!,
 2442  add_bdd_arg(H,Env,BDDH,Module,H1),
 2443  process_body(T,BDD2,BDD1,Vars,Vars1,Rest,Env,Module,M).
 2444
 2445process_body([H|T],BDD,BDD1,Vars,Vars1,[H|Rest],Env,Module,M):-
 2446  builtin(H),!,
 2447  process_body(T,BDD,BDD1,Vars,Vars1,Rest,Env,Module,M).
 2448
 2449process_body([H|T],BDD,BDD1,Vars,Vars1,[H|Rest],Env,Module,M):-
 2450  db(H),!,
 2451  process_body(T,BDD,BDD1,Vars,Vars1,Rest,Env,Module,M).
 2452
 2453process_body([H|T],BDD,BDD1,Vars,Vars1,
 2454[((H1,slipcover:onec(Env,BDDH));H2),slipcover:andc(Env,BDD,BDDH,BDD2)|Rest],Env,Module,M):-
 2455  given(M,H),!,
 2456  add_mod_arg(H,Module,H1),
 2457  add_bdd_arg(H,Env,BDDH,Module,H2),
 2458  process_body(T,BDD2,BDD1,Vars,Vars1,Rest,Env,Module,M).
 2459
 2460process_body([H|T],BDD,BDD1,Vars,Vars1,
 2461[H1|Rest],Env,Module,M):-
 2462  given_cw(M,H),!,
 2463  add_mod_arg(H,Module,H1),
 2464  process_body(T,BDD,BDD1,Vars,Vars1,Rest,Env,Module,M).
 2465
 2466process_body([H|T],BDD,BDD1,Vars,Vars1,[H1|Rest],Env,Module,M):-
 2467  add_mod_arg(H,Module,H1),
 2468  db(H1),!,
 2469  process_body(T,BDD,BDD1,Vars,Vars1,Rest,Env,Module,M).
 2470
 2471process_body([H|T],BDD,BDD1,Vars,[BDDH,BDD2|Vars1],
 2472[H1,slipcover:andc(Env,BDD,BDDH,BDD2)|Rest],Env,Module,M):-
 2473  add_bdd_arg(H,Env,BDDH,Module,H1),
 2474  process_body(T,BDD2,BDD1,Vars,Vars1,Rest,Env,Module,M).
 2475
 2476process_body_db([],BDD,BDD,_DB,Vars,Vars,[],_Env,_Module,_M):-!.
 2477
 2478process_body_db([\+ H|T],BDD,BDD1,DB,Vars,Vars1,[\+ H|Rest],Env,Module,M):-
 2479  builtin(H),!,
 2480  process_body_db(T,BDD,BDD1,DB,Vars,Vars1,Rest,Env,Module,M).
 2481
 2482process_body_db([\+ H|T],BDD,BDD1,DB,Vars,Vars1,[\+ H|Rest],Env,Module,M):-
 2483  db(H),!,
 2484  process_body_db(T,BDD,BDD1,DB,Vars,Vars1,Rest,Env,Module,M).
 2485
 2486process_body_db([\+ H|T],BDD,BDD1,DB,Vars,Vars1,[
 2487  (((neg(H1);\+ H1),slipcover:onec(Env,BDDN));
 2488    (H2,slipcover:bdd_notc(Env,BDDH,BDDN))),
 2489  slipcover:andc(Env,BDD,BDDN,BDD2)
 2490  |Rest],Env,Module,M):-
 2491  given(M,H),!,
 2492  add_mod_arg(H,Module,H1),
 2493  add_bdd_arg_db(H,Env,BDDH,DB,Module,H2),
 2494  process_body_db(T,BDD2,BDD1,DB,Vars,Vars1,Rest,Env,Module,M).
 2495
 2496process_body_db([\+ H|T],BDD,BDD1,DB,Vars,Vars1,[
 2497  neg(H1)|Rest],Env,Module,M):-
 2498  given_cw(M,H),!,
 2499  add_mod_arg(H,Module,H1),
 2500  process_body_db(T,BDD,BDD1,DB,Vars,Vars1,Rest,Env,Module,M).
 2501
 2502process_body_db([\+ H|T],BDD,BDD1,DB,Vars,[BDDH,BDDN,BDD2|Vars1],
 2503[H1,slipcover:bdd_notc(Env,BDDH,BDDN),
 2504  slipcover:andc(Env,BDD,BDDN,BDD2)|Rest],Env,Module,M):-!,
 2505  add_bdd_arg_db(H,Env,BDDH,DB,Module,H1),
 2506  process_body_db(T,BDD2,BDD1,DB,Vars,Vars1,Rest,Env,Module,M).
 2507
 2508process_body_db([H|T],BDD,BDD1,DB,Vars,Vars1,[H|Rest],Env,Module,M):-
 2509  builtin(H),!,
 2510  process_body_db(T,BDD,BDD1,DB,Vars,Vars1,Rest,Env,Module,M).
 2511
 2512process_body_db([H|T],BDD,BDD1,DB,Vars,Vars1,[H|Rest],Env,Module,M):-
 2513  db(H),!,
 2514  process_body_db(T,BDD,BDD1,DB,Vars,Vars1,Rest,Env,Module,M).
 2515
 2516process_body_db([H|T],BDD,BDD1,DB,Vars,Vars1,
 2517[((H1,slipcover:onec(Env,BDDH));H2),slipcover:andc(Env,BDD,BDDH,BDD2)|Rest],Env,Module,M):-
 2518  given(M,H),!,
 2519  add_mod_arg(H,Module,H1),
 2520  add_bdd_arg_db(H,Env,BDDH,DB,Module,H2),
 2521  process_body_db(T,BDD2,BDD1,DB,Vars,Vars1,Rest,Env,Module,M).
 2522
 2523process_body_db([H|T],BDD,BDD1,DB,Vars,Vars1,
 2524[H1|Rest],Env,Module,M):-
 2525  given_cw(M,H),!,
 2526  add_mod_arg(H,Module,H1),
 2527  process_body_db(T,BDD,BDD1,DB,Vars,Vars1,Rest,Env,Module,M).
 2528
 2529process_body_db([H|T],BDD,BDD1,DB,Vars,[BDDH,BDD2|Vars1],
 2530[H1,slipcover:andc(Env,BDD,BDDH,BDD2)|Rest],Env,Module,M):-!, %agg. cut
 2531  add_bdd_arg_db(H,Env,BDDH,DB,Module,H1),
 2532  process_body_db(T,BDD2,BDD1,DB,Vars,Vars1,Rest,Env,Module,M).
 2533
 2534
 2535
 2536process_body_cw([],BDD,BDD,Vars,Vars,[],_Module).
 2537
 2538process_body_cw([\+ H|T],BDD,BDD1,Vars,Vars1,[\+ H|Rest],Module):-
 2539  builtin(H),!,
 2540  process_body_cw(T,BDD,BDD1,Vars,Vars1,Rest,Module).
 2541
 2542process_body_cw([\+ H|T],BDD,BDD1,Vars,Vars1,[\+ H|Rest],Module):-
 2543  db(H),!,
 2544  process_body_cw(T,BDD,BDD1,Vars,Vars1,Rest,Module).
 2545
 2546process_body_cw([\+ H|T],BDD,BDD1,Vars,Vars1,[
 2547  \+(H1)|Rest],Module):-
 2548  add_mod_arg(H,Module,H1),
 2549  process_body_cw(T,BDD,BDD1,Vars,Vars1,Rest,Module).
 2550
 2551process_body_cw([H|T],BDD,BDD1,Vars,Vars1,[H|Rest],Module):-
 2552  builtin(H),!,
 2553  process_body_cw(T,BDD,BDD1,Vars,Vars1,Rest,Module).
 2554
 2555process_body_cw([H|T],BDD,BDD1,Vars,Vars1,[H|Rest],Module):-
 2556  db(H),!,
 2557  process_body_cw(T,BDD,BDD1,Vars,Vars1,Rest,Module).
 2558
 2559process_body_cw([H|T],BDD,BDD1,Vars,Vars1,
 2560[H1|Rest],Module):-
 2561  add_mod_arg(H,Module,H1),
 2562  process_body_cw(T,BDD,BDD1,Vars,Vars1,Rest,Module).
 2563
 2564
 2565given(M,H):-
 2566  functor(H,P,Ar),
 2567  (M:input(P/Ar)).
 2568
 2569
 2570given_cw(M,H):-
 2571  functor(H,P,Ar),
 2572  (M:input_cw(P/Ar)).
 set_sc(:Parameter:atom, +Value:term) is det
The predicate sets the value of a parameter For a list of parameters see https://friguzzi.github.io/cplint/ /
 2581set_sc(M:Parameter,Value):-
 2582  must_be(atom,Parameter),
 2583  must_be(nonvar,Value),
 2584  retract(M:local_setting(Parameter,_)),
 2585  assert(M:local_setting(Parameter,Value)).
 setting_sc(:Parameter:atom, -Value:term) is det
The predicate returns the value of a parameter For a list of parameters see https://friguzzi.github.io/cplint/ /
 2594setting_sc(M:P,V):-
 2595  must_be(atom,P),
 2596  M:local_setting(P,V).
 2597
 2598
 2599
 2600difference([],_,[]).
 2601
 2602difference([H|T],L2,L3):-
 2603  member_eq(H,L2),!,
 2604  difference(T,L2,L3).
 2605
 2606difference([H|T],L2,[H|L3]):-
 2607  difference(T,L2,L3).
 member_eq(+List:list, +Element:term) is det
Checks the presence of Element in List. Equality is checked with ==. /
 2614member_eq(E,[H|_T]):-
 2615  E==H,!.
 2616
 2617member_eq(E,[_H|T]):-
 2618  member_eq(E,T).
 2619
 2620
 2621
 2622
 2623process_head(HeadList,M, GroundHeadList) :-
 2624  ground_prob(HeadList), !,
 2625  process_head_ground(HeadList,M, 0, GroundHeadList).
 2626
 2627process_head(HeadList,_M, HeadList).
 2628
 2629
 2630process_head_fixed([Head:p(ProbHead)],M, Prob, [Head:ProbHead1|Null]) :-!,
 2631  ProbHead1 is ProbHead,
 2632  ProbLast is 1 - Prob - ProbHead1,
 2633  M:local_setting(epsilon_parsing, Eps),
 2634  EpsNeg is - Eps,
 2635  ProbLast > EpsNeg,
 2636  (ProbLast > Eps ->
 2637    Null = ['':ProbLast]
 2638  ;
 2639    Null = []
 2640  ).
 2641
 2642process_head_fixed([Head:p(ProbHead)|Tail], M, Prob, [Head:ProbHead1|Next]) :-
 2643  ProbHead1 is ProbHead,
 2644  ProbNext is Prob + ProbHead1,
 2645  process_head_fixed(Tail, M, ProbNext, Next).
 2646
 2647
 2648/* process_head_ground([Head:ProbHead], Prob, [Head:ProbHead|Null])
 2649 * ----------------------------------------------------------------
 2650 */
 2651process_head_ground([Head:ProbHead],M, Prob, [Head:ProbHead1|Null]) :-!,
 2652  ProbHead1 is ProbHead,
 2653  ProbLast is 1 - Prob - ProbHead1,
 2654  M:local_setting(epsilon_parsing, Eps),
 2655  EpsNeg is - Eps,
 2656  ProbLast > EpsNeg,
 2657  (ProbLast > Eps ->
 2658    Null = ['':ProbLast]
 2659  ;
 2660    Null = []
 2661  ).
 2662
 2663process_head_ground([Head:ProbHead|Tail], M, Prob, [Head:ProbHead1|Next]) :-
 2664  ProbHead1 is ProbHead,
 2665  ProbNext is Prob + ProbHead1,
 2666  process_head_ground(Tail, M, ProbNext, Next).
 2667
 2668
 2669ground_prob([]).
 2670
 2671ground_prob([_Head:ProbHead|Tail]) :-
 2672  ground(ProbHead), % Succeeds if there are no free variables in the term ProbHead.
 2673  ground_prob(Tail).
 2674
 2675
 2676get_probs([], []).
 2677
 2678get_probs([_H:P|T], [P1|T1]) :-
 2679  P1 is P,
 2680  get_probs(T, T1).
 2681
 2682get_probs_t([H:A|T],_M, LP,L3):-
 2683  A=..[t,Prob|_],
 2684  var(Prob),!,
 2685  length([H:A|T],N),
 2686  P is 1/(N+1),
 2687  maplist(set_prob(P),[H:A|T],LP,L2),
 2688  append(L2,['':P],L3).
 2689
 2690get_probs_t(L,M,LP,L3):-
 2691  process_head_init(L,M,0,L3),
 2692  get_probs(L3,LP).
 2693
 2694process_head_init([Head:Ann],M, Prob, [Head:ProbHead1|Null]) :-!,
 2695  Ann=..[t,ProbHead|_],
 2696  ProbHead1 is ProbHead,
 2697  ProbLast is 1 - Prob - ProbHead1,
 2698  M:local_setting(epsilon_parsing, Eps),
 2699  EpsNeg is - Eps,
 2700  ProbLast > EpsNeg,
 2701  (ProbLast > Eps ->
 2702    Null = ['':ProbLast]
 2703  ;
 2704    Null = []
 2705  ).
 2706
 2707process_head_init([Head:Ann|Tail], M, Prob, [Head:ProbHead1|Next]) :-
 2708  Ann=..[t,ProbHead|_],
 2709  ProbHead1 is ProbHead,
 2710  ProbNext is Prob + ProbHead1,
 2711  process_head_init(Tail, M, ProbNext, Next).
 2712
 2713set_prob(P,A:_,P,A:P).
 2714
 2715set_prob_t(A:Ann,P,A:P):-
 2716  Ann=..[t,P|_].
 2717
 2718get_at(A:_,A).
 2719
 2720generate_clauses_cw([],_M,[],_N,C,C):-!.
 2721
 2722generate_clauses_cw([H|T],M,[H1|T1],N,C0,C):-
 2723  gen_clause_cw(H,M,N,N1,H1,CL),!,  %agg.cut
 2724  append(C0,CL,C1),
 2725  generate_clauses_cw(T,M,T1,N1,C1,C).
 2726
 2727gen_clause_cw((H :- Body),_M,N,N,(H :- Body),[(H :- Body)]):-
 2728  !.
 2729
 2730gen_clause_cw(rule(_R,HeadList,BodyList,Lit,Tun),M,N,N1,
 2731  rule(N,HeadList,BodyList,Lit,Tun),Clauses):-!,
 2732% disjunctive clause with more than one head atom senza depth_bound
 2733  process_body_cw(BodyList,BDD,BDDAnd,[],_Vars,BodyList1,Module),
 2734  append([slipcover:onec(Env,BDD)],BodyList1,BodyList2),
 2735  list2and(BodyList2,Body1),
 2736  append(HeadList,BodyList,List),
 2737  term_variables(List,VC),
 2738  get_probs(HeadList,Probs),
 2739  (M:local_setting(single_var,true)->
 2740    generate_rules(HeadList,Env,Body1,[],N,Probs,BDDAnd,0,Clauses,Module,M)
 2741  ;
 2742    generate_rules(HeadList,Env,Body1,VC,N,Probs,BDDAnd,0,Clauses,Module,M)
 2743  ),
 2744  N1 is N+1.
 2745
 2746gen_clause_cw(def_rule(H,BodyList,Lit),_M,N,N,def_rule(H,BodyList,Lit),Clauses) :- !,%agg. cut
 2747% disjunctive clause with a single head atom senza depth_bound con prob =1
 2748  process_body_cw(BodyList,BDD,BDDAnd,[],_Vars,BodyList2,Module),
 2749  append([slipcover:onec(Env,BDD)],BodyList2,BodyList3),
 2750  list2and(BodyList3,Body1),
 2751  add_bdd_arg(H,Env,BDDAnd,Module,Head1),
 2752  Clauses=[(Head1 :- Body1)].
 generate_clauses(+Rules0:list, +Module:atom, +StartingIndex:integer, -Rules:list, +Clauses:list, -ClausesOut:list) is det
The predicate generate the internal representation of rules to produce clauses to be asserted in the database. Rules0 is a list of term of the form rule(R,HeadList,BodyList,Lit,Tun). Rules is a list of terms of the form rule(N,HeadList,BodyList,Lit,Tun) where N is an increasing index starting from StartingIndex. ClausesOut/Clauses is a difference list of clauses to be asserted. /
 2765generate_clauses([],_M,[],_N,C,C):-!.
 2766
 2767generate_clauses([H|T],M,[H1|T1],N,C0,C):-
 2768  gen_clause(H,M,N,N1,H1,CL),!,  %agg.cut
 2769  append(C0,CL,C1),
 2770  generate_clauses(T,M,T1,N1,C1,C).
 2771
 2772
 2773gen_clause((H :- Body),_M,N,N,(H :- Body),[(H :- Body)]):-
 2774  !.
 2775
 2776gen_clause(rule(R,HeadList,BodyList,Lit,Tun),M,N,N,
 2777  rule(RI,HeadList,BodyList,Lit,Tun),Clauses):-
 2778  M:local_setting(depth_bound,true),!,
 2779% disjunctive clause with more than one head atom e depth_bound
 2780  process_body_db(BodyList,BDD,BDDAnd, DB,[],_Vars,BodyList1,Env,Module,M),
 2781  append([slipcover:onec(Env,BDD)],BodyList1,BodyList2),
 2782  list2and(BodyList2,Body1),
 2783  append(HeadList,BodyList,List),
 2784  term_variables(List,VC),
 2785  get_probs(HeadList,Probs),
 2786  (M:local_setting(single_var,true)->
 2787    generate_rules_db(HeadList,Env,Body1,[],RI,Probs,DB,BDDAnd,0,Clauses,Module,M)
 2788  ;
 2789    generate_rules_db(HeadList,Env,Body1,VC,RI,Probs,DB,BDDAnd,0,Clauses,Module,M)
 2790  ),
 2791  (R=ng(_,Vals)->
 2792    get_next_nonground_rule_number(M,RG),
 2793    RI=ng(RG,Vals)
 2794  ;
 2795    get_next_rule_number(M,RI)
 2796  ).
 2797
 2798gen_clause(rule(R,HeadList,BodyList,Lit,Tun),M,N,N,
 2799  rule(RI,HeadList,BodyList,Lit,Tun),Clauses):-!,
 2800% disjunctive clause with more than one head atom senza depth_bound
 2801  process_body(BodyList,BDD,BDDAnd,[],_Vars,BodyList1,Env,Module,M),
 2802  append([slipcover:onec(Env,BDD)],BodyList1,BodyList2),
 2803  list2and(BodyList2,Body1),
 2804  append(HeadList,BodyList,List),
 2805  term_variables(List,VC),
 2806  get_probs(HeadList,Probs),
 2807  (M:local_setting(single_var,true)->
 2808    generate_rules(HeadList,Env,Body1,[],RI,Probs,BDDAnd,0,Clauses,Module,M)
 2809  ;
 2810    generate_rules(HeadList,Env,Body1,VC,RI,Probs,BDDAnd,0,Clauses,Module,M)
 2811  ),
 2812  (R=ng(_,Vals)->
 2813    get_next_nonground_rule_number(M,RG),
 2814    RI=ng(RG,Vals)
 2815  ;
 2816    get_next_rule_number(M,RI)
 2817  ).
 2818
 2819
 2820gen_clause(def_rule(H,BodyList,Lit),M,N,N,def_rule(H,BodyList,Lit),Clauses) :-
 2821% disjunctive clause with a single head atom e depth_bound
 2822  M:local_setting(depth_bound,true),!,
 2823  process_body_db(BodyList,BDD,BDDAnd,DB,[],_Vars,BodyList2,Env,Module,M),
 2824  append([slipcover:onec(Env,BDD)],BodyList2,BodyList3),
 2825  list2and(BodyList3,Body1),
 2826  add_bdd_arg_db(H,Env,BDDAnd,DBH,Module,Head1),
 2827  Clauses=[(Head1 :- (DBH>=1,DB is DBH-1,Body1))].
 2828
 2829gen_clause(def_rule(H,BodyList,Lit),M,N,N,def_rule(H,BodyList,Lit),Clauses) :- !,%agg. cut
 2830% disjunctive clause with a single head atom senza depth_bound con prob =1
 2831  process_body(BodyList,BDD,BDDAnd,[],_Vars,BodyList2,Env,Module,M),
 2832  append([slipcover:onec(Env,BDD)],BodyList2,BodyList3),
 2833  list2and(BodyList3,Body1),
 2834  add_bdd_arg(H,Env,BDDAnd,Module,Head1),
 2835  Clauses=[(Head1 :- Body1)].
 generate_clauses_bg(+Rules:list, -Clauses:list) is det
The predicate generate clauses to be asserted in the database for the rules from the background. Rules is a list of term of the form def_rule(H,BodyList,_Lit). Clauses is a list of clauses to be asserted. /
 2845generate_clauses_bg([],[]):-!.
 2846
 2847generate_clauses_bg([H|T],[CL|T1]):-
 2848  gen_clause_bg(H,CL),  %agg.cut
 2849  generate_clauses_bg(T,T1).
 2850
 2851gen_clause_bg(def_rule(H,BodyList,_Lit),Clauses) :-
 2852% disjunctive clause with a single head atom e depth_bound
 2853  process_body_bg(BodyList,BodyList2,Module),
 2854  list2and(BodyList2,Body1),
 2855  add_mod_arg(H,Module,Head1),
 2856  Clauses=(Head1 :- Body1).
 get_sc_var_n(++M:atomic, ++Environment:int, ++Rule:int, ++Substitution:term, ++Probabilities:list, -Variable:int) is det
Returns the index Variable of the random variable associated to rule with index Rule, grouding substitution Substitution and head distribution Probabilities in environment Environment. Differs from get_var_n/6 of pita because R can be ng(RN,Vals), indicating a rule for which different instantiations get different parameters. /
 2867get_sc_var_n(M,Env,R,S,Probs0,V):-
 2868  (ground(Probs0)->
 2869    maplist(is,Probs,Probs0),
 2870    (M:v(R,S,V)->
 2871      true
 2872    ;
 2873      (R=ng(RN,Vals)->
 2874        M:rule(ng(RN,Vals),HeadList,BodyList,Lits,Tun),
 2875        (M:rule(g(GR),HeadList,BodyList,Lits,Tun)->
 2876          (M:v(GR,S,V)->
 2877            true
 2878          ;
 2879            add_var(Env,Probs,GR,V),
 2880            assert(M:v(GR,S,V))
 2881          )
 2882        ;
 2883          get_next_rule_number(M,GR),
 2884          assert(M:rule(g(GR),HeadList,BodyList,Lits,Tun)),
 2885          add_var(Env,Probs,GR,V),
 2886          assert(M:v(GR,S,V))
 2887        )
 2888      ;
 2889        add_var(Env,Probs,R,V),
 2890        assert(M:v(R,S,V))
 2891      )
 2892    )
 2893  ;
 2894    throw(error('Non ground probailities not instantiated by the body'))
 2895  ).
 2896
 2897
 2898builtin(average(_L,_Av)) :- !.
 2899builtin(G) :-
 2900  swi_builtin(G).
 2901
 2902
 2903gen_cl_db_t(M,HeadList,BodyList,Clauses,rule(ng(R,Vals),HeadList1,BodyList,true,Tun)):-
 2904  process_body_db(BodyList,BDD,BDDAnd, DB,[],_Vars,BodyList1,Env,Module,M),
 2905  append(HeadList,BodyList,List),
 2906  term_variables(List,VC),
 2907  append([slipcover:onec(Env,BDD)],BodyList1,BodyList2),
 2908  list2and(BodyList2,Body1),
 2909  get_next_nonground_rule_number(M,R),
 2910  get_probs_t(HeadList,M,Probs,HeadList1),
 2911  HeadList=[_:Ann|_],
 2912  Ann=..[t,P|Vals],
 2913  (var(P)->
 2914    Tun=tunable
 2915  ;
 2916    Tun=initial
 2917  ),
 2918  (M:local_setting(single_var,true)->
 2919    generate_rules_db(HeadList1,Env,Body1,[],ng(R,Vals),Probs,DB,BDDAnd,0,Clauses,Module,M)
 2920  ;
 2921    generate_rules_db(HeadList1,Env,Body1,VC,ng(R,Vals),Probs,DB,BDDAnd,0,Clauses,Module,M)
 2922   ).
 2923
 2924gen_cl_db_fact_t(M,HeadList,Clauses,rule(ng(R,Vals),HeadList1,[],true,Tun)):-
 2925  term_variables(HeadList,VC),
 2926  get_next_nonground_rule_number(M,R),
 2927  get_probs_t(HeadList,M,Probs,HeadList1),
 2928  HeadList=[_:Ann|_],
 2929  Ann=..[t,P|Vals],
 2930  (var(P)->
 2931    Tun=tunable
 2932  ;
 2933    Tun=initial
 2934  ),
 2935  (M:local_setting(single_var,true)->
 2936    generate_rules_fact_db(HeadList,_Env,[],ng(R,Vals),Probs,0,Clauses,_Module,M)
 2937  ;
 2938    generate_rules_fact_db(HeadList,_Env,VC,ng(R,Vals),Probs,0,Clauses,_Module,M)
 2939  ).
 2940
 2941gen_cl_fact_t(M,HeadList,Clauses,rule(ng(R,Vals),HeadList1,[],true,Tun)):-
 2942  term_variables(HeadList,VC),
 2943  get_next_nonground_rule_number(M,R),
 2944  get_probs_t(HeadList,M,Probs,HeadList1),
 2945  HeadList=[_:Ann|_],
 2946  Ann=..[t,P|Vals],
 2947  (var(P)->
 2948    Tun=tunable
 2949  ;
 2950    Tun=initial
 2951  ),
 2952  (M:local_setting(single_var,true)->
 2953    generate_rules_fact(HeadList,_Env,[],ng(R,Vals),Probs,0,Clauses,_Module,M)
 2954  ;
 2955    generate_rules_fact(HeadList,_Env,VC,ng(R,Vals),Probs,0,Clauses,_Module,M)
 2956  ).
 2957
 2958gen_cl_t(M,HeadList,BodyList,Clauses,rule(ng(R,Vals),HeadList1,BodyList,true,Tun)):-
 2959  process_body(BodyList,BDD,BDDAnd, [],_Vars,BodyList1,Env,Module,M),
 2960  append(HeadList,BodyList,List),
 2961  term_variables(List,VC),
 2962  append([slipcover:onec(Env,BDD)],BodyList1,BodyList2),
 2963  list2and(BodyList2,Body1),
 2964  get_next_nonground_rule_number(M,R),
 2965  get_probs_t(HeadList,M,Probs,HeadList1),
 2966  HeadList=[_:Ann|_],
 2967  Ann=..[t,P|Vals],
 2968  (var(P)->
 2969    Tun=tunable
 2970  ;
 2971    Tun=initial
 2972  ),
 2973  (M:local_setting(single_var,true)->
 2974    generate_rules(HeadList1,Env,Body1,[],ng(R,Vals),Probs,BDDAnd,0,Clauses,Module,M)
 2975  ;
 2976    generate_rules(HeadList1,Env,Body1,VC,ng(R,Vals),Probs,BDDAnd,0,Clauses,Module,M)
 2977  ).
 2978
 2979term_expansion_int((Head :- Body),_M, ((H :- Body),[])):-
 2980  Head=db(H),!.
 2981
 2982term_expansion_int((Head :- Body),M, (Clauses,[Rule])):-
 2983  M:local_setting(compiling,on),
 2984  M:local_setting(depth_bound,true),
 2985% disjunctive clause with more than one head atom e depth_bound with individual pars
 2986  Head = (_H:A;_),
 2987  A=..[t,_P|_],
 2988  !,
 2989  list2or(HeadList, Head),
 2990  list2and(BodyList, Body),
 2991  gen_cl_db_t(M,HeadList,BodyList,Clauses,Rule).
 2992
 2993term_expansion_int((Head :- Body),M, (Clauses,[Rule])):-
 2994  M:local_setting(compiling,on),
 2995% disjunctive clause with more than one head atom without depth_bound with individual pars
 2996  Head = (_H:A;_),
 2997  A=..[t,_P|_],
 2998  !,
 2999  list2or(HeadList0, Head),
 3000  append(HeadList0,['':_],HeadList),
 3001  list2and(BodyList, Body),
 3002  gen_cl_t(M,HeadList,BodyList,Clauses,Rule).
 3003
 3004term_expansion_int((Head :- Body),M, (Clauses,[rule(R,HeadList,BodyList,true,fixed)])):-
 3005  M:local_setting(compiling,on),
 3006  M:local_setting(depth_bound,true),
 3007% disjunctive clause with more than one head atom e depth_bound, fixed par
 3008  Head = (_H:p(_P);_),
 3009  !,
 3010  list2or(HeadListOr, Head),
 3011  process_head_fixed(HeadListOr,M,0,HeadList),
 3012  list2and(BodyList, Body),
 3013  process_body_db(BodyList,BDD,BDDAnd, DB,[],_Vars,BodyList1,Env,Module,M),
 3014  append([slipcover:onec(Env,BDD)],BodyList1,BodyList2),
 3015  list2and(BodyList2,Body1),
 3016  append(HeadList,BodyList,List),
 3017  term_variables(List,VC),
 3018  get_next_rule_number(M,R),
 3019  get_probs(HeadList,Probs),
 3020  (M:local_setting(single_var,true)->
 3021    generate_rules_db(HeadList,Env,Body1,[],R,Probs,DB,BDDAnd,0,Clauses,Module,M)
 3022  ;
 3023    generate_rules_db(HeadList,Env,Body1,VC,R,Probs,DB,BDDAnd,0,Clauses,Module,M)
 3024   ).
 3025
 3026term_expansion_int((Head :- Body),M, (Clauses,[rule(R,HeadList,BodyList,true,fixed)])):-
 3027  M:local_setting(compiling,on),
 3028% disjunctive clause with more than one head atom senza depth_bound, fixed par
 3029  Head = (_H:p(_P);_),
 3030  !,
 3031  list2or(HeadListOr, Head),
 3032  process_head_fixed(HeadListOr,M,0,HeadList),
 3033  list2and(BodyList, Body),
 3034  process_body(BodyList,BDD,BDDAnd,[],_Vars,BodyList1,Env,Module,M),
 3035  append([slipcover:onec(Env,BDD)],BodyList1,BodyList2),
 3036  list2and(BodyList2,Body1),
 3037  append(HeadList,BodyList,List),
 3038  term_variables(List,VC),
 3039  get_next_rule_number(M,R),
 3040  get_probs(HeadList,Probs),
 3041  (M:local_setting(single_var,true)->
 3042    generate_rules(HeadList,Env,Body1,[],R,Probs,BDDAnd,0,Clauses,Module,M)
 3043  ;
 3044    generate_rules(HeadList,Env,Body1,VC,R,Probs,BDDAnd,0,Clauses,Module,M)
 3045  ).
 3046
 3047term_expansion_int((Head :- Body),M, (Clauses,[rule(R,HeadList,BodyList,true,tunable)])):-
 3048  M:local_setting(compiling,on),
 3049  M:local_setting(depth_bound,true),
 3050% disjunctive clause with more than one head atom e depth_bound
 3051  Head = (_;_), !,
 3052  list2or(HeadListOr, Head),
 3053  process_head(HeadListOr,M,HeadList),
 3054  list2and(BodyList, Body),
 3055  process_body_db(BodyList,BDD,BDDAnd, DB,[],_Vars,BodyList1,Env,Module,M),
 3056  append([slipcover:onec(Env,BDD)],BodyList1,BodyList2),
 3057  list2and(BodyList2,Body1),
 3058  append(HeadList,BodyList,List),
 3059  term_variables(List,VC),
 3060  get_next_rule_number(M,R),
 3061  get_probs(HeadList,Probs),
 3062  (M:local_setting(single_var,true)->
 3063    generate_rules_db(HeadList,Env,Body1,[],R,Probs,DB,BDDAnd,0,Clauses,Module,M)
 3064  ;
 3065    generate_rules_db(HeadList,Env,Body1,VC,R,Probs,DB,BDDAnd,0,Clauses,Module,M)
 3066   ).
 3067
 3068term_expansion_int((Head :- Body),M, (Clauses,[rule(R,HeadList,BodyList,true,tunable)])):-
 3069  M:local_setting(compiling,on),
 3070% disjunctive clause with more than one head atom senza depth_bound
 3071  Head = (_;_), !,
 3072  list2or(HeadListOr, Head),
 3073  process_head(HeadListOr,M,HeadList),
 3074  list2and(BodyList, Body),
 3075  process_body(BodyList,BDD,BDDAnd,[],_Vars,BodyList1,Env,Module,M),
 3076  append([slipcover:onec(Env,BDD)],BodyList1,BodyList2),
 3077  list2and(BodyList2,Body1),
 3078  append(HeadList,BodyList,List),
 3079  term_variables(List,VC),
 3080  get_next_rule_number(M,R),
 3081  get_probs(HeadList,Probs),
 3082  (M:local_setting(single_var,true)->
 3083    generate_rules(HeadList,Env,Body1,[],R,Probs,BDDAnd,0,Clauses,Module,M)
 3084  ;
 3085    generate_rules(HeadList,Env,Body1,VC,R,Probs,BDDAnd,0,Clauses,Module,M)
 3086  ).
 3087
 3088term_expansion_int((Head :- Body),M, (Clauses,[Rule])) :-
 3089% disjunctive clause with a single head atom e DB, con prob. diversa da 1 with individual pars
 3090  M:local_setting(compiling,on),
 3091  M:local_setting(depth_bound,true),
 3092  ((Head:-Body) \= ((sc_expansion(_,_) ):- _ )),
 3093  Head = (H:A),
 3094  A=..[t,_P|_],
 3095  !,
 3096  HeadList=[H:A],
 3097  list2and(BodyList, Body),
 3098  gen_cl_db_t(M,HeadList,BodyList,Clauses,Rule).
 3099
 3100term_expansion_int((Head :- Body),M, (Clauses,[Rule])):-
 3101  M:local_setting(compiling,on),
 3102% disjunctive clause with a single head atom without depth_bound with individual pars
 3103  Head = (H:A),
 3104  A=..[t,_P|_],
 3105  !,
 3106  HeadList=[H:A],
 3107  list2and(BodyList, Body),
 3108  gen_cl_t(M,HeadList,BodyList,Clauses,Rule).
 3109
 3110term_expansion_int((Head :- Body),M, (Clauses,[rule(R,HeadList,BodyList,true,fixed)])) :-
 3111% disjunctive clause with a single head atom e DB, con prob. diversa da 1, fixed par
 3112  M:local_setting(compiling,on),
 3113  M:local_setting(depth_bound,true),
 3114  ((Head:-Body) \= ((sc_expansion(_,_) ):- _ )),
 3115  Head = (H:p(_)),
 3116  !,
 3117  list2or(HeadListOr, Head),
 3118  process_head_fixed(HeadListOr,M,0,HeadList),
 3119  list2and(BodyList, Body),
 3120  process_body_db(BodyList,BDD,BDDAnd,DB,[],_Vars,BodyList2,Env,Module,M),
 3121  append([slipcover:onec(Env,BDD)],BodyList2,BodyList3),
 3122  list2and(BodyList3,Body2),
 3123  append(HeadList,BodyList,List),
 3124  term_variables(List,VC),
 3125  get_next_rule_number(M,R),
 3126  get_probs(HeadList,Probs),%***test single_var
 3127  (M:local_setting(single_var,true)->
 3128    generate_clause_db(H,Env,Body2,[],R,Probs,DB,BDDAnd,0,Clauses,Module,M)
 3129  ;
 3130    generate_clause_db(H,Env,Body2,VC,R,Probs,DB,BDDAnd,0,Clauses,Module,M)
 3131  ).
 3132
 3133term_expansion_int((Head :- Body),M, (Clauses,[rule(R,HeadList,BodyList,true,fixed)])) :-
 3134% disjunctive clause with a single head atom senza DB, con prob. diversa da 1, fixed par
 3135  M:local_setting(compiling,on),
 3136  ((Head:-Body) \= ((sc_expansion(_,_) ):- _ )),
 3137  Head = (H:p(_)),
 3138  !,
 3139  list2or(HeadListOr, Head),
 3140  process_head_fixed(HeadListOr,M,0,HeadList),
 3141  list2and(BodyList, Body),
 3142  process_body(BodyList,BDD,BDDAnd,[],_Vars,BodyList2,Env,Module,M),
 3143  append([slipcover:onec(Env,BDD)],BodyList2,BodyList3),
 3144  list2and(BodyList3,Body2),
 3145  append(HeadList,BodyList,List),
 3146  term_variables(List,VC),
 3147  get_next_rule_number(M,R),
 3148  get_probs(HeadList,Probs),%***test single_vars
 3149  (M:local_setting(single_var,true)->
 3150    generate_clause(H,Env,Body2,[],R,Probs,BDDAnd,0,Clauses,Module,M)
 3151  ;
 3152    generate_clause(H,Env,Body2,VC,R,Probs,BDDAnd,0,Clauses,Module,M)
 3153  ).
 3154
 3155term_expansion_int((Head :- Body),M, ([],[])) :-
 3156% disjunctive clause with a single head atom con prob. 0 senza depth_bound --> la regola non è caricata nella teoria e non è conteggiata in NR
 3157  M:local_setting(compiling,on),
 3158  ((Head:-Body) \= ((sc_expansion(_,_) ):- _ )),
 3159  Head = (_H:P),number(P),P=:=0.0, !.
 3160
 3161term_expansion_int((Head :- Body),M, (Clauses,[def_rule(H,BodyList,true)])) :-
 3162% disjunctive clause with a single head atom e depth_bound con prob =1
 3163  M:local_setting(compiling,on),
 3164  M:local_setting(depth_bound,true),
 3165  ((Head:-Body) \= ((sc_expansion(_,_) ):- _ )),
 3166  list2or(HeadListOr, Head),
 3167  process_head(HeadListOr,M,HeadList),
 3168  HeadList=[H:_],!,
 3169  list2and(BodyList, Body),
 3170  process_body_db(BodyList,BDD,BDDAnd,DB,[],_Vars,BodyList2,Env,Module,M),
 3171  append([slipcover:onec(Env,BDD)],BodyList2,BodyList3),
 3172  list2and(BodyList3,Body1),
 3173  add_bdd_arg_db(H,Env,BDDAnd,DBH,Module,Head1),
 3174  Clauses=(Head1 :- (DBH>=1,DB is DBH-1,Body1)).
 3175
 3176term_expansion_int((Head :- Body), M,(Clauses,[def_rule(H,BodyList,true)])) :-
 3177% disjunctive clause with a single head atom senza depth_bound con prob =1
 3178  M:local_setting(compiling,on),
 3179   ((Head:-Body) \= ((sc_expansion(_,_) ):- _ )),
 3180  list2or(HeadListOr, Head),
 3181  process_head(HeadListOr,M,HeadList),
 3182  HeadList=[H:_],!,
 3183  list2and(BodyList, Body),
 3184  process_body(BodyList,BDD,BDDAnd,[],_Vars,BodyList2,Env,Module,M),
 3185  append([slipcover:onec(Env,BDD)],BodyList2,BodyList3),
 3186  list2and(BodyList3,Body1),
 3187  add_bdd_arg(H,Env,BDDAnd,Module,Head1),
 3188  Clauses=(Head1 :- Body1).
 3189
 3190term_expansion_int((Head :- Body),M, (Clauses,[rule(R,HeadList,BodyList,true,tunable)])) :-
 3191% disjunctive clause with a single head atom e DB, con prob. diversa da 1
 3192  M:local_setting(compiling,on),
 3193  M:local_setting(depth_bound,true),
 3194  ((Head:-Body) \= ((sc_expansion(_,_) ):- _ )),
 3195  Head = (H:_), !,
 3196  list2or(HeadListOr, Head),
 3197  process_head(HeadListOr,M,HeadList),
 3198  list2and(BodyList, Body),
 3199  process_body_db(BodyList,BDD,BDDAnd,DB,[],_Vars,BodyList2,Env,Module,M),
 3200  append([slipcover:onec(Env,BDD)],BodyList2,BodyList3),
 3201  list2and(BodyList3,Body2),
 3202  append(HeadList,BodyList,List),
 3203  term_variables(List,VC),
 3204  get_next_rule_number(M,R),
 3205  get_probs(HeadList,Probs),%***test single_var
 3206  (M:local_setting(single_var,true)->
 3207    generate_clause_db(H,Env,Body2,[],R,Probs,DB,BDDAnd,0,Clauses,Module,M)
 3208  ;
 3209    generate_clause_db(H,Env,Body2,VC,R,Probs,DB,BDDAnd,0,Clauses,Module,M)
 3210  ).
 3211
 3212term_expansion_int((Head :- Body),M, (Clauses,[rule(R,HeadList,BodyList,true,tunable)])) :-
 3213% disjunctive clause with a single head atom senza DB, con prob. diversa da 1
 3214  M:local_setting(compiling,on),
 3215  ((Head:-Body) \= ((sc_expansion(_,_) ):- _ )),
 3216  Head = (H:_), !,
 3217  list2or(HeadListOr, Head),
 3218  process_head(HeadListOr,M,HeadList),
 3219  list2and(BodyList, Body),
 3220  process_body(BodyList,BDD,BDDAnd,[],_Vars,BodyList2,Env,Module,M),
 3221  append([slipcover:onec(Env,BDD)],BodyList2,BodyList3),
 3222  list2and(BodyList3,Body2),
 3223  append(HeadList,BodyList,List),
 3224  term_variables(List,VC),
 3225  get_next_rule_number(M,R),
 3226  get_probs(HeadList,Probs),%***test single_vars
 3227  (M:local_setting(single_var,true)->
 3228    generate_clause(H,Env,Body2,[],R,Probs,BDDAnd,0,Clauses,Module,M)
 3229  ;
 3230    generate_clause(H,Env,Body2,VC,R,Probs,BDDAnd,0,Clauses,Module,M)
 3231  ).
 3232
 3233term_expansion_int((Head :- Body),M,(Clauses,[])) :-
 3234% definite clause for db facts
 3235  M:local_setting(compiling,on),
 3236  ((Head:-Body) \= ((sc_expansion(_,_)) :- _ )),
 3237  Head=db(Head1),!,
 3238  Clauses=(Head1 :- Body).
 3239
 3240term_expansion_int((Head :- Body),M,(Clauses,[def_rule(Head,BodyList,true)])) :-
 3241% definite clause with depth_bound
 3242  M:local_setting(compiling,on),
 3243  M:local_setting(depth_bound,true),
 3244   ((Head:-Body) \= ((sc_expansion(_,_)) :- _ )),!,
 3245  list2and(BodyList, Body),
 3246  process_body_db(BodyList,BDD,BDDAnd,DB,[],_Vars,BodyList2,Env,Module,M),
 3247  append([slipcover:onec(Env,BDD)],BodyList2,BodyList3),
 3248  list2and(BodyList3,Body1),
 3249  add_bdd_arg_db(Head,Env,BDDAnd,DBH,Module,Head1),
 3250  Clauses=(Head1 :- (DBH>=1,DB is DBH-1,Body1)).
 3251
 3252term_expansion_int((Head :- Body),M,(Clauses,[def_rule(Head,BodyList,true)])) :-
 3253% definite clause senza DB
 3254  M:local_setting(compiling,on),
 3255  ((Head:-Body) \= ((sc_expansion(_,_)) :- _ )),!,
 3256  list2and(BodyList, Body),
 3257  process_body(BodyList,BDD,BDDAnd,[],_Vars,BodyList2,Env,Module,M),
 3258  append([slipcover:onec(Env,BDD)],BodyList2,BodyList3),
 3259  list2and(BodyList3,Body2),
 3260  add_bdd_arg(Head,Env,BDDAnd,Module,Head1),
 3261  Clauses=(Head1 :- Body2).
 3262
 3263term_expansion_int(Head,M,(Clauses,[rule(R,HeadList,[],true,fixed)])) :-
 3264  M:local_setting(compiling,on),
 3265  M:local_setting(depth_bound,true),
 3266% disjunctive FACT with more than one head atom e db, fixed par
 3267  Head=(_:p(_);_), !,
 3268  list2or(HeadListOr, Head),
 3269  process_head_fixed(HeadListOr,M,0,HeadList),
 3270  term_variables(HeadList,VC),
 3271  get_next_rule_number(M,R),
 3272  get_probs(HeadList,Probs),
 3273  (M:local_setting(single_var,true)->
 3274    generate_rules_fact_db(HeadList,_Env,[],R,Probs,0,Clauses,_Module,M)
 3275  ;
 3276    generate_rules_fact_db(HeadList,_Env,VC,R,Probs,0,Clauses,_Module,M)
 3277  ).
 3278
 3279
 3280term_expansion_int(Head,M,(Clauses,[rule(R,HeadList,[],true,fixed)])) :-
 3281  M:local_setting(compiling,on),
 3282% disjunctive fact with more than one head atom senza db, fixed par
 3283  Head=(_:p(_);_), !,
 3284  list2or(HeadListOr, Head),
 3285  process_head_fixed(HeadListOr,M,0,HeadList),
 3286  term_variables(HeadList,VC),
 3287  get_next_rule_number(M,R),
 3288  get_probs(HeadList,Probs), %**** test single_var
 3289  (M:local_setting(single_var,true)->
 3290    generate_rules_fact(HeadList,_Env,[],R,Probs,0,Clauses,_Module,M)
 3291  ;
 3292    generate_rules_fact(HeadList,_Env,VC,R,Probs,0,Clauses,_Module,M)
 3293  ).
 3294
 3295term_expansion_int(Head,M,(Clauses,[Rule])) :-
 3296  M:local_setting(compiling,on),
 3297  M:local_setting(depth_bound,true),
 3298% disjunctive FACT with more than one head atom e db with individual pars
 3299  Head = (_H:A;_),
 3300  A=..[t,_P|_],
 3301  !,
 3302  list2or(HeadList0, Head),
 3303  append(HeadList0,['':_],HeadList),
 3304  gen_cl_db_fact_t(M,HeadList,Clauses,Rule).
 3305
 3306term_expansion_int(Head,M,(Clauses,[Rule])) :-
 3307  M:local_setting(compiling,on),
 3308% disjunctive FACT with more than one head atom wo db with individual pars
 3309  Head = (_H:A;_),
 3310  A=..[t,_P|_],
 3311  !,
 3312  list2or(HeadList0, Head),
 3313  append(HeadList0,['':_],HeadList),
 3314  gen_cl_fact_t(M,HeadList,Clauses,Rule).
 3315
 3316term_expansion_int(Head,M,(Clauses,[rule(R,HeadList,[],true,tunable)])) :-
 3317  M:local_setting(compiling,on),
 3318  M:local_setting(depth_bound,true),
 3319% disjunctive FACT with more than one head atom e db
 3320  Head=(_;_), !,
 3321  list2or(HeadListOr, Head),
 3322  process_head(HeadListOr,M,HeadList),
 3323  term_variables(HeadList,VC),
 3324  get_next_rule_number(M,R),
 3325  get_probs(HeadList,Probs),
 3326  (M:local_setting(single_var,true)->
 3327    generate_rules_fact_db(HeadList,_Env,[],R,Probs,0,Clauses,_Module,M)
 3328  ;
 3329    generate_rules_fact_db(HeadList,_Env,VC,R,Probs,0,Clauses,_Module,M)
 3330  ).
 3331
 3332
 3333term_expansion_int(Head,M,(Clauses,[rule(R,HeadList,[],true,tunable)])) :-
 3334  M:local_setting(compiling,on),
 3335% disjunctive fact with more than one head atom senza db
 3336  Head=(_;_), !,
 3337  list2or(HeadListOr, Head),
 3338  process_head(HeadListOr,M,HeadList),
 3339  term_variables(HeadList,VC),
 3340  get_next_rule_number(M,R),
 3341  get_probs(HeadList,Probs), %**** test single_var
 3342  (M:local_setting(single_var,true)->
 3343    generate_rules_fact(HeadList,_Env,[],R,Probs,0,Clauses,_Module,M)
 3344  ;
 3345    generate_rules_fact(HeadList,_Env,VC,R,Probs,0,Clauses,_Module,M)
 3346  ).
 3347
 3348term_expansion_int(Head,M,([],[])) :-
 3349  M:local_setting(compiling,on),
 3350% disjunctive fact with a single head atom con prob. 0
 3351  (Head \= ((sc_expansion(_,_)) :- _ )),
 3352  Head = (_H:P),number(P),P=:=0.0, !.
 3353
 3354term_expansion_int(Head,M,(Clause,[def_rule(H,[],true)])) :-
 3355  M:local_setting(compiling,on),
 3356  M:local_setting(depth_bound,true),
 3357% disjunctive fact with a single head atom con prob.1 e db
 3358  (Head \= ((sc_expansion(_,_)) :- _ )),
 3359  Head = (H:P),number(P),P=:=1.0, !,
 3360  list2and([slipcover:onec(Env,BDD)],Body1),
 3361  add_bdd_arg_db(H,Env,BDD,_DB,_Module,Head1),
 3362  Clause=(Head1 :- Body1).
 3363
 3364term_expansion_int(Head,M,(Clause,[def_rule(H,[],true)])) :-
 3365  M:local_setting(compiling,on),
 3366% disjunctive fact with a single head atom con prob. 1, senza db
 3367  (Head \= ((sc_expansion(_,_)) :- _ )),
 3368  Head = (H:P),number(P),P=:=1.0, !,
 3369  list2and([slipcover:onec(Env,BDD)],Body1),
 3370  add_bdd_arg(H,Env,BDD,_Module,Head1),
 3371  Clause=(Head1 :- Body1).
 3372
 3373term_expansion_int(Head,M,(Clause,[rule(R,HeadList,[],true,fixed)])) :-
 3374  M:local_setting(compiling,on),
 3375  M:local_setting(depth_bound,true),
 3376% disjunctive fact with a single head atom e prob. generiche, con db, fixed par
 3377  (Head \= ((sc_expansion(_,_)) :- _ )),
 3378  Head=(H:p(_)), !,
 3379  list2or(HeadListOr, Head),
 3380  process_head_fixed(HeadListOr,M,0,HeadList),
 3381  term_variables(HeadList,VC),
 3382  get_next_rule_number(M,R),
 3383  get_probs(HeadList,Probs),
 3384  add_bdd_arg_db(H,Env,BDD,_DB,_Module,Head1),
 3385  (M:local_setting(single_var,true)->
 3386    Clause=(Head1:-(slipcover:get_sc_var_n(M,Env,R,[],Probs,V),slipcover:equalityc(Env,V,0,BDD)))
 3387  ;
 3388    Clause=(Head1:-(slipcover:get_sc_var_n(M,Env,R,VC,Probs,V),slipcover:equalityc(Env,V,0,BDD)))
 3389  ).
 3390
 3391term_expansion_int(Head,M,(Clause,[rule(R,HeadList,[],true,fixed)])) :-
 3392  M:local_setting(compiling,on),
 3393% disjunctive fact with a single head atom e prob. generiche, senza db, fixed par
 3394  (Head \= ((sc_expansion(_,_)) :- _ )),
 3395  Head=(H:p(_)), !,
 3396  list2or(HeadListOr, Head),
 3397  process_head_fixed(HeadListOr,M,0,HeadList),
 3398  term_variables(HeadList,VC),
 3399  get_next_rule_number(M,R),
 3400  get_probs(HeadList,Probs),
 3401  add_bdd_arg(H,Env,BDD,_Module,Head1),%***test single_var
 3402  (M:local_setting(single_var,true)->
 3403    Clause=(Head1:-(slipcover:get_sc_var_n(M,Env,R,[],Probs,V),slipcover:equalityc(Env,V,0,BDD)))
 3404  ;
 3405    Clause=(Head1:-(slipcover:get_sc_var_n(M,Env,R,VC,Probs,V),slipcover:equalityc(Env,V,0,BDD)))
 3406  ).
 3407
 3408
 3409term_expansion_int(Head,M,(Clauses,[Rule])) :-
 3410  M:local_setting(compiling,on),
 3411  M:local_setting(depth_bound,true),
 3412% disjunctive FACT with a sigble head atom e db with individual pars
 3413  Head = (H:A),
 3414  A=..[t,_P|_],
 3415  !,
 3416  HeadList=[H:0.5,'':0.5],
 3417  gen_cl_db_fact_t(M,HeadList,Clauses,Rule).
 3418
 3419term_expansion_int(Head,M,(Clauses,[Rule])) :-
 3420  M:local_setting(compiling,on),
 3421% disjunctive FACT with a single head atom wo db with individual pars
 3422  Head = (H:A),
 3423  A=..[t,_P|_],
 3424  !,
 3425  HeadList=[H:0.5,'':0.5],
 3426  gen_cl_fact_t(M,HeadList,Clauses,Rule).
 3427
 3428term_expansion_int(Head,M,(Clause,[rule(R,HeadList,[],true,tunable)])) :-
 3429  M:local_setting(compiling,on),
 3430  M:local_setting(depth_bound,true),
 3431% disjunctive fact with a single head atom e prob. generiche, con db
 3432  (Head \= ((sc_expansion(_,_)) :- _ )),
 3433  Head=(H:_), !,
 3434  list2or(HeadListOr, Head),
 3435  process_head(HeadListOr,M,HeadList),
 3436  term_variables(HeadList,VC),
 3437  get_next_rule_number(M,R),
 3438  get_probs(HeadList,Probs),
 3439  add_bdd_arg_db(H,Env,BDD,_DB,_Module,Head1),
 3440  (M:local_setting(single_var,true)->
 3441    Clause=(Head1:-(slipcover:get_sc_var_n(M,Env,R,[],Probs,V),slipcover:equalityc(Env,V,0,BDD)))
 3442  ;
 3443    Clause=(Head1:-(slipcover:get_sc_var_n(M,Env,R,VC,Probs,V),slipcover:equalityc(Env,V,0,BDD)))
 3444  ).
 3445
 3446term_expansion_int(Head,M,(Clause,[rule(R,HeadList,[],true,tunable)])) :-
 3447  M:local_setting(compiling,on),
 3448% disjunctive fact with a single head atom e prob. generiche, senza db
 3449  (Head \= ((sc_expansion(_,_)) :- _ )),
 3450  Head=(H:_), !,
 3451  list2or(HeadListOr, Head),
 3452  process_head(HeadListOr,M,HeadList),
 3453  term_variables(HeadList,VC),
 3454  get_next_rule_number(M,R),
 3455  get_probs(HeadList,Probs),
 3456  add_bdd_arg(H,Env,BDD,_Module,Head1),%***test single_var
 3457  (M:local_setting(single_var,true)->
 3458    Clause=(Head1:-(slipcover:get_sc_var_n(M,Env,R,[],Probs,V),slipcover:equalityc(Env,V,0,BDD)))
 3459  ;
 3460    Clause=(Head1:-(slipcover:get_sc_var_n(M,Env,R,VC,Probs,V),slipcover:equalityc(Env,V,0,BDD)))
 3461  ).
 3462
 3463term_expansion_int(Head,M, ((Head1:-slipcover:onec(Env,One)),[def_rule(Head,[],true)])) :-
 3464  M:local_setting(compiling,on),
 3465  M:local_setting(depth_bound,true),
 3466% definite fact with db
 3467  (Head \= ((sc_expansion(_,_) ):- _ )),
 3468  (Head\= end_of_file),!,
 3469  add_bdd_arg_db(Head,Env,One,_DB,_Module,Head1).
 3470
 3471term_expansion_int(Head,M, ((Head1:-slipcover:onec(Env,One)),[def_rule(Head,[],true)])) :-
 3472  M:local_setting(compiling,on),
 3473% definite fact without db
 3474  (Head \= ((sc_expansion(_,_) ):- _ )),
 3475  (Head\= end_of_file),!,
 3476  add_bdd_arg(Head,Env,One,_Module,Head1).
 3477
 3478/*-----------*/
 3479
 3480
 3481
 3482:- multifile sandbox:safe_meta/2. 3483
 3484sandbox:safe_meta(slipcover:induce_par(_,_) ,[]).
 3485sandbox:safe_meta(slipcover:induce(_,_), []).
 3486sandbox:safe_meta(slipcover:get_node(_,_), []).
 3487sandbox:safe_meta(slipcover:test_prob(_,_,_,_,_,_), []).
 3488sandbox:safe_meta(slipcover:test(_,_,_,_,_,_,_), []).
 3489sandbox:safe_meta(slipcover:set_sc(_,_), []).
 3490sandbox:safe_meta(slipcover:setting_sc(_,_), []).
 3491
 3492
 3493
 3494test_no_area(TestSet,M,NPos,NNeg,CLL,Results):-
 3495  test_folds(TestSet,M,[],Results,0,NPos,0,NNeg,0,CLL).
 3496
 3497
 3498test_folds([],_M,LG,LG,Pos,Pos,Neg,Neg,CLL,CLL).
 3499
 3500test_folds([HT|TT],M,LG0,LG,Pos0,Pos,Neg0,Neg,CLL0,CLL):-
 3501  test_1fold(HT,M,LG1,Pos1,Neg1,CLL1),
 3502  append(LG0,LG1,LG2),
 3503  Pos2 is Pos0+Pos1,
 3504  Neg2 is Neg0+Neg1,
 3505  CLL2 is CLL0+CLL1,
 3506  test_folds(TT,M,LG2,LG,Pos2,Pos,Neg2,Neg,CLL2,CLL).
 3507
 3508test_1fold(F,M,LGOrd,Pos,Neg,CLL1):-
 3509  find_ex(F,M,LG,Pos,Neg),
 3510  compute_CLL_atoms(LG,M,0,0,CLL1,LG1),
 3511  keysort(LG1,LGOrd).
 3512
 3513
 3514find_ex(DB,M,LG,Pos,Neg):-
 3515  findall(P/A,M:output(P/A),LP),
 3516  M:local_setting(neg_ex,given),!,
 3517  find_ex_pred(LP,M,DB,[],LG,0,Pos,0,Neg).
 3518
 3519find_ex(DB,M,LG,Pos,Neg):-
 3520  findall(P/A,M:output(P/A),LP),
 3521  M:local_setting(neg_ex,cw),
 3522  find_ex_pred_cw(LP,M,DB,[],LG,0,Pos,0,Neg).
 3523
 3524
 3525find_ex_pred([],_M,_DB,LG,LG,Pos,Pos,Neg,Neg).
 3526
 3527find_ex_pred([P/A|T],M,DB,LG0,LG,Pos0,Pos,Neg0,Neg):-
 3528  functor(At,P,A),
 3529  find_ex_db(DB,M,At,LG0,LG1,Pos0,Pos1,Neg0,Neg1),
 3530  find_ex_pred(T,M,DB,LG1,LG,Pos1,Pos,Neg1,Neg).
 3531
 3532find_ex_db([],_M,_At,LG,LG,Pos,Pos,Neg,Neg).
 3533
 3534find_ex_db([H|T],M,At,LG0,LG,Pos0,Pos,Neg0,Neg):-
 3535  At=..[P|L],
 3536  At1=..[P,H|L],
 3537  findall(At1,M:At1,LP),
 3538  findall(\+ At1,M:neg(At1),LN),
 3539  length(LP,NP),
 3540  length(LN,NN),
 3541  append([LG0,LP,LN],LG1),
 3542  Pos1 is Pos0+NP,
 3543  Neg1 is Neg0+NN,
 3544  find_ex_db(T,M,At,LG1,LG,Pos1,Pos,Neg1,Neg).
 3545
 3546
 3547find_ex_pred_cw([],_M,_DB,LG,LG,Pos,Pos,Neg,Neg).
 3548
 3549find_ex_pred_cw([P/A|T],M,DB,LG0,LG,Pos0,Pos,Neg0,Neg):-
 3550  functor(At,P,A),
 3551  findall(Types,get_types(At,M,Types),LT),
 3552  append(LT,LLT),
 3553  remove_duplicates(LLT,Types1),
 3554  find_ex_db_cw(DB,M,At,Types1,LG0,LG1,Pos0,Pos1,Neg0,Neg1),
 3555  find_ex_pred_cw(T,M,DB,LG1,LG,Pos1,Pos,Neg1,Neg).
 3556
 3557get_types(At,_M,[]):-
 3558  At=..[_],!.
 3559
 3560get_types(At,M,Types):-
 3561  M:modeh(_,At),
 3562  At=..[_|Args],
 3563  get_args(Args,Types).
 3564
 3565get_types(At,M,Types):-
 3566  M:modeh(_,HT,_,_),
 3567  member(At,HT),
 3568  At=..[_|Args],
 3569  get_args(Args,Types).
 3570
 3571
 3572get_args([],[]).
 3573
 3574get_args([+H|T],[H|T1]):-!,
 3575  get_args(T,T1).
 3576
 3577get_args([-H|T],[H|T1]):-!,
 3578  get_args(T,T1).
 3579
 3580get_args([#H|T],[H|T1]):-!,
 3581  get_args(T,T1).
 3582
 3583get_args([-#H|T],[H|T1]):-!,
 3584  get_args(T,T1).
 3585
 3586get_args([H|T],[H|T1]):-
 3587  get_args(T,T1).
 3588
 3589
 3590
 3591
 3592get_constants([],_M,_Mod,[]).
 3593
 3594get_constants([Type|T],M,Mod,[(Type,Co)|C]):-
 3595  find_pred_using_type(Type,Mod,LP),
 3596  find_constants(LP,M,Mod,[],Co),
 3597  get_constants(T,M,Mod,C).
 3598
 3599find_pred_using_type(T,M,L):-
 3600  (setof((P,Ar,A),pred_type(T,M,P,Ar,A),L)->
 3601    true
 3602  ;
 3603    L=[]
 3604  ).
 3605
 3606pred_type(T,M,P,Ar,A):-
 3607  M:modeh(_,S),
 3608  S=..[P|Args],
 3609  length(Args,Ar),
 3610  scan_args(Args,T,1,A).
 3611
 3612pred_type(T,M,P,Ar,A):-
 3613  M:modeb(_,S),
 3614  S=..[P|Args],
 3615  length(Args,Ar),
 3616  scan_args(Args,T,1,A).
 3617
 3618scan_args([+T|_],T,A,A):-!.
 3619
 3620scan_args([-T|_],T,A,A):-!.
 3621
 3622scan_args([#T|_],T,A,A):-!.
 3623
 3624scan_args([-#T|_],T,A,A):-!.
 3625
 3626scan_args([_|Tail],T,A0,A):-
 3627  A1 is A0+1,
 3628  scan_args(Tail,T,A1,A).
 3629
 3630find_constants([],_M,_Mod,C,C).
 3631
 3632find_constants([(P,Ar,A)|T],M,Mod,C0,C):-
 3633  gen_goal(1,Ar,A,Args,ArgsNoV,V),
 3634  G=..[P,M|Args],
 3635  (setof(V,ArgsNoV^call_goal(Mod,G),LC)->
 3636    true
 3637  ;
 3638    LC=[]
 3639  ),
 3640  append(C0,LC,C1),
 3641  remove_duplicates(C1,C2),
 3642  find_constants(T,M,Mod,C2,C).
 3643
 3644call_goal(M,G):-
 3645  M:G.
 3646
 3647gen_goal(Arg,Ar,_A,[],[],_):-
 3648  Arg =:= Ar+1,!.
 3649
 3650gen_goal(A,Ar,A,[V|Args],ArgsNoV,V):-!,
 3651  Arg1 is A+1,
 3652  gen_goal(Arg1,Ar,A,Args,ArgsNoV,V).
 3653
 3654gen_goal(Arg,Ar,A,[ArgV|Args],[ArgV|ArgsNoV],V):-
 3655  Arg1 is Arg+1,
 3656  gen_goal(Arg1,Ar,A,Args,ArgsNoV,V).
 3657
 3658
 3659
 3660find_ex_db_cw([],_M,_At,_Ty,LG,LG,Pos,Pos,Neg,Neg).
 3661
 3662find_ex_db_cw([H|T],M,At,Types,LG0,LG,Pos0,Pos,Neg0,Neg):-
 3663  get_constants(Types,H,M,C),
 3664  At=..[P|L],
 3665  get_types(At,M,TypesA),!,
 3666  length(L,N),
 3667  length(LN,N),
 3668  At1=..[P,H|LN],
 3669  findall(At1,M:At1,LP),
 3670  (setof(\+ At1,neg_ex(LN,M,TypesA,At1,C),LNeg)->true;LNeg=[]),
 3671  length(LP,NP),
 3672  length(LNeg,NN),
 3673  append([LG0,LP,LNeg],LG1),
 3674  Pos1 is Pos0+NP,
 3675  Neg1 is Neg0+NN,
 3676  find_ex_db_cw(T,M,At,Types,LG1,LG,Pos1,Pos,Neg1,Neg).
 3677
 3678neg_ex([],M,[],At1,_C):-
 3679  \+ M:At1.
 3680
 3681neg_ex([H|T],M,[HT|TT],At1,C):-
 3682  member((HT,Co),C),
 3683  member(H,Co),
 3684  neg_ex(T,M,TT,At1,C).
 3685
 3686compute_CLL_atoms([],_M,_N,CLL,CLL,[]):-!.
 3687
 3688compute_CLL_atoms([\+ H|T],M,N,CLL0,CLL1,[PG- (\+ H)|T1]):-!,
 3689  init(Env),
 3690  abolish_all_tables,
 3691  get_node(H,M,Env,BDD),!,
 3692  ret_prob(Env,BDD,PG),
 3693  end(Env),!,
 3694  PG1 is 1-PG,
 3695  (PG1=:=0.0->
 3696    M:local_setting(logzero,LZ),
 3697    CLL2 is CLL0+LZ
 3698  ;
 3699    CLL2 is CLL0+ log(PG1)
 3700  ),
 3701  N1 is N+1,
 3702  compute_CLL_atoms(T,M,N1,CLL2,CLL1,T1).
 3703
 3704compute_CLL_atoms([H|T],M,N,CLL0,CLL1,[PG-H|T1]):-
 3705  init(Env),
 3706  abolish_all_tables,
 3707  get_node(H,M,Env,BDD),!,
 3708  ret_prob(Env,BDD,PG),
 3709  end(Env),!,
 3710  (PG=:=0.0->
 3711    M:local_setting(logzero,LZ),
 3712    CLL2 is CLL0+LZ
 3713  ;
 3714    CLL2 is CLL0+ log(PG)
 3715  ),
 3716  N1 is N+1,
 3717  compute_CLL_atoms(T,M,N1,CLL2,CLL1,T1).
 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 /
 3726write2(M,A):-
 3727  M:local_setting(verbosity,Ver),
 3728  (Ver>1->
 3729    write(A)
 3730  ;
 3731    true
 3732  ).
 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. /
 3739write3(M,A):-
 3740  M:local_setting(verbosity,Ver),
 3741  (Ver>2->
 3742    write(A)
 3743  ;
 3744    true
 3745  ).
 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. /
 3752nl2(M):-
 3753  M:local_setting(verbosity,Ver),
 3754  (Ver>1->
 3755    nl
 3756  ;
 3757    true
 3758  ).
 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. /
 3765nl3(M):-
 3766  M:local_setting(verbosity,Ver),
 3767  (Ver>2->
 3768    nl
 3769  ;
 3770    true
 3771  ).
 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. /
 3778format2(M,A,B):-
 3779  M:local_setting(verbosity,Ver),
 3780  (Ver>1->
 3781    format(A,B)
 3782  ;
 3783    true
 3784  ).
 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. /
 3791format3(M,A,B):-
 3792  M:local_setting(verbosity,Ver),
 3793  (Ver>2->
 3794    format(A,B)
 3795  ;
 3796    true
 3797  ).
 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. /
 3804write_rules2(M,A,B):-
 3805  M:local_setting(verbosity,Ver),
 3806  (Ver>1->
 3807    write_rules(A,B)
 3808  ;
 3809    true
 3810  ).
 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. /
 3817write_rules3(M,A,B):-
 3818  M:local_setting(verbosity,Ver),
 3819  (Ver>2->
 3820    write_rules(A,B)
 3821  ;
 3822    true
 3823  ).
 3824
 3825
 3826write_disj_clause2(M,A,B):-
 3827  M:local_setting(verbosity,Ver),
 3828  (Ver>1->
 3829    write_disj_clause(A,B)
 3830  ;
 3831    true
 3832  ).
 3833
 3834write_disj_clause3(M,A,B):-
 3835  M:local_setting(verbosity,Ver),
 3836  (Ver>2->
 3837    write_disj_clause(A,B)
 3838  ;
 3839    true
 3840  ).
 3841
 3842write_body2(M,A,B):-
 3843  M:local_setting(verbosity,Ver),
 3844  (Ver>1->
 3845    write_body(A,B)
 3846  ;
 3847    true
 3848  ).
 3849
 3850write_body3(M,A,B):-
 3851  M:local_setting(verbosity,Ver),
 3852  (Ver>2->
 3853    write_body(A,B)
 3854  ;
 3855    true
 3856  ).
 tab(+Module:atom, +PredSpec:pred_spec, -TableSpec:term) is det
Records the fact that predicate PredSpec must be tabled and returns the necessary term for the tabling directive in TableSpec. Module is used to store the information in the correct module /
 3865tab(M,A/B,P):-
 3866  length(Args0,B),
 3867  (M:local_setting(depth_bound,true)->
 3868    ExtraArgs=[_,_,_,lattice(slipcover:orc/3)]
 3869  ;
 3870    ExtraArgs=[_,_,lattice(slipcover:orc/3)]
 3871  ),
 3872  append(Args0,ExtraArgs,Args),
 3873  P=..[A|Args],
 3874  PT=..[A|Args0],
 3875  (M:tabled(PT)->
 3876    true
 3877  ;
 3878    assert(M:tabled(PT))
 3879  ).
 zero_clause(+Module:atom, +PredSpec:pred_spec, -ZeroClause:term) is det
Generates the zero clause for predicate PredSpec. Module is the module of the input file. /
 3886zero_clause(M,A/B,(H:-maplist(nonvar,Args0),slipcover:zeroc(Env,BDD))):-
 3887  B1 is B+1,
 3888  length(Args0,B1),
 3889  (M:local_setting(depth_bound,true)->
 3890    ExtraArgs=[_,Env,BDD]
 3891  ;
 3892    ExtraArgs=[Env,BDD]
 3893  ),
 3894  append(Args0,ExtraArgs,Args),
 3895  H=..[A|Args].
 3896
 3897
 3898
 3899
 3900sc_expansion((:- begin_bg), []) :-
 3901  prolog_load_context(module, M),
 3902  sc_input_mod(M),!,
 3903  assert(M:bg_on).
 3904
 3905sc_expansion(C, M:bgc(C)) :-
 3906  prolog_load_context(module, M),
 3907  C\= (:- end_bg),
 3908  sc_input_mod(M),
 3909  M:bg_on,!.
 3910
 3911sc_expansion((:- end_bg), []) :-
 3912  prolog_load_context(module, M),
 3913  sc_input_mod(M),!,
 3914  retractall(M:bg_on),
 3915  findall(C,M:bgc(C),L),
 3916  retractall(M:bgc(_)),
 3917  (M:bg(BG0)->
 3918    retract(M:bg(BG0)),
 3919    append(BG0,L,BG),
 3920    assert(M:bg(BG))
 3921  ;
 3922    assert(M:bg(L))
 3923  ).
 3924
 3925sc_expansion((:- begin_in), []) :-
 3926  prolog_load_context(module, M),
 3927  sc_input_mod(M),!,
 3928  assert(M:in_on).
 3929
 3930sc_expansion(C, M:inc(C)) :-
 3931  prolog_load_context(module, M),
 3932  C\= (:- end_in),
 3933  sc_input_mod(M),
 3934  M:in_on,!.
 3935
 3936sc_expansion((:- end_in), []) :-
 3937  prolog_load_context(module, M),
 3938  sc_input_mod(M),!,
 3939  retractall(M:in_on),
 3940  findall(C,M:inc(C),L),
 3941  retractall(M:inc(_)),
 3942  (M:in(IN0)->
 3943    retract(M:in(IN0)),
 3944    append(IN0,L,IN),
 3945    assert(M:in(IN))
 3946  ;
 3947    assert(M:in(L))
 3948  ).
 3949
 3950sc_expansion(begin(model(I)), []) :-
 3951  prolog_load_context(module, M),
 3952  sc_input_mod(M),!,
 3953  retractall(M:model(_)),
 3954  assert(M:model(I)),
 3955  assert(M:int(I)).
 3956
 3957sc_expansion(end(model(_I)), []) :-
 3958  prolog_load_context(module, M),
 3959  sc_input_mod(M),!,
 3960  retractall(M:model(_)).
 3961
 3962sc_expansion(output(P/A), [output(P/A)|TabDir]) :-
 3963  prolog_load_context(module, M),
 3964  sc_input_mod(M),
 3965  M:local_setting(tabling,auto),!,
 3966  tab(M,P/A,P1),
 3967  zero_clause(M,P/A,Z),
 3968  system:term_expansion((:- table P1),TabDir),
 3969  assert(M:zero_clauses([Z])).
 3970
 3971sc_expansion(input(P/A), [input(P/A)|TabDir]) :-
 3972  prolog_load_context(module, M),
 3973  sc_input_mod(M),
 3974  M:local_setting(tabling,auto),!,
 3975  tab(M,P/A,P1),
 3976  zero_clause(M,P/A,Z),
 3977  system:term_expansion((:- table P1),TabDir),
 3978  assert(M:zero_clauses([Z])).
 3979
 3980sc_expansion(At, A) :-
 3981  prolog_load_context(module, M),
 3982  sc_input_mod(M),
 3983  M:model(Name),
 3984  At \= (_ :- _),
 3985  At \= end_of_file,
 3986  (At=neg(Atom)->
 3987    Atom=..[Pred|Args],
 3988    Atom1=..[Pred,Name|Args],
 3989    A=neg(Atom1)
 3990  ;
 3991    (At=prob(Pr)->
 3992      A='$prob'(Name,Pr)
 3993    ;
 3994      At=..[Pred|Args],
 3995      Atom1=..[Pred,Name|Args],
 3996      A=Atom1
 3997    )
 3998  ).
 3999
 4000:- thread_local sc_file/1. 4001
 4002user:term_expansion((:- sc), []) :-!,
 4003  prolog_load_context(source, Source),
 4004  asserta(sc_file(Source)),
 4005  prolog_load_context(module, M),
 4006  retractall(M:local_setting(_,_)),
 4007  findall(local_setting(P,V),default_setting_sc(P,V),L),
 4008  assert_all(L,M,_),
 4009  assert(sc_input_mod(M)),
 4010  retractall(M:rule_sc_n(_)),
 4011  assert(M:rule_sc_n(0)),
 4012  retractall(M:rule_ng_sc_n(_)),
 4013  assert(M:rule_ng_sc_n(0)),
 4014  M:dynamic((modeh/2,modeh/4,modeb/2,fixed_rule/3,banned/2,lookahead/2,
 4015    lookahead_cons/2,lookahead_cons_var/2,'$prob'/2,output/1,input/1,input_cw/1,
 4016    ref_clause/1,ref/1,model/1,neg/1,rule/5,determination/2,
 4017    bg_on/0,bg/1,bgc/1,in_on/0,in/1,inc/1,int/1,v/3,
 4018    query_rule/4,database/1,
 4019    zero_clauses/1,tabled/1,
 4020    fold/2)),
 4021  retractall(M:tabled(_)),
 4022  style_check(-discontiguous).
 4023
 4024user:term_expansion(end_of_file, C) :-
 4025  sc_file(Source),
 4026  prolog_load_context(source, Source),
 4027  retractall(sc_file(Source)),
 4028  prolog_load_context(module, M),
 4029  sc_input_mod(M),!,
 4030  retractall(sc_input_mod(M)),
 4031  make_dynamic(M),
 4032  findall(LZ,M:zero_clauses(LZ),L0),
 4033  append(L0,L),
 4034  retractall(M:zero_clauses(_)),
 4035%  retractall(M:tabled(_)),
 4036  %retractall(sc_input_mod(M)),
 4037  append(L,[(:- style_check(+discontiguous)),end_of_file],C).
 4038
 4039user:term_expansion(In, Out) :-
 4040  \+ current_prolog_flag(xref, true),
 4041  sc_file(Source),
 4042  prolog_load_context(source, Source),
 4043  sc_expansion(In, Out)