3 Part of CHR
(Constraint Handling Rules
)
6 E
-mail
: Tom
.Schrijvers
@cs.kuleuven
.ac
.be
7 WWW
: http
://www
.swi
-prolog
.org
8 Copyright
(C
): 2005-2006, K
.U
. Leuven
10 This program is free software
; you can redistribute it
and/or
11 modify it under the terms of the GNU General Public License
12 as published by the Free Software Foundation
; either version
2
13 of the License
, or (at your option
) any later version
.
15 This program is distributed
in the hope that it will be useful
,
16 but WITHOUT ANY WARRANTY
; without even the implied warranty of
17 MERCHANTABILITY
or FITNESS FOR A PARTICULAR PURPOSE
. See the
18 GNU General Public License
for more details
.
20 You should have received a copy of the GNU Lesser General Public
21 License along with this library
; if not, write to the Free Software
22 Foundation
, Inc
., 59 Temple Place
, Suite
330, Boston
, MA
02111-1307 USA
24 As a special exception
, if you
link this library with other files
,
25 compiled with a Free Software compiler
, to produce an executable
, this
26 library does
not by itself cause the resulting executable to be covered
27 by the GNU General Public License
. This exception does
not however
28 invalidate any other reasons why the executable file might be covered by
29 the GNU General Public License
.
31 :- module
(chr_compiler_utility
,
40 , variable_replacement
/3
41 , variable_replacement
/4
43 , copy_with_variable_replacement
/3
54 :- use_module
(pairlist
).
55 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
59 term_variables
(AC
,AVars
),
60 term_variables
(BC
,BVars
),
66 is_variant1
([X
|Xs
]) :-
72 is_variant2
([X
|Xs
]) :-
76 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
78 statistics
(runtime
,[T1
|_
]),
80 statistics
(runtime
,[T2
|_
]),
82 format
(' ~w:\t\t~w ms\n',[Phase
,T
]).
84 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
94 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
95 pair_all_with
([],_
,[]).
96 pair_all_with
([X
|Xs
],Y
,[X
-Y
|Rest
]) :-
97 pair_all_with
(Xs
,Y
,Rest
).
99 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
100 conj2list
(Conj
,L
) :- %% transform conjunctions to list
101 conj2list
(Conj
,L
,[]).
103 conj2list
(Conj
,L
,T
) :-
106 conj2list
(Conj
,L
,T
) :-
110 conj2list
(G
,[G
| T
],T
).
112 disj2list
(Conj
,L
) :- %% transform disjunctions to list
113 disj2list
(Conj
,L
,[]).
114 disj2list
(Conj
,L
,T
) :-
117 disj2list
(Conj
,L
,T
) :-
121 disj2list
(G
,[G
| T
],T
).
124 list2conj
([G
],X
) :- !, X
= G
.
125 list2conj
([G
|Gs
],C
) :-
126 ( G
== true
-> %% remove some redundant trues
134 list2disj
([G
],X
) :- !, X
= G
.
135 list2disj
([G
|Gs
],C
) :-
136 ( G
== fail
-> %% remove some redundant fails
143 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
144 % check wether two rules are identical
146 identical_rules
(rule
(H11
,H21
,G1
,B1
),rule
(H12
,H22
,G2
,B2
)) :-
148 identical_bodies
(B1
,B2
),
154 identical_bodies
(B1
,B2
) :-
166 % replace variables
in list
168 copy_with_variable_replacement
(X
,Y
,L
) :-
170 ( lookup_eq
(L
,X
,Y
) ->
178 copy_with_variable_replacement_l
(XArgs
,YArgs
,L
)
181 copy_with_variable_replacement_l
([],[],_
).
182 copy_with_variable_replacement_l
([X
|Xs
],[Y
|Ys
],L
) :-
183 copy_with_variable_replacement
(X
,Y
,L
),
184 copy_with_variable_replacement_l
(Xs
,Ys
,L
).
186 %% build variable replacement list
188 variable_replacement
(X
,Y
,L
) :-
189 variable_replacement
(X
,Y
,[],L
).
191 variable_replacement
(X
,Y
,L1
,L2
) :-
194 ( lookup_eq
(L1
,X
,Z
) ->
197 ; ( X
== Y
-> L2
=L1
; L2
= [X
-Y
,Y
-X
|L1
])
202 variable_replacement_l
(XArgs
,YArgs
,L1
,L2
)
205 variable_replacement_l
([],[],L
,L
).
206 variable_replacement_l
([X
|Xs
],[Y
|Ys
],L1
,L3
) :-
207 variable_replacement
(X
,Y
,L1
,L2
),
208 variable_replacement_l
(Xs
,Ys
,L2
,L3
).
210 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
211 my_term_copy
(X
,Dict
,Y
) :-
212 my_term_copy
(X
,Dict
,_
,Y
).
214 my_term_copy
(X
,Dict1
,Dict2
,Y
) :-
216 ( lookup_eq
(Dict1
,X
,Y
) ->
218 ; Dict2
= [X
-Y
|Dict1
]
224 my_term_copy_list
(XArgs
,Dict1
,Dict2
,YArgs
)
227 my_term_copy_list
([],Dict
,Dict
,[]).
228 my_term_copy_list
([X
|Xs
],Dict1
,Dict3
,[Y
|Ys
]) :-
229 my_term_copy
(X
,Dict1
,Dict2
,Y
),
230 my_term_copy_list
(Xs
,Dict2
,Dict3
,Ys
).
232 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
233 atom_concat_list
([X
],X
) :- ! .
234 atom_concat_list
([X
|Xs
],A
) :-
235 atom_concat_list
(Xs
,B
),
239 set_elems
([X
|Xs
],X
) :-
244 init
([X
|Xs
],[X
|R
]) :-
247 member2
([X
|_
],[Y
|_
],X
-Y
).
248 member2
([_
|Xs
],[_
|Ys
],P
) :-
251 select2
(X
, Y
, [X
|Xs
], [Y
|Ys
], Xs
, Ys
).
252 select2
(X
, Y
, [X1
|Xs
], [Y1
|Ys
], [X1
|NXs
], [Y1
|NYs
]) :-
253 select2
(X
, Y
, Xs
, Ys
, NXs
, NYs
).
255 instrument_goal
(Goal
,Pre
,Post
,(Pre
,Goal
,Post
)).