1:- module(expr, [expr/2, expr/3, expr/4, expr/5, expr/6]). 14
49expr --> [].
50expr --> [_], expr.
51
53expr(E) --> kleene(E, min).
54expr(E, X) --> kleene(E, min, X, []).
55expr(E, X, Y) --> kleene(E, min, X, Y).
56expr(E, M, X, Y) --> kleene(E, M, X, Y).
57
59
78
80kleene([], min) --> [].
81kleene([C|R], min) --> !, [C], kleene(R, min).
82kleene([C|R], max) --> [C], kleene(R, max).
83kleene([], max) --> !, [].
84kleene(X+Y, M) --> kleene(X, M), kleene(Y, M).
85kleene(dot, _) --> [_].
86kleene(dot(L), _) --> [C], {kleene_dot(C,L)}.
87kleene(out(L), _) --> [C], {\+kleene_dot(C,L)}.
88kleene(*(E), M) --> kleene_star(E, M). 89kleene(+(E), M) --> kleene(E, M), kleene_star(E, M).
90kleene(?(E), M) --> kleene(E, M); [].
91kleene(E^N, M) --> kleene_repeat(N,E, M).
92kleene(char(L), _) --> [C], {char_type(C,L)}.
93kleene(code(L), _) --> [C], {code_type(C,L)}.
94kleene((E|E0), M) --> kleene(E, M); kleene(E0, M).
95kleene(\+(E), M) --> \+ kleene(E, M).
96kleene(&(E,E0), M, A,B) :- kleene(E,M,A,B), kleene(E0,M,A,B).
97kleene(nil,_,[],[]).
98kleene(rest,_,_,[]).
99kleene(min(E), _) --> kleene(E, min).
100kleene(max(E), _) --> kleene(E, max).
101
103kleene_star(E, min) --> !, ([]; kleene(E, min), kleene_star(E, min)).
104kleene_star(E, _) --> ( kleene(E, max), kleene_star(E, max) ; [] ).
105
107kleene([], min, X,X) --> [].
108kleene([C|R],min,[C|X],Y) --> !, [C], kleene(R,min,X,Y).
109kleene([C|R],max,[C|X],Y) --> [C], kleene(R,min,X,Y).
110kleene([], max, X, X) --> !, [].
111kleene(E+E0,M,X,Y) --> kleene(E,M,X,X0), kleene(E0,M,X0,Y).
112kleene(*(E),M,X,Y) --> kleene_star(E,M,X,Y).
113kleene(+(E),M,X,Y) --> kleene(E,M,X,X0), kleene_star(E,M,X0,Y).
114kleene(dot,_,[C|X],X) --> [C].
115kleene(dot(L),_,[C|X],X) --> [C], {kleene_dot(C,L)}.
116kleene(out(L),_,[C|X],X) --> [C], {\+kleene_dot(C,L)}.
117kleene(code(L),_,[C|X],X) --> [C], {code_type(C,L)}.
118kleene(char(L),_,[C|X],X) --> [C], {char_type(C,L)}.
119kleene(E^N,M,X,Y) --> kleene_repeat(N,E,M,X,Y).
120kleene(?(E),M,X,Y) --> kleene(E,M,X,Y); { X = Y }.
121kleene((E|E0),M,X,Y) --> kleene(E,M,X,Y); kleene(E0,M,X,Y).
122kleene(\+(E),M,X,Y) --> \+ kleene(E, M,X,Y).
123kleene(max(L),_,X, Y) --> kleene(L,max,X,Y).
124kleene(min(L),_,X,Y) --> kleene(L,min,X,Y).
125kleene(&(E,E0),M,X,Y,A,B) :- kleene(E,M,X,Y,A,B), kleene(E0,M,X,Y,A,B).
126kleene(nil,_,X,X,[],[]).
127kleene(rest,_,A,B,X,[]) :- append(X, B, A).
128
130kleene_star(_, min, X, X) --> [].
131kleene_star(E, min, X, Y) --> !, kleene(E, min, X, X0),
132 {compound(X)},
133 kleene_star(E, min, X0,Y).
134kleene_star(E, max, X, Y) --> kleene(E, max, X, X0),
135 {compound(X)},
136 kleene_star(E, max, X0,Y).
137kleene_star(_,max,X,X) --> [].
138
140kleene_dot(A,[A|_]) :- !.
141kleene_dot(A,[B-C|_]) :- B @=< A, A @=< C, !.
142kleene_dot(A,[_|L]) :- kleene_dot(A,L).
143
145kleene_repeat(0,_,_) --> [].
146kleene_repeat(N,E,M) --> {N>0}, kleene(E, M),
147 {N1 is N-1},
148 kleene_repeat(N1,E,M).
149
151kleene_repeat(0,_,_,X,X)--> [].
152kleene_repeat(N,E,M,X,Y)--> {N>0}, !,
153 kleene(E,M,X,X0),
154 {N1 is N-1},
155 kleene_repeat(N1,E,M,X0,Y)