The "regexp.r3" Benchmark

Part of the DPPD Library.

General Description

A program testing whether a string matches a regular expression (using difference lists). Much more naive (and smaller) than the program used by Mogensen/Bondorf for Logimix ! The regular expression for this benchmark is ((a+b)(a+b)(a+b)(a+b)(a+b)(a+b))*. This benchmark contains no built-in's nor negations.

The benchmark program

generate(empty,T,T).

generate(char(X),[X|T],T).

generate(or(X,Y),H,T) :- generate(X,H,T).
generate(or(X,Y),H,T) :- generate(Y,H,T).

generate(cat(X,Y),H,T) :- generate(X,H,T1), generate(Y,T1,T).

generate(star(X),T,T).
generate(star(X),H,T) :- generate(X,H,T1), generate(star(X),T1,T).

The partial deduction query

 :- generate(star(cat(or(char(a),char(b)),cat(or(char(a),char(b)),
	cat(or(char(a),char(b)),cat(or(char(a),char(b)),
	cat(or(char(a),char(b)),or(char(a),char(b)))))))),S,[]).

The run-time queries

 :- generate(star(cat(or(char(a),char(b)),cat(or(char(a),char(b)),
		cat(or(char(a),char(b)),cat(or(char(a),char(b)),
		cat(or(char(a),char(b)),or(char(a),char(b)))))))),
		[a,b,a,b,a,b, a,a,a,b,a,b],[]).
 :- generate(star(cat(or(char(a),char(b)),cat(or(char(a),char(b)),
		cat(or(char(a),char(b)),cat(or(char(a),char(b)),
		cat(or(char(a),char(b)),or(char(a),char(b)))))))),
		[a,X,a,b,a,b, a,a,a,Y,b,a],[]).
 :- generate(star(cat(or(char(a),char(b)),cat(or(char(a),char(b)),
		cat(or(char(a),char(b)),cat(or(char(a),char(b)),
		cat(or(char(a),char(b)),or(char(a),char(b)))))))),
		[a,b,a,b,a,a, a,b],[]).
 :- generate(star(cat(or(char(a),char(b)),cat(or(char(a),char(b)),
		cat(or(char(a),char(b)),cat(or(char(a),char(b)),
		cat(or(char(a),char(b)),or(char(a),char(b)))))))),
		[a,b,a,b,a,a, b,b,b,a,b,a, a,b,b,a,a,b],[]).

Example solution

The following can be obtained by the ECCE partial deduction system . It runs considerably faster than the original program (more than 3 times actually) and correspond to a deterministic automaton.
 generate__1([]).
 generate__1(X1) :- generate_conj__2(X1).

 generate_conj__2([a|X1]) :- generate_conj__3(X1).
 generate_conj__2([b|X1]) :- generate_conj__3(X1).

 generate_conj__3([a|X1]) :- generate_conj__4(X1).
 generate_conj__3([b|X1]) :- generate_conj__4(X1).

 generate_conj__4([a|X1]) :- generate_conj__5(X1).
 generate_conj__4([b|X1]) :- generate_conj__5(X1).

 generate_conj__5([a|X1]) :- generate_conj__6(X1).
 generate_conj__5([b|X1]) :- generate_conj__6(X1).

 generate_conj__6([a|X1]) :- generate_conj__7(X1).
 generate_conj__6([b|X1]) :- generate_conj__7(X1).

 generate_conj__7([a|X1]) :- generate__1(X1).
 generate_conj__7([b|X1]) :- generate__1(X1).

Michael Leuschel