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]).
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
85default_setting_sc(epsilon_sem,2).
86
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).
111default_setting_sc(specialize_head,false).
112
113default_setting_sc(seed,seed(3032)).
114default_setting_sc(c_seed,21344).
115default_setting_sc(score,ll).
117default_setting_sc(neg_ex,cw).
118
119
120default_setting_sc(epsilon_parsing, 1e-5).
121default_setting_sc(tabling,auto).
126
127default_setting_sc(bagof,false).
129
130default_setting_sc(compiling,off).
131
132
133default_setting_sc(depth_bound,true). 134default_setting_sc(depth,2).
135default_setting_sc(single_var,true). 136
137default_setting_sc(prob_approx,false). 138default_setting_sc(approx_value,100).
139
140default_setting_sc(alpha,0.0).
153induce(M:TrainFolds,P):-
154 must_be(list,TrainFolds),
155 must_be(var,P),
156 induce_rules(M:TrainFolds,P0),
157 rules2terms(P0,P).
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).
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).
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):- 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):-!. 361
362cycle_structure(_CL,_Mod,R,S,_SP,_DB,R,S,0):-!. 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,[]),! 397 ;
398 derive_bdd_nodes(DB,Mod,ExData,NEx,[],Nodes,0,CLL0),! 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), 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), 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).
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 ; 515 Info=[Info0]
516 )
517 ).
529learn_params(DB,M,R0,R,Score):- 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), 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, 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),!, 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):- 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
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 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), 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), 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
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
1062
1063
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).
1146list2or([],true):-!.
1147
1148list2or([X],X):-
1149 X\=;(_,_),!.
1150
1151list2or([H|T],(H ; Ta)):-!,
1152 list2or(T,Ta).
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), 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).
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
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).
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), 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), 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
([],_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).
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
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
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), 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
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), 1745 Lit\='',
1746 update_head1(LH1,L-1,LH2). 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).
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).
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).
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).
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).
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).
2034delete_one([X|R],R,X).
2035
2036delete_one([X|R],[X|R1],D):-
2037 delete_one(R,R1,D).
2038
2039
2040
2041
2043dv(H,B,M,DV1):- 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
2070head_depth([],[]).
2071head_depth([V|R],[[V,0]|R1]):-
2072 head_depth(R,R1).
2073
2075var_depth([],_M,PrevDs1,PrevDs1,MD,MD):-!.
2076
2077var_depth([L|R],M,PrevDs,PrevDs1,_MD,MD):- 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), 2082 D is MaxD+1,
2083 compute_depth(OutputVars,D,PrevDs,PrevDs0), 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
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
2136exceed_depth([],_):-!.
2137exceed_depth([H|T],MD):-
2138 nth1(2,H,Dep),
2139 Dep<MD, 2140 exceed_depth(T,MD).
2141
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).
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 ).
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).
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)).
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), 2284 (M:Goal1->
2285 (_,BDD)=B
2286 ;
2287 zeroc(Env,(_,BDD))
2288 ).
2289
2290get_node(Goal,M,Env,BDD):- 2291 retractall(M:v(_,_,_)),
2292 add_bdd_arg(Goal,Env,B,Goal1),
2293 abolish_all_tables,
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),!, 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):-!, 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)).
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)).
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).
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
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), 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),!, 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):-!,
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) :- !, 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)].
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),!, 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),!,
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):-!,
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) :-
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) :- !, 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)].
2845generate_clauses_bg([],[]):-!.
2846
2847generate_clauses_bg([H|T],[CL|T1]):-
2848 gen_clause_bg(H,CL), 2849 generate_clauses_bg(T,T1).
2850
2851gen_clause_bg(def_rule(H,BodyList,_Lit),Clauses) :-
2853 process_body_bg(BodyList,BodyList2,Module),
2854 list2and(BodyList2,Body1),
2855 add_mod_arg(H,Module,Head1),
2856 Clauses=(Head1 :- Body1).
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),
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),
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),
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),
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),
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),
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])) :-
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),
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)])) :-
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), 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)])) :-
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), 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, ([],[])) :-
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)])) :-
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)])) :-
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)])) :-
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), 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)])) :-
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), 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,[])) :-
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)])) :-
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)])) :-
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),
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),
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), 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),
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),
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),
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),
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), 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),
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),
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),
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),
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),
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), 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),
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),
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),
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),
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), 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),
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),
3474 (Head \= ((sc_expansion(_,_) ):- _ )),
3475 (Head\= end_of_file),!,
3476 add_bdd_arg(Head,Env,One,_Module,Head1).
3477
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).
3726write2(M,A):-
3727 M:local_setting(verbosity,Ver),
3728 (Ver>1->
3729 write(A)
3730 ;
3731 true
3732 ).
3739write3(M,A):-
3740 M:local_setting(verbosity,Ver),
3741 (Ver>2->
3742 write(A)
3743 ;
3744 true
3745 ).
3752nl2(M):-
3753 M:local_setting(verbosity,Ver),
3754 (Ver>1->
3755 nl
3756 ;
3757 true
3758 ).
3765nl3(M):-
3766 M:local_setting(verbosity,Ver),
3767 (Ver>2->
3768 nl
3769 ;
3770 true
3771 ).
3778format2(M,A,B):-
3779 M:local_setting(verbosity,Ver),
3780 (Ver>1->
3781 format(A,B)
3782 ;
3783 true
3784 ).
3791format3(M,A,B):-
3792 M:local_setting(verbosity,Ver),
3793 (Ver>2->
3794 format(A,B)
3795 ;
3796 true
3797 ).
3804write_rules2(M,A,B):-
3805 M:local_setting(verbosity,Ver),
3806 (Ver>1->
3807 write_rules(A,B)
3808 ;
3809 true
3810 ).
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 ).
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 ).
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(_)),
4036 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)
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