Arities cons 2, tail 1, nil 0, filter 1, 0 0, 1 0, failure 1. # filter records duplicate elements of a list, e.g. # filter([1,1,0,1,0,0]) = [1,0] filter(nil) => nil . filter(cons(X,nil)) => nil . filter(cons(X,cons(X,Xs))) => cons(X,filter(cons(X,Xs))) . filter(cons(0,cons(1,Xs))) => filter(cons(1,Xs)) . filter(cons(1,cons(0,Xs))) => filter(cons(0,Xs)) . # Usual tail function. tail(cons(X,Xs)) => Xs . # Unwanted prefix: 01 cons(0,cons(1,X)) => failure(cons(0,cons(1,X))) . | @c : failure(X) => @zzResult : !FAIL! . %% # Take the language (10|0)* ... @a : nil , cons(1,cons(0,@a)) , cons(0,@a) . # ... compute its suffixes ... @b : @a , tail(@b) . # ... and filter them. @c : filter(@b) .