1:- module(file_utilities, [find_files/3]).    2:- meta_predicate find_files(3, -,?, ?).    3
    4find_files(Dir,FilePredicate,DirPredicate) :-
    5  working_directory(CWD,CWD),
    6  absolute_file_name(Dir,XAbs),
    7  directory_files(XAbs,Files),
    8  traverse_files(Files,XAbs,FilePredicate,DirPredicate),
    9  working_directory(_,CWD).
   10
   11traverse_files([],_,_,_) :- !.
   12traverse_files([.|Files],CWD,FilePredicate,DirPredicate) :- traverse_files(Files,CWD,FilePredicate,DirPredicate).
   13traverse_files([..|Files],CWD,FilePredicate,DirPredicate) :- traverse_files(Files,CWD,FilePredicate,DirPredicate).
   14traverse_files([File|Files],CWD,FilePredicate,DirPredicate) :-
   15  working_directory(_,CWD),
   16  absolute_file_name(File,FileA),
   17  exists_file(FileA),
   18  call(FilePredicate,FileA),
   19  traverse_files(Files,CWD,FilePredicate,DirPredicate).
   20traverse_files([File|Files],CWD,FilePredicate,DirPredicate) :-
   21  working_directory(_,CWD),
   22  absolute_file_name(File,FileA),
   23  exists_directory(FileA),
   24  call(DirPredicate,FileA),
   25  find_files(FileA,FilePredicate,DirPredicate),
   26  traverse_files(Files,CWD,FilePredicate,DirPredicate).
   27traverse_files([_|Files],CWD,FilePredicate,DirPredicate) :-
   28  traverse_files(Files,CWD,FilePredicate,DirPredicate)