158 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
		
		
			
		
	
	
			158 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
|   | /* | ||
|  | 	LPAD and CP-Logic reasoning suite | ||
|  | 	File cpl.pl | ||
|  | 	Computes the semantics of CP-logic programs | ||
|  | 	Copyright (c) 2007, Fabrizio Riguzzi | ||
|  | */ | ||
|  | 
 | ||
|  | :-use_module(lpad,[slg/3,setting/2,set/2]). | ||
|  | 
 | ||
|  | :-use_module(semcpl,[build/0,print/0]). | ||
|  | 
 | ||
|  | :-use_module(library(lists)). | ||
|  | 
 | ||
|  | p(File):- | ||
|  | 	lpad:p(File). | ||
|  | 
 | ||
|  | sc(Goals,Evidences,Prob,CPUTime1,0.0,WallTime1,0.0):- | ||
|  | 	statistics(cputime,[_,_]), | ||
|  | 	statistics(walltime,[_,_]), | ||
|  | 	lpad:convert_to_goal(Goals,Goal), | ||
|  | 	lpad:convert_to_goal(Evidences,Evidence), | ||
|  | 	solve_cond(Goal,Evidence,Prob), | ||
|  | 	statistics(cputime,[_,CT1]), | ||
|  | 	CPUTime1 is CT1/1000, | ||
|  | 	statistics(walltime,[_,WT1]), | ||
|  | 	WallTime1 is WT1/1000. | ||
|  | 
 | ||
|  | sc(Goals,Evidences,Prob):- | ||
|  | 	lpad:convert_to_goal(Goals,Goal), | ||
|  | 	lpad:convert_to_goal(Evidences,Evidence), | ||
|  | 	solve_cond(Goal,Evidence,Prob). | ||
|  | 
 | ||
|  | 
 | ||
|  | solve_cond(Goal,Evidence,Prob):- | ||
|  | 	(setof((DerivE,D),slg(Evidence,DerivE,D),LCouplesE)-> | ||
|  | 		separate(LCouplesE,LCDupE,LDefClE), | ||
|  | 		lpad:rem_dup_lists(LCDupE,[],LCE), | ||
|  | 		lpad:build_formula(LCE,FormulaE,[],VarE), | ||
|  | 		lpad:var2numbers(VarE,0,NewVarE), | ||
|  | 		lpad:compute_prob(NewVarE,FormulaE,ProbE,0), | ||
|  | 		solve_cond_goals(Goal,LCE,ProbGE,LGE,LDefClGE), | ||
|  | 		(setof((R,S),N^(member(C,LGE),member((N,R,S),C)),LDisClGE)-> | ||
|  | 			true | ||
|  | 		; | ||
|  | 			LDisClGE=[] | ||
|  | 		), | ||
|  | 		append(LDefClGE,LDefClE,LDefDup), | ||
|  | 		remove_duplicates(LDefDup,LDef), | ||
|  | 		append(LDisClGE,LDef,LCl), | ||
|  | 		test_validity(LCl), | ||
|  | 		Prob is ProbGE/ProbE | ||
|  | 	; | ||
|  | 		format("P(Evidence)=0~n",[]), | ||
|  | 		Prob=undefined | ||
|  | 	). | ||
|  | 
 | ||
|  | solve_cond_goals(Goals,LE,ProbGE,LGE,LDefClGE):- | ||
|  | 	(setof((DerivGE,D),find_deriv_GE(LE,Goals,DerivGE,D),LCouplesGE)-> | ||
|  | 		separate(LCouplesGE,LCDupGE,LDefClGE), | ||
|  | 		lpad:rem_dup_lists(LCDupGE,[],LGE), | ||
|  | 		lpad:build_formula(LGE,FormulaGE,[],VarGE), | ||
|  | 		lpad:var2numbers(VarGE,0,NewVarGE), | ||
|  | 		lpad:call_compute_prob(NewVarGE,FormulaGE,ProbGE) | ||
|  | 	; | ||
|  | 		ProbGE=0 | ||
|  | 	). | ||
|  | 
 | ||
|  | find_deriv_GE(LD,GoalsList,Deriv,Def):- | ||
|  | 	member(D,LD), | ||
|  | 	lpad:slg(GoalsList,D,DerivDup,[],Def), | ||
|  | 	remove_duplicates(DerivDup,Deriv). | ||
|  | 	 | ||
|  | s(GoalsList,Prob):- | ||
|  | 	lpad:convert_to_goal(GoalsList,Goal), | ||
|  | 	solve(Goal,Prob). | ||
|  | 
 | ||
|  | s(GoalsList,Prob,CPUTime1,0.0,WallTime1,0.0):- | ||
|  | 	statistics(cputime,[_,_]), | ||
|  | 	statistics(walltime,[_,_]), | ||
|  | 	lpad:convert_to_goal(GoalsList,Goal), | ||
|  | 	solve(Goal,Prob), | ||
|  | 	statistics(cputime,[_,CT1]), | ||
|  | 	CPUTime1 is CT1/1000, | ||
|  | 	statistics(walltime,[_,WT1]), | ||
|  | 	WallTime1 is WT1/1000. | ||
|  | 
 | ||
|  | solve(Goal,Prob):- | ||
|  | 	(setof((C,D),slg(Goal,C,D),LCouples)-> | ||
|  | 		separate(LCouples,LCDup,LDefCl), | ||
|  | 		(member(unsound,LCDup)-> | ||
|  | 			format("Unsound program ~n",[]), | ||
|  | 			Prob=unsound | ||
|  | 		; | ||
|  | 			lpad:rem_dup_lists(LCDup,[],L), | ||
|  | 			(ground(L)-> | ||
|  | 				lpad:build_formula(L,Formula,[],Var), | ||
|  | 				lpad:var2numbers(Var,0,NewVar), | ||
|  | 				(setting(savedot,true)-> | ||
|  | 					format("Variables: ~p~n",[Var]), | ||
|  | 					lpad:compute_prob(NewVar,Formula,_Prob,1) | ||
|  | 				; | ||
|  | 					lpad:compute_prob(NewVar,Formula,Prob,0) | ||
|  | 				), | ||
|  | 				(setof((R,S),N^(member(C,LCDup),member((N,R,S),C)),LDisCl)-> | ||
|  | 					true | ||
|  | 				; | ||
|  | 					LDisCl=[] | ||
|  | 				), | ||
|  | 				append(LDisCl,LDefCl,LCl), | ||
|  | 				test_validity(LCl) | ||
|  | 			; | ||
|  | 				format("It requires the choice of a head atom from a non ground head~n~p~n",[L]), | ||
|  | 				Prob=non_ground | ||
|  | 			) | ||
|  | 		) | ||
|  | 	; | ||
|  | 		Prob=0 | ||
|  | 	). | ||
|  | 
 | ||
|  | test_validity(L):- | ||
|  | 	retractall(semcpl:root(_)), | ||
|  | 	retractall(semcpl:clauses(_)), | ||
|  | 	retractall(semcpl:herbrand_base(_)), | ||
|  | 	retractall(semcpl:node(_,_,_,_,_)), | ||
|  | 	retractall(semcpl:new_number(_)), | ||
|  | 	assert(semcpl:new_number(0)), | ||
|  | 	get_clauses_hb(L,LC,HBDup), | ||
|  | 	remove_duplicates(HBDup,HB0), | ||
|  | 	delete(HB0, '' ,HB), | ||
|  | 	assert(semcpl:herbrand_base(HB)), | ||
|  | 	assert(semcpl:clauses(LC)), | ||
|  | 	build. | ||
|  | 
 | ||
|  | get_clauses_hb([],[],[]):-!. | ||
|  | 
 | ||
|  | get_clauses_hb([(R,S)|T],[r(Head,Body)|TR],HB):- | ||
|  | 	lpad:rule(R,S,_,Head,Body),!, | ||
|  | 	get_atoms(Head,Atoms), | ||
|  | 	append(Atoms,HB0,HB), | ||
|  | 	get_clauses_hb(T,TR,HB0). | ||
|  | 
 | ||
|  | get_clauses_hb([(R,S)|T],[r([Head:1],Body)|TR],HB):- | ||
|  | 	lpad:def_rule(R,S,Head,Body), | ||
|  | 	append([Head],HB0,HB), | ||
|  | 	get_clauses_hb(T,TR,HB0). | ||
|  | 
 | ||
|  | get_atoms([],[]):-!. | ||
|  | 
 | ||
|  | get_atoms([H:_P|T],[H|TA]):- | ||
|  | 	get_atoms(T,TA). | ||
|  | 	 | ||
|  | separate([],[],[]):-!. | ||
|  | 
 | ||
|  | separate([(C,D)|T],[C|TC],Cl):- | ||
|  | 	append(D,Cl0,Cl), | ||
|  | 	separate(T,TC,Cl0). | ||
|  | 	 |