Newest ProbLog version
This commit is contained in:
@@ -2,8 +2,8 @@
|
||||
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
%
|
||||
% $Date: 2010-10-13 17:09:47 +0200 (Wed, 13 Oct 2010) $
|
||||
% $Revision: 4915 $
|
||||
% $Date: 2010-12-13 18:15:14 +0100 (Mon, 13 Dec 2010) $
|
||||
% $Revision: 5125 $
|
||||
%
|
||||
% This file is part of ProbLog
|
||||
% http://dtai.cs.kuleuven.be/problog
|
||||
@@ -214,51 +214,64 @@
|
||||
]).
|
||||
|
||||
% general yap modules
|
||||
:- use_module(library(lists),[reverse/2]).
|
||||
:- use_module(library(lists),[reverse/2,member/2,append/3]).
|
||||
|
||||
:- use_module(flags).
|
||||
|
||||
:- style_check(all).
|
||||
:- yap_flag(unknown,error).
|
||||
|
||||
:- discontiguous user:ad_intern/2.
|
||||
|
||||
:- op( 550, yfx, :: ).
|
||||
|
||||
% for annotated disjunctions
|
||||
:- op(1149, yfx, <-- ).
|
||||
|
||||
:- initialization(problog_define_flag(show_ad_compilation,problog_flag_validate_boolean,'show compiled code for ADs',false,annotated_disjunctions)).
|
||||
:- initialization(problog_define_flag(ad_cpl_semantics,problog_flag_validate_boolean,'use CP-logics semantics for ADs',true,annotated_disjunctions)).
|
||||
|
||||
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
%
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
term_expansion_intern_ad( (Head<--Body),Module,ad_intern((Head<--Body),ID)) :-
|
||||
proper_tunable_annotated_disjunction(Head),
|
||||
!,
|
||||
compile_tunable_annotated_disjunction(Head,Body,Facts,Bodies,ID),
|
||||
assert_all_ad_facts(Facts,Module),
|
||||
assert_all_ad_bodies(Bodies,Module).
|
||||
term_expansion_intern_ad( (Head<--Body),Module,ad_intern((Head<--Body),ID)) :-
|
||||
proper_annotated_disjunction(Head),
|
||||
!,
|
||||
compile_annotated_disjunction(Head,Body,Facts,Bodies,ID),
|
||||
assert_all_ad_facts(Facts,Module),
|
||||
assert_all_ad_bodies(Bodies,Module).
|
||||
problog_flag(ad_cpl_semantics,AD_CPL_Semantics),
|
||||
(
|
||||
proper_tunable_annotated_disjunction(Head)
|
||||
->
|
||||
compile_tunable_annotated_disjunction(Head,Body,Facts,Bodies,ID,AD_CPL_Semantics);
|
||||
(
|
||||
proper_annotated_disjunction(Head),
|
||||
compile_annotated_disjunction(Head,Body,Facts,Bodies,ID,AD_CPL_Semantics)
|
||||
)
|
||||
),
|
||||
|
||||
forall(member(F,Facts),(once(problog:term_expansion_intern(F,Module,Atom)),
|
||||
assertz(problog:Atom))),
|
||||
forall(member(B,Bodies),assertz(Module:B)),
|
||||
|
||||
problog_flag(show_ad_compilation,Show_AD_compilation),
|
||||
|
||||
(
|
||||
Show_AD_compilation==true
|
||||
->
|
||||
(
|
||||
format('Compiling the annotated disjunction~n ~q~ninto the following code~n',[(Head<--Body)]),
|
||||
format('================================================~n',[]),
|
||||
forall(member(F,Facts),format(' ~q.~n',[F])),
|
||||
format(' - - - - - - - - - - - - - - - - - - - - - - ~n',[]),
|
||||
forall(member(B,Bodies),format(' ~q.~n',[B])),
|
||||
format('================================================~2n',[])
|
||||
);
|
||||
true
|
||||
).
|
||||
|
||||
term_expansion_intern_ad( (Head<--Body),_,_) :-
|
||||
format_to_chars('Error at compiling the annotated disjunction ~q<--Body.',[Head,Body],Error),
|
||||
print_message(error,Error),
|
||||
fail.
|
||||
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
%
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
|
||||
assert_all_ad_facts([],_).
|
||||
assert_all_ad_facts([F|T],Module) :-
|
||||
once(problog:term_expansion_intern(F,Module,Atom)),
|
||||
assertz(problog:Atom),
|
||||
assert_all_ad_facts(T,Module).
|
||||
|
||||
assert_all_ad_bodies([],_).
|
||||
assert_all_ad_bodies([B|T],Module) :-
|
||||
assertz(Module:B),
|
||||
assert_all_ad_bodies(T,Module).
|
||||
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
%
|
||||
@@ -303,22 +316,36 @@ proper_tunable_annotated_disjunction((X;Y)) :-
|
||||
%
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
|
||||
compile_tunable_annotated_disjunction(Head,Body,Facts2,Bodies2,Extra_ID) :-
|
||||
compile_tunable_annotated_disjunction(Head,Body,Facts2,Bodies2,Extra_ID,AD_CPL_Semantics) :-
|
||||
get_next_unique_id(Extra_ID),
|
||||
|
||||
(
|
||||
AD_CPL_Semantics==true
|
||||
->
|
||||
term_variables(Body,Body_Vars);
|
||||
Body_Vars=[]
|
||||
),
|
||||
|
||||
convert_a_tunable(Head,Extra_ID,[],Facts),
|
||||
convert_b(Head,Body,_NewBody,Extra_ID,[],Bodies),
|
||||
convert_a_tunable(Head,Extra_ID,[],Facts,Body_Vars),
|
||||
convert_b(Head,Body,_NewBody,Extra_ID,[],Bodies,Body_Vars),
|
||||
|
||||
reverse(Facts,Facts2),
|
||||
reverse(Bodies,Bodies2).
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
%
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
compile_annotated_disjunction(Head,Body,Facts2,Bodies2,Extra_ID) :-
|
||||
compile_annotated_disjunction(Head,Body,Facts2,Bodies2,Extra_ID,AD_CPL_Semantics) :-
|
||||
get_next_unique_id(Extra_ID),
|
||||
|
||||
(
|
||||
AD_CPL_Semantics==true
|
||||
->
|
||||
term_variables(Body,Body_Vars);
|
||||
Body_Vars=[]
|
||||
),
|
||||
|
||||
convert_a(Head,0.0,_Acc,Extra_ID,[],Facts),
|
||||
convert_b(Head,Body,_NewBody,Extra_ID,[],Bodies),
|
||||
convert_a(Head,0.0,_Acc,Extra_ID,[],Facts,Body_Vars),
|
||||
convert_b(Head,Body,_NewBody,Extra_ID,[],Bodies,Body_Vars),
|
||||
|
||||
reverse(Facts,Facts2),
|
||||
reverse(Bodies,Bodies2).
|
||||
@@ -326,16 +353,17 @@ compile_annotated_disjunction(Head,Body,Facts2,Bodies2,Extra_ID) :-
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
%
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
convert_a((X;Y),OldAcc,Acc,Extra_ID,OldFacts,Facts) :-
|
||||
convert_a(X,OldAcc,NewAcc,Extra_ID,OldFacts,NewFacts),
|
||||
convert_a(Y,NewAcc,Acc,Extra_ID,NewFacts,Facts).
|
||||
convert_a(P::Atom,OldAcc,NewAcc,Extra_ID,OldFacts,[P1::ProbFact|OldFacts]) :-
|
||||
convert_a((X;Y),OldAcc,Acc,Extra_ID,OldFacts,Facts,Body_Vars) :-
|
||||
convert_a(X,OldAcc,NewAcc,Extra_ID,OldFacts,NewFacts,Body_Vars),
|
||||
convert_a(Y,NewAcc,Acc,Extra_ID,NewFacts,Facts,Body_Vars).
|
||||
convert_a(P::Atom,OldAcc,NewAcc,Extra_ID,OldFacts,[P1::ProbFact|OldFacts],Body_Vars) :-
|
||||
Atom =.. [Functor|AllArguments],
|
||||
append(AllArguments,Body_Vars,NewAllArguments),
|
||||
length(AllArguments,Arity),
|
||||
|
||||
atomic_concat([mvs_fact_,Functor,'_',Arity,'_',Extra_ID],NewAtom),
|
||||
|
||||
ProbFact =.. [NewAtom|AllArguments],
|
||||
ProbFact =.. [NewAtom|NewAllArguments],
|
||||
(
|
||||
P=:=0
|
||||
->
|
||||
@@ -351,29 +379,31 @@ convert_a(P::Atom,OldAcc,NewAcc,Extra_ID,OldFacts,[P1::ProbFact|OldFacts]) :-
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
%
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
convert_a_tunable((X;Y),Extra_ID,OldFacts,Facts) :-
|
||||
convert_a_tunable(X,Extra_ID,OldFacts,NewFacts),
|
||||
convert_a_tunable(Y,Extra_ID,NewFacts,Facts).
|
||||
convert_a_tunable(P::Atom,Extra_ID,OldFacts,[P::ProbFact|OldFacts]) :-
|
||||
convert_a_tunable((X;Y),Extra_ID,OldFacts,Facts,Body_Vars) :-
|
||||
convert_a_tunable(X,Extra_ID,OldFacts,NewFacts,Body_Vars),
|
||||
convert_a_tunable(Y,Extra_ID,NewFacts,Facts,Body_Vars).
|
||||
convert_a_tunable(P::Atom,Extra_ID,OldFacts,[P::ProbFact|OldFacts],Body_Vars) :-
|
||||
Atom =.. [Functor|AllArguments],
|
||||
append(AllArguments,Body_Vars,NewAllArguments),
|
||||
length(AllArguments,Arity),
|
||||
|
||||
atomic_concat([mvs_fact_,Functor,'_',Arity,'_',Extra_ID],NewAtom),
|
||||
|
||||
ProbFact =.. [NewAtom|AllArguments].
|
||||
ProbFact =.. [NewAtom|NewAllArguments].
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
%
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
convert_b((X;Y),OldBody,Body,ExtraID,OldBodies,Bodies) :-
|
||||
convert_b(X,OldBody,NewBody,ExtraID,OldBodies,NewBodies),
|
||||
convert_b(Y,NewBody,Body,ExtraID,NewBodies,Bodies).
|
||||
convert_b(_::Atom,OldBody,NewBody,Extra_ID,OldBodies,[(Atom:-ThisBody)|OldBodies]) :-
|
||||
convert_b((X;Y),OldBody,Body,ExtraID,OldBodies,Bodies,Body_Vars) :-
|
||||
convert_b(X,OldBody,NewBody,ExtraID,OldBodies,NewBodies,Body_Vars),
|
||||
convert_b(Y,NewBody,Body,ExtraID,NewBodies,Bodies,Body_Vars).
|
||||
convert_b(_::Atom,OldBody,NewBody,Extra_ID,OldBodies,[(Atom:-ThisBody)|OldBodies],Body_Vars) :-
|
||||
Atom =.. [Functor|AllArguments],
|
||||
append(AllArguments,Body_Vars,NewAllArguments),
|
||||
|
||||
length(AllArguments,Arity),
|
||||
atomic_concat([mvs_fact_,Functor,'_',Arity,'_',Extra_ID],NewFunctor),
|
||||
|
||||
ProbFact =.. [NewFunctor|AllArguments],
|
||||
ProbFact =.. [NewFunctor|NewAllArguments],
|
||||
tuple_append(OldBody,ProbFact,ThisBody),
|
||||
tuple_append(OldBody,problog_not(ProbFact),NewBody).
|
||||
|
||||
|
Reference in New Issue
Block a user