1:- module(pac_regex_prepare, []).    2
    3char_types(S) :-
    4	 Types =  [alnum, alpha, csym, csymf,digit,lower,cntrl,quote,white],
    5	 setof(T, X^(member(T, Types), char_type(X, T)), S0),
    6	 setof(paren(X), A^char_type(A, paren(X)), S1),
    7	 union(S0, S1, S).
    8
    9
   10types_intervals(X):- char_types(S),
   11	maplist(type_intervals, S, Y),
   12	maplist([T, Is, T-Is], S, Y, X).
   13
   14type_intervals(T, Is):-
   15	setof(J, (between(0, 255, J), code_type(J, T)), Cs),
   16	maplist(code_char, Cs, Js),
   17	codes_intervals(Js, Is).
   18
   19code_char(I, A):- char_code(A, I).
   20
   21char_type_pairs(T0, T1):-
   22	char_types(S),
   23	member(T0, S),
   24	member(T1, S),
   25	T0 @< T1,
   26	char_type(X, T0),
   27	char_type(X, T1).
   28
   29char_type_pairs(S):- setof(T0-T1, char_type_pairs(T0, T1), S).
   30
   31%
   32type_interval_table([alnum-['0'-'9', 'A'-'Z', a-z],
   33		     alpha-['A'-'Z', a-z],
   34		     cntrl-['\000\'-'\037\', '\177\'],
   35		     csym-['0'-'9', 'A'-'Z', '_', a-z],
   36		     csymf-['A'-'Z', '_', a-z],
   37		     digit-['0'-'9'],
   38		     lower-[a-z],
   39		     quote-['"', '\'', '`'],
   40		     white-['\t', ' '],
   41		     paren(')')-['('],
   42		     paren(']')-['['],
   43		     paren('}')-['{']]).
   44
   45codes_intervals([], []).
   46codes_intervals([A|Chars], Is):- codes_intervals(Chars, Js),
   47	codes_intervals(A, Js, Is).
   48
   49%
   50codes_intervals(A, [], [A]).
   51codes_intervals(A, [X-Y|R], [A-Y|R]):- next_char(A, X).
   52codes_intervals(A, [X-Y|R], [A, X-Y|R]).
   53codes_intervals(A, [X|R], [A-X|R]):- atom(X),
   54	next_char(A, X).
   55codes_intervals(A, [X|R], [A, X|R]):- atom(X)