This repository has been archived on 2023-08-20. You can view files and clone it, but cannot push or open issues or pull requests.
yap-6.3/packages/cplint/slipcover/inference_sl.pl
Fabrizio Riguzzi cb304e781c slipcover
2013-09-04 18:58:00 +02:00

1083 lines
30 KiB
Prolog

/*
EMBLEM and SLIPCASE
Copyright (c) 2011, Fabrizio Riguzzi and Elena Bellodi
*/
:-use_module(library(lists)).
:-use_module(library(rbtrees)).
:-load_foreign_files(['bddem'],[],init_my_predicates).
:-dynamic p/2,rule_n/1,setting/2.
rule_n(0).
setting(epsilon_parsing, 1e-5).
setting(tabling, off).
/* on, off */
setting(bagof,false).
/* values: false, intermediate, all, extra */
setting(compiling,off).
:-yap_flag(unknown,fail).
setting(depth_bound,true). % if true, it limits the derivation of the example to the value of 'depth'
setting(depth,3).
setting(single_var,true). % false: 1 variable per grounding of rule; true: 1 variable per rule (even if a rule has more groundings),simpler/faster.
:- yap_flag(single_var_warnings, on).
load(FileIn,C1,R):-
open(FileIn,read,SI),
read_clauses_dir(SI,C),
close(SI),
process_clauses(C,[],C1,[],R).
add_inter_cl(CL):-
findall(A,(input(A)),L),
gen_cl(L,CL).
gen_cl([],[]).
gen_cl([H/A|T],[C|T1]):-
functor(F,H,A),
add_mod_arg(F,Module,F1),
add_bdd_arg(F,BDD,Module,F2),
C=(F2:-(F1,one(BDD))),
gen_cl(T,T1).
assert_all([]).
assert_all([H|T]):-
assert(H),
assert_all(T).
retract_all([]):-!.
retract_all([H|T]):-
retract(H),
retract_all(T).
read_clauses_dir(S,[Cl|Out]):-
read_term(S,Cl,[]),
(Cl=end_of_file->
Out=[]
;
read_clauses_dir(S,Out)
).
process_clauses([],C,C,R,R):-!.
process_clauses([end_of_file],C,C,R,R):-!.
process_clauses([H|T],C0,C1,R0,R1):-
(term_expansion(H,H1)->
true
;
H1=(H,[])
),
(H1=([_|_],R)->
H1=(List,R),
append(C0,List,C2),
append(R0,R,R2)
;
(H1=([],_R)->
C2=C0,
R2=R0
;
H1=(H2,R),
append(C0,[H2],C2),
append(R0,R,R2)
)
),
process_clauses(T,C2,C1,R2,R1).
get_next_rule_number(R):-
retract(rule_n(R)),
R1 is R+1,
assert(rule_n(R1)).
get_node(\+ Goal,BDD):-
setting(depth_bound,true),!,
setting(depth,DB),
retractall(v(_,_,_)),
add_bdd_arg_db(Goal,BDD,DB,Goal1),
(bagof(BDD,Goal1,L)->
or_list(L,B)
;
zero(B)
),
bdd_not(B,BDD).
get_node(\+ Goal,BDD):-!,
retractall(v(_,_,_)),
add_bdd_arg(Goal,BDD,Goal1),
(bagof(BDD,Goal1,L)->
or_list(L,B)
;
zero(B)
),
bdd_not(B,BDD).
get_node(Goal,B):-
setting(depth_bound,true),!,
setting(depth,DB),
retractall(v(_,_,_)),
add_bdd_arg_db(Goal,BDD,DB,Goal1),%DB=depth bound
(bagof(BDD,Goal1,L)->
or_list(L,B)
;
zero(B)
).
get_node(Goal,B):- %with DB=false
retractall(v(_,_,_)),
add_bdd_arg(Goal,BDD,Goal1),
(bagof(BDD,Goal1,L)->
or_list(L,B)
;
zero(B)
).
s(Goal,P,CPUTime1,0,WallTime1,0):-
statistics(cputime,[_,_]),
statistics(walltime,[_,_]),
init,
retractall(v(_,_,_)),
abolish_all_tables,
add_bdd_arg(Goal,BDD,Goal1),
(bagof(BDD,Goal1,L)->
or_list(L,B),
ret_prob(B,P)
;
P=0.0
),
end,
statistics(cputime,[_,CT1]),
CPUTime1 is CT1/1000,
statistics(walltime,[_,WT1]),
WallTime1 is WT1/1000.
get_var_n(R,S,Probs,V):-
(v(R,S,V)->
true
;
length(Probs,L),
add_var(L,Probs,R,V),
assert(v(R,S,V))
).
generate_rules_fact([],_VC,_R,_Probs,_N,[],_Module).
generate_rules_fact([Head:_P1,'':_P2],VC,R,Probs,N,[Clause],Module):-!,
add_bdd_arg(Head,BDD,Module,Head1),
Clause=(Head1:-(get_var_n(R,VC,Probs,V),equality(V,N,BDD))).
generate_rules_fact([Head:_P|T],VC,R,Probs,N,[Clause|Clauses],Module):-
add_bdd_arg(Head,BDD,Module,Head1),
Clause=(Head1:-(get_var_n(R,VC,Probs,V),equality(V,N,BDD))),
N1 is N+1,
generate_rules_fact(T,VC,R,Probs,N1,Clauses,Module).
generate_rules_fact_db([],_VC,_R,_Probs,_N,[],_Module).
generate_rules_fact_db([Head:_P1,'':_P2],VC,R,Probs,N,[Clause],Module):-!,
add_bdd_arg_db(Head,BDD,_DB,Module,Head1),
Clause=(Head1:-(get_var_n(R,VC,Probs,V),equality(V,N,BDD))).
generate_rules_fact_db([Head:_P|T],VC,R,Probs,N,[Clause|Clauses],Module):-
add_bdd_arg_db(Head,BDD,_DB,Module,Head1),
Clause=(Head1:-(get_var_n(R,VC,Probs,V),equality(V,N,BDD))),
N1 is N+1,
generate_rules_fact_db(T,VC,R,Probs,N1,Clauses,Module).
generate_clause(Head,Body,VC,R,Probs,BDDAnd,N,Clause,Module):-
add_bdd_arg(Head,BDD,Module,Head1),
Clause=(Head1:-(Body,get_var_n(R,VC,Probs,V),equality(V,N,B),and(BDDAnd,B,BDD))).
generate_clause_db(Head,Body,VC,R,Probs,DB,BDDAnd,N,Clause,Module):-
add_bdd_arg_db(Head,BDD,DBH,Module,Head1),
Clause=(Head1:-(DBH>=1,DB is DBH-1,Body,get_var_n(R,VC,Probs,V),equality(V,N,B),and(BDDAnd,B,BDD))).
generate_rules([],_Body,_VC,_R,_Probs,_BDDAnd,_N,[],_Module).
generate_rules([Head:_P1,'':_P2],Body,VC,R,Probs,BDDAnd,N,[Clause],Module):-!,
generate_clause(Head,Body,VC,R,Probs,BDDAnd,N,Clause,Module).
generate_rules([Head:_P|T],Body,VC,R,Probs,BDDAnd,N,[Clause|Clauses],Module):-
generate_clause(Head,Body,VC,R,Probs,BDDAnd,N,Clause,Module),
N1 is N+1,
generate_rules(T,Body,VC,R,Probs,BDDAnd,N1,Clauses,Module).
generate_rules_db([],_Body,_VC,_R,_Probs,_DB,_BDDAnd,_N,[],_Module):-!.
generate_rules_db([Head:_P1,'':_P2],Body,VC,R,Probs,DB,BDDAnd,N,[Clause],Module):-!,
generate_clause_db(Head,Body,VC,R,Probs,DB,BDDAnd,N,Clause,Module).
generate_rules_db([Head:_P|T],Body,VC,R,Probs,DB,BDDAnd,N,[Clause|Clauses],Module):-
generate_clause_db(Head,Body,VC,R,Probs,DB,BDDAnd,N,Clause,Module),!,
N1 is N+1,
generate_rules_db(T,Body,VC,R,Probs,DB,BDDAnd,N1,Clauses,Module).
process_body_database([],[],_Module).
process_body_database([H|T],[H1|T1],Module):-
add_mod_arg(H,H1,Module),
process_body_database(T,T1,Module).
process_body_db([],BDD,BDD,_DB,Vars,Vars,[],_Module):-!.
process_body_db([\+ H|T],BDD,BDD1,DB,Vars,Vars1,[\+ H|Rest],Module):-
builtin(H),!,
process_body_db(T,BDD,BDD1,DB,Vars,Vars1,Rest,Module).
process_body_db([\+ H|T],BDD,BDD1,DB,Vars,Vars1,[\+ H|Rest],Module):-
db(H),!,
process_body_db(T,BDD,BDD1,DB,Vars,Vars1,Rest,Module).
process_body_db([\+ H|T],BDD,BDD1,DB,Vars,Vars1,[
(((neg(H1);\+ H1),one(BDDN));(bagof(BDDH,H2,L)->or_list(L,BDDL),bdd_not(BDDL,BDDN);one(BDDN))),
and(BDD,BDDN,BDD2)
|Rest],Module):-
given(H),!,
add_mod_arg(H,Module,H1),
add_bdd_arg_db(H,BDDH,DB,Module,H2),
process_body_db(T,BDD2,BDD1,DB,Vars,Vars1,Rest,Module).
process_body_db([\+ H|T],BDD,BDD1,DB,Vars,Vars1,[
neg(H1)|Rest],Module):-
given_cw(H),!,
add_mod_arg(H,Module,H1),
process_body_db(T,BDD,BDD1,DB,Vars,Vars1,Rest,Module).
process_body_db([\+ H|T],BDD,BDD1,DB,Vars,[BDDH,BDDN,L,BDDL,BDD2|Vars1],
[(bagof(BDDH,H1,L)->or_list(L,BDDL),bdd_not(BDDL,BDDN);one(BDDN)),
and(BDD,BDDN,BDD2)|Rest],Module):-!,
add_bdd_arg_db(H,BDDH,DB,Module,H1),
process_body_db(T,BDD2,BDD1,DB,Vars,Vars1,Rest,Module).
process_body_db([H|T],BDD,BDD1,DB,Vars,Vars1,[H|Rest],Module):-
builtin(H),!,
process_body_db(T,BDD,BDD1,DB,Vars,Vars1,Rest,Module).
process_body_db([H|T],BDD,BDD1,DB,Vars,Vars1,[H|Rest],Module):-
db(H),!,
process_body_db(T,BDD,BDD1,DB,Vars,Vars1,Rest,Module).
process_body_db([H|T],BDD,BDD1,DB,Vars,Vars1,
[((H1,one(BDDH));H2),and(BDD,BDDH,BDD2)|Rest],Module):-
given(H),!,
add_mod_arg(H,Module,H1),
add_bdd_arg_db(H,BDDH,DB,Module,H2),
process_body_db(T,BDD2,BDD1,DB,Vars,Vars1,Rest,Module).
process_body_db([H|T],BDD,BDD1,DB,Vars,Vars1,
[H1|Rest],Module):-
given_cw(H),!,
add_mod_arg(H,Module,H1),
process_body_db(T,BDD,BDD1,DB,Vars,Vars1,Rest,Module).
process_body_db([H|T],BDD,BDD1,DB,Vars,[BDDH,BDD2|Vars1],
[H1,and(BDD,BDDH,BDD2)|Rest],Module):-!, %agg. cut
add_bdd_arg_db(H,BDDH,DB,Module,H1),
process_body_db(T,BDD2,BDD1,DB,Vars,Vars1,Rest,Module).
process_body_def_db([],BDD,BDD,_DB,Vars,Vars,[],_Module).
process_body_def_db([\+ H|T],BDD,BDD1,DB,Vars,Vars1,[\+ H|Rest],Module):-
builtin(H),!,
process_body_def_db(T,BDD,BDD1,DB,Vars,Vars1,Rest,Module).
process_body_def_db([\+ H|T],BDD,BDD1,DB,Vars,Vars1,[\+ H|Rest],Module):-
db(H),!,
process_body_def_db(T,BDD,BDD1,DB,Vars,Vars1,Rest,Module).
process_body_def_db([\+H|T],BDD,BDD1,DB,Vars,Vars1,
[(((neg(H1);\+ H1),one(BDDN));(bagof(BDDH,H2,L)->or_list(L,BDDL),bdd_not(BDDL,BDDN);one(BDDN))),
and(BDD,BDDN,BDD2)|Rest],
Module):-
given(H),!,
add_mod_arg(H,Module,H1),
add_bdd_arg_db(H,BDDH,DB,Module,H2),
process_body_def_db(T,BDD2,BDD1,DB,Vars,Vars1,Rest,Module).
process_body_def_db([\+H|T],BDD,BDD1,DB,Vars,Vars1,
[neg(H1)|Rest],
Module):-
given_cw(H),!,
add_mod_arg(H,Module,H1),
process_body_def_db(T,BDD,BDD1,DB,Vars,Vars1,Rest,Module).
process_body_def_db([\+H|T],BDD,BDD1,DB,Vars,[BDD,BDDH,L,BDDL,BDDN|Vars1],
[(bagof(BDDH,H1,L)->or_list(L,BDDL),bdd_not(BDDL,BDDN);one(BDDN)),
and(BDD,BDDN,BDD2)|Rest],Module):-!,
add_bdd_arg_db(H,BDDH,DB,Module,H1),
process_body_def_db(T,BDD2,BDD1,DB,Vars,Vars1,Rest,Module).
process_body_def_db([H|T],BDD,BDD1,DB,Vars,Vars1,[H|Rest],Module):-
builtin(H),!,
process_body_def_db(T,BDD,BDD1,DB,Vars,Vars1,Rest,Module).
process_body_def_db([H|T],BDD,BDD1,DB,Vars,Vars1,[H|Rest],Module):-
db(H),!,
process_body_def_db(T,BDD,BDD1,DB,Vars,Vars1,Rest,Module).
process_body_def_db([H|T],BDD,BDD1,DB,Vars,Vars1,[((H1,one(BDDH));H2),and(BDD,BDDH,BDD2)|Rest],Module):-
given(H),!,
add_mod_arg(H,Module,H1),
add_bdd_arg_db(H,BDDH,DB,Module,H2),
process_body_def_db(T,BDD2,BDD1,DB,Vars,Vars1,Rest,Module).
process_body_def_db([H|T],BDD,BDD1,DB,Vars,Vars1,[H1|Rest],Module):-
given_cw(H),!,
add_mod_arg(H,Module,H1),
process_body_def_db(T,BDD,BDD1,DB,Vars,Vars1,Rest,Module).
process_body_def_db([H|T],BDD,BDD1,DB,Vars,[BDD,BDDH|Vars1],[H1,and(BDD,BDDH,BDD2)|Rest],Module):-!,
add_bdd_arg_db(H,BDDH,DB,Module,H1),
process_body_def_db(T,BDD2,BDD1,DB,Vars,Vars1,Rest,Module).
process_body_def([],BDD,BDD,Vars,Vars,[],_Module).
process_body_def([\+ H|T],BDD,BDD1,Vars,Vars1,[\+ H|Rest],Module):-
builtin(H),!,
process_body_def(T,BDD,BDD1,Vars,Vars1,Rest,Module).
process_body_def([\+ H|T],BDD,BDD1,Vars,Vars1,[\+ H|Rest],Module):-
db(H),!,
process_body_def(T,BDD,BDD1,Vars,Vars1,Rest,Module).
process_body_def([\+H|T],BDD,BDD1,Vars,Vars1,
[(((neg(H1);\+ H1),one(BDDN));(bagof(BDDH,H2,L)->or_list(L,BDDL),bdd_not(BDDL,BDDN);one(BDDN))),
and(BDD,BDDN,BDD2)|Rest],
Module):-
given(H),!,
add_mod_arg(H,Module,H1),
add_bdd_arg(H,BDDH,Module,H2),
process_body_def(T,BDD2,BDD1,Vars,Vars1,Rest,Module).
process_body_def([\+H|T],BDD,BDD1,Vars,Vars1,
[neg(H1)|Rest],
Module):-
given_cw(H),!,
add_mod_arg(H,Module,H1),
process_body_def(T,BDD,BDD1,Vars,Vars1,Rest,Module).
process_body_def([\+H|T],BDD,BDD1,Vars,[BDD,BDDH,L,BDDL,BDDN|Vars1],
[(bagof(BDDH,H1,L)->or_list(L,BDDL),bdd_not(BDDL,BDDN);one(BDDN)),
and(BDD,BDDN,BDD2)|Rest],Module):-!,
add_bdd_arg(H,BDDH,Module,H1),
process_body_def(T,BDD2,BDD1,Vars,Vars1,Rest,Module).
process_body_def([H|T],BDD,BDD1,Vars,Vars1,[H|Rest],Module):-
builtin(H),!,
process_body_def(T,BDD,BDD1,Vars,Vars1,Rest,Module).
process_body_def([H|T],BDD,BDD1,Vars,Vars1,[H|Rest],Module):-
db(H),!,
process_body_def(T,BDD,BDD1,Vars,Vars1,Rest,Module).
process_body_def([H|T],BDD,BDD1,Vars,Vars1,[((H1,one(BDDH));H2),and(BDD,BDDH,BDD2)|Rest],Module):-
given(H),!,
add_mod_arg(H,Module,H1),
add_bdd_arg(H,BDDH,Module,H2),
process_body_def(T,BDD2,BDD1,Vars,Vars1,Rest,Module).
process_body_def([H|T],BDD,BDD1,Vars,Vars1,[H1|Rest],Module):-
given_cw(H),!,
add_mod_arg(H,Module,H1),
process_body_def(T,BDD,BDD1,Vars,Vars1,Rest,Module).
process_body_def([H|T],BDD,BDD1,Vars,[BDD,BDDH|Vars1],[H1,and(BDD,BDDH,BDD2)|Rest],Module):-!,
add_bdd_arg(H,BDDH,Module,H1),
process_body_def(T,BDD2,BDD1,Vars,Vars1,Rest,Module).
process_body_cw([],BDD,BDD,Vars,Vars,[],_Module).
process_body_cw([\+ H|T],BDD,BDD1,Vars,Vars1,[\+ H|Rest],Module):-
builtin(H),!,
process_body_cw(T,BDD,BDD1,Vars,Vars1,Rest,Module).
process_body_cw([\+ H|T],BDD,BDD1,Vars,Vars1,[\+ H|Rest],Module):-
db(H),!,
process_body_cw(T,BDD,BDD1,Vars,Vars1,Rest,Module).
process_body_cw([\+ H|T],BDD,BDD1,Vars,Vars1,[
neg(H1)|Rest],Module):-
add_mod_arg(H,Module,H1),
process_body_cw(T,BDD,BDD1,Vars,Vars1,Rest,Module).
process_body_cw([H|T],BDD,BDD1,Vars,Vars1,[H|Rest],Module):-
builtin(H),!,
process_body_cw(T,BDD,BDD1,Vars,Vars1,Rest,Module).
process_body_cw([H|T],BDD,BDD1,Vars,Vars1,[H|Rest],Module):-
db(H),!,
process_body_cw(T,BDD,BDD1,Vars,Vars1,Rest,Module).
process_body_cw([H|T],BDD,BDD1,Vars,Vars1,
[H1|Rest],Module):-
add_mod_arg(H,Module,H1),
process_body_cw(T,BDD,BDD1,Vars,Vars1,Rest,Module).
process_body([],BDD,BDD,Vars,Vars,[],_Module).
process_body([\+ H|T],BDD,BDD1,Vars,Vars1,[\+ H|Rest],Module):-
builtin(H),!,
process_body(T,BDD,BDD1,Vars,Vars1,Rest,Module).
process_body([\+ H|T],BDD,BDD1,Vars,Vars1,[\+ H|Rest],Module):-
db(H),!,
process_body(T,BDD,BDD1,Vars,Vars1,Rest,Module).
process_body([\+ H|T],BDD,BDD1,Vars,Vars1,[
(((neg(H1);\+ H1),one(BDDN));(bagof(BDDH,H2,L)->or_list(L,BDDL),bdd_not(BDDL,BDDN);one(BDDN))),
and(BDD,BDDN,BDD2)
|Rest],Module):-
given(H),!,
add_mod_arg(H,Module,H1),
add_bdd_arg(H,BDDH,Module,H2),
process_body(T,BDD2,BDD1,Vars,Vars1,Rest,Module).
process_body([\+ H|T],BDD,BDD1,Vars,Vars1,[
neg(H1)|Rest],Module):-
given_cw(H),!,
add_mod_arg(H,Module,H1),
process_body(T,BDD,BDD1,Vars,Vars1,Rest,Module).
process_body([\+ H|T],BDD,BDD1,Vars,[BDDH,BDDN,L,BDDL,BDD2|Vars1],
[(bagof(BDDH,H1,L)->or_list(L,BDDL),bdd_not(BDDL,BDDN);one(BDDN)),
and(BDD,BDDN,BDD2)|Rest],Module):-!,
add_bdd_arg(H,BDDH,Module,H1),
process_body(T,BDD2,BDD1,Vars,Vars1,Rest,Module).
process_body([H|T],BDD,BDD1,Vars,Vars1,[H|Rest],Module):-
builtin(H),!,
process_body(T,BDD,BDD1,Vars,Vars1,Rest,Module).
process_body([H|T],BDD,BDD1,Vars,Vars1,[H|Rest],Module):-
db(H),!,
process_body(T,BDD,BDD1,Vars,Vars1,Rest,Module).
process_body([H|T],BDD,BDD1,Vars,Vars1,
[((H1,one(BDDH));H2),and(BDD,BDDH,BDD2)|Rest],Module):-
given(H),!,
add_mod_arg(H,Module,H1),
add_bdd_arg(H,BDDH,Module,H2),
process_body(T,BDD2,BDD1,Vars,Vars1,Rest,Module).
process_body([H|T],BDD,BDD1,Vars,Vars1,
[H1|Rest],Module):-
given_cw(H),!,
add_mod_arg(H,Module,H1),
process_body(T,BDD,BDD1,Vars,Vars1,Rest,Module).
process_body([H|T],BDD,BDD1,Vars,Vars1,[H1|Rest],Module):-
add_mod_arg(H,Module,H1),
db(H1),!,
process_body(T,BDD,BDD1,Vars,Vars1,Rest,Module).
process_body([H|T],BDD,BDD1,Vars,[BDDH,BDD2|Vars1],
[H1,and(BDD,BDDH,BDD2)|Rest],Module):-
add_bdd_arg(H,BDDH,Module,H1),
process_body(T,BDD2,BDD1,Vars,Vars1,Rest,Module).
given(H):-
functor(H,P,Ar),
(input(P/Ar)).
given_cw(H):-
functor(H,P,Ar),
(input_cw(P/Ar)).
and_list([],B,B).
and_list([H|T],B0,B1):-
and(B0,H,B2),
and_list(T,B2,B1).
or_list([H],H):-!.
or_list([H|T],B):-
or_list1(T,H,B).
or_list1([],B,B).
or_list1([H|T],B0,B1):-
or(B0,H,B2),
or_list1(T,B2,B1).
/* set(Par,Value) can be used to set the value of a parameter */
set(Parameter,Value):-
retract(setting(Parameter,_)),
assert(setting(Parameter,Value)).
extract_vars_list(L,[],V):-
rb_new(T),
extract_vars_tree(L,T,T1),
rb_keys(T1,V).
extract_vars_term(Variable, Var0, Var1) :-
var(Variable), !,
(rb_lookup(Variable, Var0,_) ->
Var1 = Var0
;
rb_insert(Var0,Variable,1,Var1)
).
extract_vars_term(Term, Var0, Var1) :-
Term=..[_F|Args],
extract_vars_tree(Args, Var0, Var1).
extract_vars_tree([], Var, Var).
extract_vars_tree([Term|Tail], Var0, Var1) :-
extract_vars_term(Term, Var0, Var),
extract_vars_tree(Tail, Var, Var1).
difference([],_,[]).
difference([H|T],L2,L3):-
member_eq(H,L2),!,
difference(T,L2,L3).
difference([H|T],L2,[H|L3]):-
difference(T,L2,L3).
member_eq(E,[H|_T]):-
E==H,!.
member_eq(E,[_H|T]):-
member_eq(E,T).
add_bdd_arg(A,BDD,A1):-
A=..[P|Args],
append(Args,[BDD],Args1),
A1=..[P|Args1],
(setting(tabling,on)->
table_pred(A)
;
true
).
add_bdd_arg_db(A,BDD,DB,A1):-
A=..[P|Args],
append(Args,[DB,BDD],Args1),
A1=..[P|Args1],
(setting(tabling,on)->
table_pred(A)
;
true
).
add_bdd_arg(A,BDD,Module,A1):-
A=..[P|Args],
append(Args,[BDD],Args1),
A1=..[P,Module|Args1],
(setting(tabling,on)->
table_pred(A)
;
true
).
add_bdd_arg_db(A,BDD,DB,Module,A1):-
A=..[P|Args],
append(Args,[DB,BDD],Args1),
A1=..[P,Module|Args1],
(setting(tabling,on)->
table_pred(A)
;
true
).
add_mod_arg(A,Module,A1):-
A=..[P|Args],
A1=..[P,Module|Args].
table_pred(A):-
functor(A,P,Arity),
Arity1 is Arity +1,
(is_tabled((P/Arity1))->
true
;
call(table(P/Arity1))
).
process_head(HeadList, GroundHeadList) :-
ground_prob(HeadList), !,
process_head_ground(HeadList, 0, GroundHeadList).
process_head(HeadList, HeadList).
/* process_head_ground([Head:ProbHead], Prob, [Head:ProbHead|Null])
* ----------------------------------------------------------------
*/
process_head_ground([Head:ProbHead], Prob, [Head:ProbHead1|Null]) :-!,
ProbHead1 is ProbHead,
ProbLast is 1 - Prob - ProbHead1,
setting(epsilon_parsing, Eps),
EpsNeg is - Eps,
ProbLast > EpsNeg,
(ProbLast > Eps ->
Null = ['':ProbLast]
;
Null = []
).
process_head_ground([Head:ProbHead|Tail], Prob, [Head:ProbHead1|Next]) :-
ProbHead1 is ProbHead,
ProbNext is Prob + ProbHead1,
process_head_ground(Tail, ProbNext, Next).
ground_prob([]).
ground_prob([_Head:ProbHead|Tail]) :-
ground(ProbHead), % Succeeds if there are no free variables in the term ProbHead.
ground_prob(Tail).
get_probs([], []).
get_probs([_H:P|T], [P1|T1]) :-
P1 is P,
get_probs(T, T1).
generate_clauses_cw([],[],_N,C,C):-!.
generate_clauses_cw([H|T],[H1|T1],N,C0,C):-
gen_clause_cw(H,N,N1,H1,CL),!,
append(C0,CL,C1),
generate_clauses_cw(T,T1,N1,C1,C).
gen_clause_cw((H :- Body),N,N,(H :- Body),[(H :- Body)]):-!.
gen_clause_cw(rule(_R,HeadList,BodyList,Lit),N,N1,rule(N,HeadList,BodyList,Lit),Clauses):-!,
% disjunctive clause with more than one head atom without depth bound
process_body_cw(BodyList,BDD,BDDAnd,[],_Vars,BodyList1,Module),
append([one(BDD)],BodyList1,BodyList2),
list2and(BodyList2,Body1),
append(HeadList,BodyList,List),
extract_vars_list(List,[],VC),
get_probs(HeadList,Probs),
(setting(single_var,true)->
generate_rules(HeadList,Body1,[],N,Probs,BDDAnd,0,Clauses,Module)
;
generate_rules(HeadList,Body1,VC,N,Probs,BDDAnd,0,Clauses,Module)
),
N1 is N+1.
gen_clause_cw(def_rule(H,BodyList,Lit),N,N,def_rule(H,BodyList,Lit),Clauses) :- !,
% disjunctive clause with a single head atom with attached probability=1, without depth bound
process_body_cw(BodyList,BDD,BDDAnd,[],_Vars,BodyList2,Module),
append([one(BDD)],BodyList2,BodyList3),
list2and(BodyList3,Body1),
add_bdd_arg(H,BDDAnd,Module,Head1),
Clauses=[(Head1 :- Body1)].
generate_clauses([],[],_N,C,C):-!.
generate_clauses([H|T],[H1|T1],N,C0,C):-
gen_clause(H,N,N1,H1,CL),!,
append(C0,CL,C1),
generate_clauses(T,T1,N1,C1,C).
gen_clause((H :- Body),N,N,(H :- Body),[(H :- Body)]):-!.
gen_clause(rule(_R,HeadList,BodyList,Lit),N,N1,
rule(N,HeadList,BodyList,Lit),Clauses):-
setting(depth_bound,true),!,
% disjunctive clause with more than one head atom and depth bound
process_body_db(BodyList,BDD,BDDAnd, DB,[],_Vars,BodyList1,Module),
append([one(BDD)],BodyList1,BodyList2),
list2and(BodyList2,Body1),
append(HeadList,BodyList,List),
extract_vars_list(List,[],VC),
get_probs(HeadList,Probs),
(setting(single_var,true)->
generate_rules_db(HeadList,Body1,[],N,Probs,DB,BDDAnd,0,Clauses,Module)
;
generate_rules_db(HeadList,Body1,VC,N,Probs,DB,BDDAnd,0,Clauses,Module)
),
N1 is N+1.
gen_clause(rule(_R,HeadList,BodyList,Lit),N,N1,
rule(N,HeadList,BodyList,Lit),Clauses):-!,
% disjunctive clause with more than one head atom without depth bound
process_body(BodyList,BDD,BDDAnd,[],_Vars,BodyList1,Module),
append([one(BDD)],BodyList1,BodyList2),
list2and(BodyList2,Body1),
append(HeadList,BodyList,List),
extract_vars_list(List,[],VC),
get_probs(HeadList,Probs),
(setting(single_var,true)->
generate_rules(HeadList,Body1,[],N,Probs,BDDAnd,0,Clauses,Module)
;
generate_rules(HeadList,Body1,VC,N,Probs,BDDAnd,0,Clauses,Module)
),
N1 is N+1.
gen_clause(def_rule(H,BodyList,Lit),N,N,def_rule(H,BodyList,Lit),Clauses) :-
% disjunctive clause with a single head atom and depth bound
setting(depth_bound,true),!,
process_body_db(BodyList,BDD,BDDAnd,DB,[],_Vars,BodyList2,Module),
append([one(BDD)],BodyList2,BodyList3),
list2and(BodyList3,Body1),
add_bdd_arg_db(H,BDDAnd,DB,Module,Head1),
Clauses=[(Head1 :- Body1)].
gen_clause(def_rule(H,BodyList,Lit),N,N,def_rule(H,BodyList,Lit),Clauses) :- !,
% disjunctive clause with a single head atom with prob=1 without depth bound
process_body(BodyList,BDD,BDDAnd,[],_Vars,BodyList2,Module),
append([one(BDD)],BodyList2,BodyList3),
list2and(BodyList3,Body1),
add_bdd_arg(H,BDDAnd,Module,Head1),
Clauses=[(Head1 :- Body1)].
user:term_expansion((Head :- Body), ((H :- Body),[])):-
Head=db(H),!.
user:term_expansion((Head :- Body), (Clauses,[rule(R,HeadList,BodyList,true)])):-
setting(compiling,on),
setting(depth_bound,true),
% disjunctive clause with more than one head atom and depth bound
Head = (_;_), !,
list2or(HeadListOr, Head),
process_head(HeadListOr, HeadList),
list2and(BodyList, Body),
process_body_db(BodyList,BDD,BDDAnd, DB,[],_Vars,BodyList1,Module),
append([one(BDD)],BodyList1,BodyList2),
list2and(BodyList2,Body1),
append(HeadList,BodyList,List),
extract_vars_list(List,[],VC),
get_next_rule_number(R),
get_probs(HeadList,Probs),
(setting(single_var,true)->
generate_rules_db(HeadList,Body1,[],R,Probs,DB,BDDAnd,0,Clauses,Module)
;
generate_rules_db(HeadList,Body1,VC,R,Probs,DB,BDDAnd,0,Clauses,Module)
).
user:term_expansion((Head :- Body), (Clauses,[rule(R,HeadList,BodyList,true)])):-
setting(compiling,on),
% disjunctive clause with more than one head atom without depth bound
Head = (_;_), !,
list2or(HeadListOr, Head),
process_head(HeadListOr, HeadList),
list2and(BodyList, Body),
process_body(BodyList,BDD,BDDAnd,[],_Vars,BodyList1,Module),
append([one(BDD)],BodyList1,BodyList2),
list2and(BodyList2,Body1),
append(HeadList,BodyList,List),
extract_vars_list(List,[],VC),
get_next_rule_number(R),
get_probs(HeadList,Probs),
(setting(single_var,true)->
generate_rules(HeadList,Body1,[],R,Probs,BDDAnd,0,Clauses,Module)
;
generate_rules(HeadList,Body1,VC,R,Probs,BDDAnd,0,Clauses,Module)
).
user:term_expansion((Head :- Body), ([],[])) :-
% disjunctive clause with a single head atom with prob.=0 without depth bound -- the clause isn't added to the theory
setting(compiling,on),
((Head:-Body) \= ((user:term_expansion(_,_) ):- _ )),
Head = (_H:P),P=:=0.0, !.
user:term_expansion((Head :- Body), (Clauses,[def_rule(H,BodyList,true)])) :-
% disjunctive clause with a single head atom and depth bound
setting(compiling,on),
setting(depth_bound,true),
((Head:-Body) \= ((user:term_expansion(_,_) ):- _ )),
list2or(HeadListOr, Head),
process_head(HeadListOr, HeadList),
HeadList=[H:_],!,
list2and(BodyList, Body),
process_body_db(BodyList,BDD,BDDAnd,DB,[],_Vars,BodyList2,Module),
append([one(BDD)],BodyList2,BodyList3),
list2and(BodyList3,Body1),
add_bdd_arg_db(H,BDDAnd,DB,Module,Head1),
Clauses=(Head1 :- Body1).
user:term_expansion((Head :- Body), (Clauses,[def_rule(H,BodyList,true)])) :-
% disjunctive clause with a single head atom with prob=1, without depth bound
setting(compiling,on),
((Head:-Body) \= ((user:term_expansion(_,_) ):- _ )),
list2or(HeadListOr, Head),
process_head(HeadListOr, HeadList),
HeadList=[H:_],!,
list2and(BodyList, Body),
process_body(BodyList,BDD,BDDAnd,[],_Vars,BodyList2,Module),
append([one(BDD)],BodyList2,BodyList3),
list2and(BodyList3,Body1),
add_bdd_arg(H,BDDAnd,Module,Head1),
Clauses=(Head1 :- Body1).
user:term_expansion((Head :- Body), (Clauses,[rule(R,HeadList,BodyList,true)])) :-
% disjunctive clause with a single head atom and depth bound
setting(compiling,on),
setting(depth_bound,true),
((Head:-Body) \= ((user:term_expansion(_,_) ):- _ )),
Head = (H:_), !,
list2or(HeadListOr, Head),
process_head(HeadListOr, HeadList),
list2and(BodyList, Body),
process_body_db(BodyList,BDD,BDDAnd,DB,[],_Vars,BodyList2,Module),
append([one(BDD)],BodyList2,BodyList3),
list2and(BodyList3,Body2),
append(HeadList,BodyList,List),
extract_vars_list(List,[],VC),
get_next_rule_number(R),
get_probs(HeadList,Probs),
(setting(single_var,true)->
generate_clause_db(H,Body2,[],R,Probs,DB,BDDAnd,0,Clauses,Module)
;
generate_clause_db(H,Body2,VC,R,Probs,DB,BDDAnd,0,Clauses,Module)
).
user:term_expansion((Head :- Body), (Clauses,[rule(R,HeadList,BodyList,true)])) :-
% disjunctive clause with a single head atom without depth bound
setting(compiling,on),
((Head:-Body) \= ((user:term_expansion(_,_) ):- _ )),
Head = (H:_), !,
list2or(HeadListOr, Head),
process_head(HeadListOr, HeadList),
list2and(BodyList, Body),
process_body(BodyList,BDD,BDDAnd,[],_Vars,BodyList2,Module),
append([one(BDD)],BodyList2,BodyList3),
list2and(BodyList3,Body2),
append(HeadList,BodyList,List),
extract_vars_list(List,[],VC),
get_next_rule_number(R),
get_probs(HeadList,Probs),
(setting(single_var,true)->
generate_clause(H,Body2,[],R,Probs,BDDAnd,0,Clauses,Module)
;
generate_clause(H,Body2,VC,R,Probs,BDDAnd,0,Clauses,Module)
).
user:term_expansion((Head :- Body),(Clauses,[])) :-
% definite clause for db facts
setting(compiling,on),
((Head:-Body) \= ((user:term_expansion(_,_)) :- _ )),
Head=db(Head1),!,
Clauses=(Head1 :- Body).
user:term_expansion((Head :- Body),(Clauses,[def_rule(Head,BodyList,true)])) :-
% definite clause with depth_bound
setting(compiling,on),
setting(depth_bound,true),
((Head:-Body) \= ((user:term_expansion(_,_)) :- _ )),!,
list2and(BodyList, Body),
process_body_db(BodyList,BDD,BDDAnd,DB,[],_Vars,BodyList2,Module),
append([one(BDD)],BodyList2,BodyList3),
list2and(BodyList3,Body1),
add_bdd_arg_db(Head,BDDAnd,DB,Module,Head1),
Clauses=(Head1 :- Body1).
user:term_expansion((Head :- Body),(Clauses,[def_rule(Head,BodyList,true)])) :-
% definite clause without depth bound
setting(compiling,on),
((Head:-Body) \= ((user:term_expansion(_,_)) :- _ )),!,
list2and(BodyList, Body),
process_body(BodyList,BDD,BDDAnd,[],_Vars,BodyList2,Module),
append([one(BDD)],BodyList2,BodyList3),
list2and(BodyList3,Body2),
add_bdd_arg(Head,BDDAnd,Module,Head1),
Clauses=(Head1 :- Body2).
user:term_expansion(Head,(Clauses,[rule(R,HeadList,[],true)])) :-
setting(compiling,on),
setting(depth_bound,true),
% disjunctive FACT with more than one head atom and depth bound
Head=(_;_), !,
list2or(HeadListOr, Head),
process_head(HeadListOr, HeadList),
extract_vars_list(HeadList,[],VC),
get_next_rule_number(R),
get_probs(HeadList,Probs),
(setting(single_var,true)->
generate_rules_fact_db(HeadList,[],R,Probs,0,Clauses,_Module)
;
generate_rules_fact_db(HeadList,VC,R,Probs,0,Clauses,_Module)
).
user:term_expansion(Head,(Clauses,[rule(R,HeadList,[],true)])) :-
setting(compiling,on),
% disjunctive fact with more than one head atom without depth bound
Head=(_;_), !,
list2or(HeadListOr, Head),
process_head(HeadListOr, HeadList),
extract_vars_list(HeadList,[],VC),
get_next_rule_number(R),
get_probs(HeadList,Probs),
(setting(single_var,true)->
generate_rules_fact(HeadList,[],R,Probs,0,Clauses,_Module)
;
generate_rules_fact(HeadList,VC,R,Probs,0,Clauses,_Module)
).
user:term_expansion(Head,([],[])) :-
setting(compiling,on),
% disjunctive fact with a single head atom with prob.=0
(Head \= ((user:term_expansion(_,_)) :- _ )),
Head = (_H:P),P=:=0.0, !.
user:term_expansion(Head,(Clause,[def_rule(H,[],true)])) :-
setting(compiling,on),
setting(depth_bound,true),
% disjunctive fact with a single head atom with prob.=1 and depth bound
(Head \= ((user:term_expansion(_,_)) :- _ )),
Head = (H:P),P=:=1.0, !,
list2and([one(BDD)],Body1),
add_bdd_arg_db(H,BDD,_DB,_Module,Head1),
Clause=(Head1 :- Body1).
user:term_expansion(Head,(Clause,[def_rule(H,[],true)])) :-
setting(compiling,on),
% disjunctive fact with a single head atom with prob.=1, without depth bound
(Head \= ((user:term_expansion(_,_)) :- _ )),
Head = (H:P),P=:=1.0, !,
list2and([one(BDD)],Body1),
add_bdd_arg(H,BDD,_Module,Head1),
Clause=(Head1 :- Body1).
user:term_expansion(Head,(Clause,[rule(R,HeadList,[],true)])) :-
setting(compiling,on),
setting(depth_bound,true),
% disjunctive fact with a single head atom and depth bound
(Head \= ((user:term_expansion(_,_)) :- _ )),
Head=(H:_), !,
list2or(HeadListOr, Head),
process_head(HeadListOr, HeadList),
extract_vars_list(HeadList,[],VC),
get_next_rule_number(R),
get_probs(HeadList,Probs),
add_bdd_arg_db(H,BDD,_DB,_Module,Head1),
(setting(single_var,true)->
Clause=(Head1:-(get_var_n(R,[],Probs,V),equality(V,0,BDD)))
;
Clause=(Head1:-(get_var_n(R,VC,Probs,V),equality(V,0,BDD)))
).
user:term_expansion(Head,(Clause,[rule(R,HeadList,[],true)])) :-
setting(compiling,on),
% disjunctive fact with a single head atom without depth bound
(Head \= ((user:term_expansion(_,_)) :- _ )),
Head=(H:_), !,
list2or(HeadListOr, Head),
process_head(HeadListOr, HeadList),
extract_vars_list(HeadList,[],VC),
get_next_rule_number(R),
get_probs(HeadList,Probs),
add_bdd_arg(H,BDD,_Module,Head1),
(setting(single_var,true)->
Clause=(Head1:-(get_var_n(R,[],Probs,V),equality(V,0,BDD)))
;
Clause=(Head1:-(get_var_n(R,VC,Probs,V),equality(V,0,BDD)))
).
user:term_expansion(Head, ((Head1:-one(One)),[def_rule(Head,[],true)])) :-
setting(compiling,on),
setting(depth_bound,true),
% definite fact with depth bound
(Head \= ((user:term_expansion(_,_) ):- _ )),
(Head\= end_of_file),!,
add_bdd_arg_db(Head,One,_DB,_Module,Head1).
user:term_expansion(Head, ((Head1:-one(One)),[def_rule(Head,[],true)])) :-
setting(compiling,on),
% definite fact without depth bound
(Head \= ((user:term_expansion(_,_) ):- _ )),
(Head\= end_of_file),!,
add_bdd_arg(Head,One,_Module,Head1).
builtin(_A is _B).
builtin(_A > _B).
builtin(_A < _B).
builtin(_A >= _B).
builtin(_A =< _B).
builtin(_A =:= _B).
builtin(_A =\= _B).
builtin(true).
builtin(false).
builtin(_A = _B).
builtin(_A==_B).
builtin(_A\=_B).
builtin(_A\==_B).
builtin('!').
builtin(length(_L,_N)).
builtin(member(_El,_L)).
builtin(average(_L,_Av)).
builtin(max_list(_L,_Max)).
builtin(min_list(_L,_Max)).
builtin(nth0(_,_,_)).
builtin(nth(_,_,_)).
builtin(name(_,_)).
builtin(float(_)).
builtin(integer(_)).
builtin(var(_)).
builtin(_ @> _).
builtin(memberchk(_,_)).
average(L,Av):-
sum_list(L,Sum),
length(L,N),
Av is Sum/N.