459 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
		
		
			
		
	
	
			459 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
|   | /* | ||
|  | 
 | ||
|  | EMBLEM and SLIPCASE | ||
|  | 
 | ||
|  | Copyright (c) 2011, Fabrizio Riguzzii, Nicola di Mauro and Elena Bellodi | ||
|  | 
 | ||
|  | */ | ||
|  | :- use_module(library(terms)). | ||
|  | :- use_module(library(lists)). | ||
|  | 
 | ||
|  | :- set_prolog_flag(discontiguous_warnings,on). | ||
|  | :- set_prolog_flag(single_var_warnings,on). | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | theory_revisions_op(Theory,TheoryRevs):- | ||
|  |   setof(RevOp, Theory^revise_theory(Theory,RevOp), TheoryRevs),!. | ||
|  | 
 | ||
|  | theory_revisions_op(_Theory,[]). | ||
|  | 
 | ||
|  | theory_revisions(Theory,TheoryRevs):- | ||
|  |   theory_revisions_op(Theory,TheoryRevs1), | ||
|  |   apply_operators(TheoryRevs1,Theory,TheoryRevs). | ||
|  | 
 | ||
|  | 
 | ||
|  | apply_operators([],_Theory,[]). | ||
|  | 
 | ||
|  | apply_operators([add(Rule)|RestOps],Theory,[NewTheory|RestTheory]) :- | ||
|  |   append(Theory, [Rule], NewTheory), | ||
|  |   apply_operators(RestOps,Theory,RestTheory). | ||
|  | 
 | ||
|  | apply_operators([add_body(Rule1,Rule2,_A)|RestOps],Theory,[NewTheory|RestTheory]) :- | ||
|  |   delete_matching(Theory,Rule1,Theory1), | ||
|  |   append(Theory1, [Rule2], NewTheory), | ||
|  |   apply_operators(RestOps,Theory,RestTheory). | ||
|  | 
 | ||
|  | apply_operators([remove_body(Rule1,Rule2,_A)|RestOps],Theory,[NewTheory|RestTheory]) :- | ||
|  |   delete_matching(Theory,Rule1,Theory1), | ||
|  |   append(Theory1, [Rule2], NewTheory), | ||
|  |   apply_operators(RestOps,Theory,RestTheory). | ||
|  | 
 | ||
|  | apply_operators([add_head(Rule1,Rule2,_A)|RestOps],Theory,[NewTheory|RestTheory]) :- | ||
|  |   delete_matching(Theory,Rule1,Theory1), | ||
|  |   append(Theory1, [Rule2], NewTheory), | ||
|  |   apply_operators(RestOps,Theory,RestTheory). | ||
|  | 
 | ||
|  | apply_operators([remove_head(Rule1,Rule2,_A)|RestOps],Theory,[NewTheory|RestTheory]) :- | ||
|  |   delete_matching(Theory,Rule1,Theory1), | ||
|  |   append(Theory1, [Rule2], NewTheory), | ||
|  |   apply_operators(RestOps,Theory,RestTheory). | ||
|  | 
 | ||
|  | apply_operators([remove(Rule)|RestOps],Theory,[NewTheory|RestTheory]) :- | ||
|  |   delete_matching(Theory,Rule,NewTheory), | ||
|  |   apply_operators(RestOps,Theory,RestTheory). | ||
|  | 
 | ||
|  | 
 | ||
|  | revise_theory(Theory,Ref):- | ||
|  |   specialize_theory(Theory,Ref). | ||
|  | 
 | ||
|  | revise_theory(Theory,Ref):- | ||
|  |   generalize_theory(Theory,Ref). | ||
|  | 
 | ||
|  | 
 | ||
|  | generalize_theory(Theory,Ref):- | ||
|  |   Theory \== [], | ||
|  |   choose_rule(Theory,Rule), | ||
|  |   generalize_rule(Rule,Ref). | ||
|  | 
 | ||
|  | generalize_theory(Theory,Ref):- | ||
|  |   length(Theory,LT), | ||
|  |   setting(max_rules,MR), | ||
|  |   LT<MR, | ||
|  |   add_rule(Ref). | ||
|  | 
 | ||
|  | 
 | ||
|  | generalize_rule(Rule,Ref):- | ||
|  |   generalize_head(Rule,Ref). | ||
|  | 
 | ||
|  | generalize_rule(Rule,Ref):- | ||
|  |   generalize_body(Rule,Ref). | ||
|  | 
 | ||
|  | 
 | ||
|  | add_rule(add(rule(ID,Head,[]))):- | ||
|  |   findall(HL , modeh(_,HL), HLS), | ||
|  |   length(HLS,L), | ||
|  |   L1 is L+1, | ||
|  |   P is 1/L1, | ||
|  |   generate_head(HLS,P,Head), | ||
|  |   get_next_rule_number(ID). | ||
|  | 
 | ||
|  | 
 | ||
|  | generate_head([H|_T],_P,[H1:0.5,'':0.5]):- | ||
|  |   H=..[Pred|Args], | ||
|  |   take_const(Args,Args1), | ||
|  |   H1=..[Pred|Args1]. | ||
|  | 
 | ||
|  | generate_head([_H|T],P,Head):- | ||
|  |   generate_head(T,P,Head). | ||
|  | 
 | ||
|  | 
 | ||
|  | take_const([],[]). | ||
|  | 
 | ||
|  | take_const([+A|T],[_V|T1]):- | ||
|  |   atom(A),!, | ||
|  |   take_const(T,T1). | ||
|  | 
 | ||
|  | take_const([-A|T],[_V|T1]):- | ||
|  |   atom(A),!, | ||
|  |   take_const(T,T1). | ||
|  | 
 | ||
|  | take_const([A|T],[A|T1]):- | ||
|  |   take_const(T,T1). | ||
|  | 
 | ||
|  | 
 | ||
|  | generalize_head(Rule,Ref):- | ||
|  |   Rule = rule(ID,LH,BL), | ||
|  |   generalize_head1(LH,LH1,NewAt), | ||
|  |   Ref = add_head(Rule,rule(ID,LH1,BL),NewAt). | ||
|  | 
 | ||
|  | 
 | ||
|  | generalize_head1(LH,LH1,NH):- | ||
|  |   findall(HL , modeh(_,HL), HLS), | ||
|  |   generalize_head2(HLS,LH,LH1,NH). | ||
|  | 
 | ||
|  | 
 | ||
|  | generalize_head2([X|_R],LH,LH1,PH) :- | ||
|  |   X =.. [P|A], | ||
|  |   length(A,LA), | ||
|  |   length(A1,LA), | ||
|  |   PH =.. [P|A1], | ||
|  |   \+ member(PH:_, LH), | ||
|  |   (setting(new_head_atoms_zero_prob,true)-> | ||
|  |     delete_matching(LH,'':PNull,LH0), | ||
|  |     append(LH0,[PH:0.0,'':PNull],LH1) | ||
|  |   ; | ||
|  |     length(LH,NH), | ||
|  |     add_to_head(LH,NH,PH,LH1) | ||
|  |   ). | ||
|  | 
 | ||
|  | generalize_head2([_X|R],LH,LH1) :- | ||
|  |   generalize_head2(R,LH,LH1). | ||
|  | 
 | ||
|  | 
 | ||
|  | add_to_head(['':PN],NH,At,[At:PA,'':PN1]):-!, | ||
|  |   PN1 is PN*NH/(NH+1), | ||
|  |   PA is 1/(NH+1). | ||
|  | 
 | ||
|  | add_to_head([H:PH|T],NH,At,[H:PH1|T1]):- | ||
|  |   PH1 is PH*NH/(NH+1), | ||
|  |   add_to_head(T,NH,At,T1). | ||
|  | 
 | ||
|  | 
 | ||
|  | get_module_var(LH,Module):- | ||
|  |   member(H:_,LH),!, | ||
|  |   H=..[_F,Module|_]. | ||
|  | 
 | ||
|  | 
 | ||
|  | generalize_body(Rule,Ref):- | ||
|  |   Rule = rule(ID,LH,BL), | ||
|  |   delete_one(BL,BL1,A), | ||
|  |   remove_prob(LH,LH1), | ||
|  |   delete(LH1,'',LH2), | ||
|  |   linked_clause(BL1,LH2), | ||
|  |   Ref = remove_body(Rule,rule(ID,LH,BL1),A). | ||
|  |    | ||
|  | 
 | ||
|  | specialize_theory(Theory,Ref):- | ||
|  |   Theory \== [], | ||
|  |   choose_rule(Theory,Rule), | ||
|  |   specialize_rule(Rule,SpecRule,Lit), | ||
|  |   Ref = add_body(Rule,SpecRule,Lit). | ||
|  | 
 | ||
|  | 
 | ||
|  | specialize_rule(Rule,SpecRule,Lit):- | ||
|  |   findall(BL , modeb(_,BL), BLS), | ||
|  |   specialize_rule(BLS,Rule,SpecRule,Lit). | ||
|  | 
 | ||
|  | 
 | ||
|  | specialize_rule([Lit|_RLit],Rule,SpecRul,SLit):- | ||
|  |   Rule = rule(ID,LH,BL), | ||
|  |   remove_prob(LH,LH1), | ||
|  |   append(LH1,BL,ALL), | ||
|  |   specialize_rule1(Lit,ALL,SLit), | ||
|  |   append(BL,[SLit],BL1), | ||
|  |   lookahead(SLit,LLit1), | ||
|  |   specailize_rule_la(LLit1,LH1,BL1,BL2), | ||
|  |   append(LH1,BL2,ALL2), | ||
|  |   extract_fancy_vars(ALL2,Vars1), | ||
|  |   length(Vars1,NV), | ||
|  |   setting(max_var,MV), | ||
|  |   NV=<MV, | ||
|  |   SpecRul = rule(ID,LH,BL2). | ||
|  | 
 | ||
|  | specialize_rule([Lit|_RLit],Rule,SpecRul,SLit):- | ||
|  |   Rule = rule(ID,LH,BL), | ||
|  |   remove_prob(LH,LH1), | ||
|  |   append(LH1,BL,ALL), | ||
|  |   specialize_rule1(Lit,ALL,SLit), | ||
|  |   append(BL,[SLit],BL1), | ||
|  |   append(LH1,BL1,ALL1), | ||
|  |   extract_fancy_vars(ALL1,Vars1), | ||
|  |   length(Vars1,NV), | ||
|  |   setting(max_var,MV), | ||
|  |   NV=<MV, | ||
|  |   SpecRul = rule(ID,LH,BL1). | ||
|  | 
 | ||
|  | specialize_rule([_|RLit],Rule,SpecRul,Lit):- | ||
|  |   specialize_rule(RLit,Rule,SpecRul,Lit). | ||
|  | 
 | ||
|  | 
 | ||
|  | specailize_rule_la([],_LH1,BL1,BL1). | ||
|  | 
 | ||
|  | specailize_rule_la([Lit1|T],LH1,BL1,BL3):- | ||
|  |   copy_term(Lit1,Lit2), | ||
|  |   modeb(_,Lit2), | ||
|  |   append(LH1,BL1,ALL1), | ||
|  |   specialize_rule1(Lit2,ALL1,SLit1), | ||
|  |   append(BL1,[SLit1],BL2), | ||
|  |   specailize_rule_la(T,LH1,BL2,BL3). | ||
|  | 
 | ||
|  | 
 | ||
|  | remove_prob(['':_P],[]):-!. | ||
|  | 
 | ||
|  | remove_prob([X:_],[X]):-!. | ||
|  | 
 | ||
|  | remove_prob([X:_|R],[X|R1]):- | ||
|  |   remove_prob(R,R1). | ||
|  | 
 | ||
|  | 
 | ||
|  | specialize_rule1(Lit,Lits,SpecLit):- | ||
|  |   Lit =.. [Pred|Args], | ||
|  |   exctract_type_vars(Lits,TypeVars0),   | ||
|  |   remove_duplicates(TypeVars0,TypeVars), | ||
|  |   take_var_args(Args,TypeVars,Args1), | ||
|  |   SpecLit =.. [Pred|Args1], | ||
|  |   \+ member_eq(SpecLit,Lits). | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | convert_to_input_vars([],[]):-!. | ||
|  | 
 | ||
|  | convert_to_input_vars([+T|RT],[+T|RT1]):- | ||
|  |   !, | ||
|  |   convert_to_input_vars(RT,RT1). | ||
|  | 
 | ||
|  | convert_to_input_vars([-T|RT],[+T|RT1]):- | ||
|  |   convert_to_input_vars(RT,RT1). | ||
|  | 
 | ||
|  | 
 | ||
|  | member_eq(X,[Y|_List]) :- | ||
|  |   X == Y. | ||
|  | 
 | ||
|  | member_eq(X,[_|List]) :- | ||
|  |   member_eq(X,List). | ||
|  | 
 | ||
|  | 
 | ||
|  | remove_eq(X,[Y|R],R):- | ||
|  |   X == Y, | ||
|  |   !. | ||
|  | 
 | ||
|  | remove_eq(X,[_|R],R1):- | ||
|  |   remove_eq(X,R,R1). | ||
|  | 
 | ||
|  | 
 | ||
|  | linked_clause(X):- | ||
|  |   linked_clause(X,[]). | ||
|  | 
 | ||
|  | linked_clause([],_). | ||
|  | linked_clause([L|R],PrevLits):- | ||
|  |   term_variables(PrevLits,PrevVars), | ||
|  |   input_variables(L,InputVars), | ||
|  |   linked(InputVars,PrevVars),!, | ||
|  |   linked_clause(R,[L|PrevLits]). | ||
|  | 
 | ||
|  | 
 | ||
|  | linked([],_). | ||
|  | 
 | ||
|  | linked([X|R],L) :- | ||
|  |   member_eq(X,L), | ||
|  |   !, | ||
|  |   linked(R,L). | ||
|  |    | ||
|  | 
 | ||
|  | input_variables(\+ LitM,InputVars):- | ||
|  |   !, | ||
|  |   LitM=..[P|Args], | ||
|  |   length(Args,LA), | ||
|  |   length(Args1,LA), | ||
|  |   Lit1=..[P|Args1], | ||
|  |   copy_term(LitM,Lit0), | ||
|  |   modeb(_,Lit1), | ||
|  |   Lit1 =.. [P|Args1], | ||
|  |   convert_to_input_vars(Args1,Args2), | ||
|  |   Lit2 =.. [P|Args2], | ||
|  |   input_vars(Lit0,Lit2,InputVars). | ||
|  | 
 | ||
|  | input_variables(LitM,InputVars):- | ||
|  |   LitM=..[P|Args], | ||
|  |   length(Args,LA), | ||
|  |   length(Args1,LA), | ||
|  |   Lit1=..[P|Args1], | ||
|  |   modeb(_,Lit1), | ||
|  |   input_vars(LitM,Lit1,InputVars). | ||
|  | 
 | ||
|  | input_variables(LitM,InputVars):- | ||
|  |   LitM=..[P|Args], | ||
|  |   length(Args,LA), | ||
|  |   length(Args1,LA), | ||
|  |   Lit1=..[P|Args1], | ||
|  |   modeh(_,Lit1), | ||
|  |   input_vars(LitM,Lit1,InputVars). | ||
|  | 
 | ||
|  | 
 | ||
|  | input_vars(Lit,Lit1,InputVars):- | ||
|  |   Lit =.. [_|Vars], | ||
|  |   Lit1 =.. [_|Types], | ||
|  |   input_vars1(Vars,Types,InputVars). | ||
|  | 
 | ||
|  | 
 | ||
|  | input_vars1([],_,[]). | ||
|  | 
 | ||
|  | input_vars1([V|RV],[+_T|RT],[V|RV1]):- | ||
|  |   !, | ||
|  |   input_vars1(RV,RT,RV1). | ||
|  | 
 | ||
|  | input_vars1([_V|RV],[_|RT],RV1):- | ||
|  |   input_vars1(RV,RT,RV1). | ||
|  | 
 | ||
|  | 
 | ||
|  | exctract_type_vars([],[]). | ||
|  | 
 | ||
|  | exctract_type_vars([Lit|RestLit],TypeVars):- | ||
|  |   Lit =.. [Pred|Args], | ||
|  |   length(Args,L), | ||
|  |   length(Args1,L), | ||
|  |   Lit1 =.. [Pred|Args1], | ||
|  |   take_mode(Lit1), | ||
|  |   type_vars(Args,Args1,Types), | ||
|  |   exctract_type_vars(RestLit,TypeVars0), | ||
|  |   !, | ||
|  |   append(Types,TypeVars0,TypeVars). | ||
|  | 
 | ||
|  | 
 | ||
|  | take_mode(Lit):- | ||
|  |   modeh(_,Lit),!. | ||
|  | 
 | ||
|  | take_mode(Lit):- | ||
|  |   modeb(_,Lit),!. | ||
|  | 
 | ||
|  | take_mode(Lit):- | ||
|  |   mode(_,Lit),!. | ||
|  | 
 | ||
|  | 
 | ||
|  | type_vars([],[],[]). | ||
|  | 
 | ||
|  | type_vars([V|RV],[+T|RT],[V=T|RTV]):- | ||
|  |   !, | ||
|  |   type_vars(RV,RT,RTV). | ||
|  | 
 | ||
|  | type_vars([V|RV],[-T|RT],[V=T|RTV]):-atom(T),!, | ||
|  |   type_vars(RV,RT,RTV). | ||
|  | 
 | ||
|  | type_vars([_V|RV],[_T|RT],RTV):- | ||
|  |   type_vars(RV,RT,RTV). | ||
|  | 
 | ||
|  | 
 | ||
|  | take_var_args([],_,[]). | ||
|  | 
 | ||
|  | take_var_args([+T|RT],TypeVars,[V|RV]):- | ||
|  |   !, | ||
|  |   member(V=T,TypeVars), | ||
|  |   take_var_args(RT,TypeVars,RV). | ||
|  | 
 | ||
|  | take_var_args([-T|RT],TypeVars,[_V|RV]):- | ||
|  |   atom(T), | ||
|  |   take_var_args(RT,TypeVars,RV). | ||
|  | 
 | ||
|  | take_var_args([-T|RT],TypeVars,[V|RV]):- | ||
|  |   member(V=T,TypeVars), | ||
|  |   take_var_args(RT,TypeVars,RV). | ||
|  | 
 | ||
|  | take_var_args([T|RT],TypeVars,[T|RV]):- | ||
|  |   T\= + _,(T\= - _; T= - A,number(A)),   | ||
|  |   take_var_args(RT,TypeVars,RV). | ||
|  | 
 | ||
|  | 
 | ||
|  |         | ||
|  | choose_rule(Theory,Rule):- | ||
|  |   member(Rule,Theory). | ||
|  | 
 | ||
|  | 
 | ||
|  | add_rule(Theory,add(rule(ID,H,[]))):- | ||
|  |   new_id(ID), | ||
|  |   findall(HL , modeh(_,HL), HLS), | ||
|  |   length(HLS,NH), | ||
|  |   P is 1/(NH+1), | ||
|  |   add_probs(HLS,H,P), | ||
|  |   \+ member(rule(_,H,[]),Theory). | ||
|  | 
 | ||
|  | add_rule(Theory,TheoryGen):- | ||
|  |   findall(HL , modeh(_,HL), HLS), | ||
|  |   add_rule(HLS,Theory,TheoryGen). | ||
|  | 
 | ||
|  | add_rule([X|_R],Theory,TheoryGen) :- | ||
|  |   new_id(ID), | ||
|  |   X =.. [P|A], | ||
|  |   length(A,LA), | ||
|  |   length(A1,LA), | ||
|  |   PH =.. [P|A1], | ||
|  |   TheoryGen = add(rule(ID,[PH:0.5,'':0.5],[])), | ||
|  |   \+ member(rule(_,[PH:_,'':_],[]),Theory). | ||
|  | 
 | ||
|  | add_rule([_X|R],Theory,TheoryGen) :- | ||
|  |   add_rule(R,Theory,TheoryGen). | ||
|  | 
 | ||
|  | 
 | ||
|  | add_probs([],['':P],P):-!. | ||
|  | 
 | ||
|  | add_probs([H|T],[H:P|T1],P):- | ||
|  |   add_probs(T,T1,P). | ||
|  | 
 | ||
|  | 
 | ||
|  | extract_fancy_vars(List,Vars):- | ||
|  |   term_variables(List,Vars0), | ||
|  |   fancy_vars(Vars0,1,Vars). | ||
|  | 
 | ||
|  | 
 | ||
|  | fancy_vars([],_,[]). | ||
|  | 
 | ||
|  | fancy_vars([X|R],N,[NN2=X|R1]):- | ||
|  |   name(N,NN), | ||
|  |   append([86],NN,NN1), | ||
|  |   name(NN2,NN1), | ||
|  |   N1 is N + 1, | ||
|  |   fancy_vars(R,N1,R1). | ||
|  | 
 | ||
|  | 
 | ||
|  | delete_one([X|R],R,X). | ||
|  | 
 | ||
|  | delete_one([X|R],[X|R1],D):- | ||
|  |   delete_one(R,R1,D). | ||
|  |    | ||
|  | 
 | ||
|  | remove_last([_X],[]) :- | ||
|  |   !. | ||
|  | 
 | ||
|  | remove_last([X|R],[X|R1]):- | ||
|  |   remove_last(R,R1). | ||
|  | 
 | ||
|  | 
 | ||
|  | delete_matching([],_El,[]). | ||
|  | 
 | ||
|  | delete_matching([El|T],El,T1):-!, | ||
|  |   delete_matching(T,El,T1). | ||
|  | 
 | ||
|  | delete_matching([H|T],El,[H|T1]):- | ||
|  |   delete_matching(T,El,T1). | ||
|  |    |