The "regexp.r1" 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)*aab.
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(cat(star(or(char(a),char(b))), cat(char(a),cat(char(a),char(b)))), S, []).
The run-time queries
:- generate(cat(star(or(char(a),char(b))), cat(char(a),cat(char(a),char(b)))),
[a,a,a,a,a,a,b,b,a,a,a,b],[]).
:- generate(cat(star(or(char(a),char(b))), cat(char(a),cat(char(a),char(b)))),
[a,a,a,a,a,a,b,b,a,b],[]).
:- generate(cat(star(or(char(a),char(b))), cat(char(a),cat(char(a),char(b)))),
[a,b,a,b,a,b,a,b,a,b,a],[]).
:- generate(cat(star(or(char(a),char(b))), cat(char(a),cat(char(a),char(b)))),
[X,Y,Z,V],[]).
Example solution
The following can be obtained by the
ECCE partial deduction system .
Although it runs considerably faster than the original program (5 times
actually) it does
not correspond to a deterministic automaton yet.
generate__1(X1) :- generate__2(X1).
generate__2([a,a,b]).
generate__2([a|X1]) :- generate__2(X1).
generate__2([b|X1]) :- generate__2(X1).
Michael Leuschel