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)
|
||
|
).
|