103 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
		
		
			
		
	
	
			103 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
|   | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||
|  | %  Constraint Handling Rules			      version 2.2 % | ||
|  | %								  % | ||
|  | %  (c) Copyright 1996-98					  % | ||
|  | %  LMU, Muenchen						  % | ||
|  | %								  % | ||
|  | %  File:   matching.pl						  % | ||
|  | %  Author: Christian Holzbaur		christian@ai.univie.ac.at % | ||
|  | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||
|  | 
 | ||
|  | % | ||
|  | % Head matching for SICStus | ||
|  | % ch, Aug. 95 | ||
|  | % | ||
|  | 
 | ||
|  | :- module( matching, []). | ||
|  | 
 | ||
|  | :- op( 1200, xfx, ?-). | ||
|  | 
 | ||
|  | :- use_module( library(assoc), | ||
|  | 	[ | ||
|  | 	    empty_assoc/1, | ||
|  | 	    get_assoc/3, | ||
|  | 	    put_assoc/4 | ||
|  | 	]). | ||
|  | 
 | ||
|  | :- multifile | ||
|  | 	user:term_expansion/2, | ||
|  | 	user:goal_expansion/3. | ||
|  | 
 | ||
|  | :- dynamic | ||
|  | 	user:term_expansion/2, | ||
|  | 	user:goal_expansion/3. | ||
|  | % | ||
|  | user:term_expansion( ?-(M:H0,B), (M:H1 :- Body)) :- !, | ||
|  | 	functor( H0, N, A), | ||
|  | 	functor( H1, N, A), | ||
|  | 	subs( H0, H1, Code, [B]), | ||
|  | 	l2conj( Code, Body). | ||
|  | user:term_expansion( ?-(H0,B), (H1 :- Body)) :- | ||
|  | 	functor( H0, N, A), | ||
|  | 	functor( H1, N, A), | ||
|  | 	subs( H0, H1, Code, [B]), | ||
|  | 	l2conj( Code, Body). | ||
|  | 
 | ||
|  | % | ||
|  | user:goal_expansion( inline_matching(Pattern,Datum), _, Exp) :- | ||
|  | 	code( Pattern, Datum, Exp). | ||
|  | 
 | ||
|  | code( Pattern, Datum, Code) :- | ||
|  | 	subs( Pattern, Datum, L, []), | ||
|  | 	l2conj( L, Code). | ||
|  | 
 | ||
|  | % | ||
|  | % partial evaluation of subsumes( H0, H1) | ||
|  | % | ||
|  | subs( Pattern, Datum, L, Lt) :- | ||
|  | 	empty_assoc( Dict), | ||
|  | 	subs( Pattern, Datum, Dict,_, L, Lt). | ||
|  | 
 | ||
|  | subs( Pattern, Datum, D0,D1) --> {var(Pattern)}, !, | ||
|  | 	{var(Datum)}, | ||
|  | 	( {get_assoc( Pattern, D0, _),D0=D1} -> % subsequent occ | ||
|  | 	     [ Pattern == Datum ] | ||
|  | 	;					% first occ | ||
|  | 	     { | ||
|  | 		 Pattern = Datum, | ||
|  | 		 put_assoc( Pattern, D0, _, D1) | ||
|  | 	     } | ||
|  | 	). | ||
|  | subs( Pattern, Datum, D0,D1) --> {var(Datum)}, !, | ||
|  | 	{ | ||
|  | 	    functor( Pattern, N, A), | ||
|  | 	    functor( Skel, N, A) | ||
|  | 	}, | ||
|  | 	[ | ||
|  | 	    nonvar( Datum), | ||
|  | 	    Datum = Skel | ||
|  | 	], | ||
|  | 	subs( 1, A, Pattern, Skel, D0,D1). | ||
|  | subs( Pattern, Datum, D0,D1) --> | ||
|  | 	{ | ||
|  | 	    functor( Pattern, N, A), | ||
|  | 	    functor( Datum, N, A) | ||
|  | 	}, | ||
|  | 	subs( 1, A, Pattern, Datum, D0,D1). | ||
|  | 
 | ||
|  | subs( N, M, _, _, D0,D0) --> {N>M}, !. | ||
|  | subs( N, M, G, S, D0,D2) --> | ||
|  | 	{ | ||
|  | 	    arg( N, G, Ga), | ||
|  | 	    arg( N, S, Sa), | ||
|  | 	    N1 is N+1 | ||
|  | 	}, | ||
|  | 	subs( Ga, Sa, D0,D1), | ||
|  | 	subs( N1, M, G, S, D1,D2). | ||
|  | 
 | ||
|  | l2conj( [],	true). | ||
|  | l2conj( [X|Xs], Conj) :- | ||
|  |   ( Xs = [], Conj = X | ||
|  |   ; Xs = [_|_], Conj = (X,Xc), l2conj( Xs, Xc) | ||
|  |   ). |