39 lines
		
	
	
		
			630 B
		
	
	
	
		
			Prolog
		
	
	
	
	
	
			
		
		
	
	
			39 lines
		
	
	
		
			630 B
		
	
	
	
		
			Prolog
		
	
	
	
	
	
 | 
						|
:- source.
 | 
						|
 | 
						|
:- [library(ytest)].
 | 
						|
:- [library(hacks)].
 | 
						|
 | 
						|
:- [meta_tests].
 | 
						|
 | 
						|
meta_expand( Clause, Canon) :-
 | 
						|
    source_module(M),
 | 
						|
    indicator( M:Clause, I, _J),
 | 
						|
    dynamic( I ),
 | 
						|
    assert(Clause, R),
 | 
						|
    clause(J, B, R),
 | 
						|
    fully_strip_module(J, MH, H),
 | 
						|
    ( MH == M
 | 
						|
    ->
 | 
						|
      HF = H
 | 
						|
    ;
 | 
						|
      HF = MH:H
 | 
						|
    ),
 | 
						|
    ( B == true
 | 
						|
    ->
 | 
						|
      Canon = HF
 | 
						|
    ;
 | 
						|
      Canon = ( HF :- B )
 | 
						|
    ),
 | 
						|
    erase(R).
 | 
						|
 | 
						|
indicator(MC, HM:N/A, HM:G0) :-
 | 
						|
    fully_strip_module(MC, M, C),
 | 
						|
    ( C = ( H:- _) -> true ; C = H),
 | 
						|
    fully_strip_module(M:H, HM, HF),
 | 
						|
    functor(HF, N, A),
 | 
						|
    functor(G0, N, A).
 | 
						|
 | 
						|
 | 
						|
:- initialization run_tests.
 |