1:- module(accessors, []).    2
    3:- use_module(library(clpfd)).    4:- set_prolog_flag(clpfd_monotonic, true).    5
    6:- multifile user:term_expansion/2.    7:- dynamic user:term_expansion/2.    8
    9user:term_expansion((:- derive_accessors(Predicate)), Clauses) :-
   10    predicate_accessors(Predicate, Clauses).
   11
   12user:term_expansion((:- derive_accessors(PredName, ArgNamesList)), Clauses) :-
   13    predname_accessors(PredName, ArgNamesList, Clauses).
   14
   15predname_accessors(_,[],[]).
   16predname_accessors(PredName, [ArgName | ArgsTail],[ Term | ClausesTail]) :-
   17    phrase(list_accessor(PredName,ArgName),L),
   18    atomics_to_string(L,S),
   19    atom_to_term(S,Term,_),
   20    predname_accessors(PredName,ArgsTail,ClausesTail).
   21
   22predicate_accessors(Pred,Clauses) :-
   23    Pred =.. [PredName | ArgNamesList],
   24    length(ArgNamesList,Arity),
   25    predname_accessors(PredName,Arity,ArgNamesList,Clauses).
   26
   27predname_accessors(_,_,[],[]). 
   28predname_accessors(PredName,Arity,[Name|NamesTail],[Term | TermsListTail]) :-
   29    length(NamesTail, NumberOfRemainingNames),
   30    #(Index) #= #(Arity) - #(NumberOfRemainingNames),
   31    phrase(accessor(PredName,Arity,Name,Index),L),
   32    atomics_to_string(L,S),
   33    atom_to_term(S,Term,_),
   34    predname_accessors(PredName,Arity,NamesTail,TermsListTail).
   35
   36list_accessor(PredName,Name) -->
   37    ['\''],[PredName],['_'],[Name],['\''], ['(_ListPair,_'],[Name],[') :- \n\t'],
   38        ['member('],[Name],['-_'],[Name],[',_ListPair).'].
   39
   40accessor(PredName,Arity,Name,Index) -->
   41    ['\''],[PredName],['_'],[Name],['\'('],pred(PredName,Arity,Index,Name),[',_'],[Name],[').'].
   42
   43pred(PredName,Arity,Index,Name) -->
   44    ['\''],[PredName],['\'('], pred_rest(Arity,Index,1,Name).
   45
   46pred_rest(Arity, Index, Acc, Name) -->
   47    (
   48        {#(Acc)