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)