60 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Prolog
		
	
	
	
	
	
			
		
		
	
	
			60 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Prolog
		
	
	
	
	
	
| :- module(cuda, [cuda_extensional/2,
 | |
| 		 cuda_inline/2,
 | |
| 		 cuda_rule/2,
 | |
| 		 cuda_erase/1,
 | |
| 		 cuda_eval/3,
 | |
| 		 cuda_coverage/4,
 | |
| 		 cuda_statistics/0,
 | |
| 		 cuda_count/2,
 | |
| 		 cuda_query/1]).
 | |
| 
 | |
| tell_warning :-
 | |
| 	print_message(warning,functionality(cuda)).
 | |
| 
 | |
| :- dynamic inline/2.
 | |
| 
 | |
| :- catch(load_foreign_files([cuda], [], init_cuda),_,fail) -> true ; tell_warning.
 | |
| 
 | |
| :- meta_predicate cudda_extensional(:,-).
 | |
| 
 | |
| cuda_inline(P, Q) :-
 | |
| 	assert(inline(P,Q)).
 | |
| 
 | |
| cuda_extensional( Call, IdFacts) :-
 | |
| 	strip_module(Call, Mod, Name/Arity),
 | |
| 	functor(S, Name, Arity),
 | |
| 	count_answers( Mod:S, N),
 | |
| 	% reserve space
 | |
| 	cuda_init_facts( N, Arity, Name, IdFacts ),
 | |
| 	% fill it out
 | |
| 	( Mod:S, cuda_load_fact(S), fail ; true ).
 | |
| 
 | |
| count_answers(G, N) :-
 | |
|         S = count(0),
 | |
|         ( 
 | |
|             G,
 | |
|             arg(1, S, I0),
 | |
|             I is I0+1,
 | |
|             nb_setarg(1, S, I),
 | |
|             fail ;
 | |
|             S = count(N) ).
 | |
| 
 | |
| cuda_rule((Head :- Body) , IdRules) :-
 | |
| 	body_to_list( Body, L, [], 1, N),
 | |
| 	functor(Head, Na, Ar),
 | |
| 	load_rule( N, Ar, [Head|L], IdRules ).
 | |
| 
 | |
| 
 | |
| body_to_list( (B1, B2), LF, L0, N0, NF) :- !,
 | |
| 	body_to_list( B1, LF, LI, N0, N1), 
 | |
| 	body_to_list( B2, LI, L0, N1, NF). 
 | |
| body_to_list( true, L, L, N, N) :- !.
 | |
| body_to_list( B, NL, L, N0, N) :-
 | |
| 	inline( B, NB ), !,
 | |
| 	body_to_list( NB, NL, L, N0, N).
 | |
| body_to_list( B, [B|L], L, N0, N) :-
 | |
| 	N is N0+1.
 | |
| 
 | |
| cuda_query(Call) :-
 | |
| 	cuda_init_query(Call).
 |