:- use_module(library(dcg_util)). lowercase(C) --> [C], { between(0'a, 0'z, C) }. :- use_module(library(tap)). % make sure our auxiliary predicate behaves as expected 'lowercase is behaving' :- phrase(lowercase(C), `hello`, Rest), C == 0'h, Rest == `ello`. 'username: parse, whole text' :- Text = `mndrix`, once(phrase(greedy(lowercase,Name),Text)), Name == Text. 'username: parse, partial text' :- Text = `mndrix wrote this`, once(phrase(greedy(lowercase,Name),Text,Rest)), Name == `mndrix`, Rest == ` wrote this`. backtrack :- Text = `abc`, findall(X,phrase(greedy(lowercase,X),Text,_), Xs), Xs == [`abc`,`ab`,`a`,``].