14
15:- module(pdt_meta_specification, [extended_meta_predicate/2]). 16
17:- meta_predicate(extended_meta_predicate(:, ?)). 18extended_meta_predicate(Module:Head, MetaSpec) :-
19 extended_meta_spec(Head, Module, MetaSpec).
20
21:- dynamic(extended_meta_spec/3). 22
23:- meta_predicate(extended_meta_predicate(:)). 24extended_meta_predicate(Module:MetaSpec) :-
25 ( valid_meta_spec(MetaSpec)
26 -> store_meta_spec(Module, MetaSpec)
27 ; throw(invalid_extended_meta_predicate_specification(Module:MetaSpec))
28 ).
29
30store_meta_spec(Module, MetaSpec) :-
31 functor(MetaSpec, Name, Arity),
32 functor(Head, Name, Arity),
33 retractall(extended_meta_spec(Head, Module, _)),
34 assertz(extended_meta_spec(Head, Module, MetaSpec)).
35
36valid_meta_spec(Head) :-
37 valid_meta_args(Head, 1).
38valid_meta_args(Head, N) :-
39 arg(N, Head, Arg),
40 !,
41 valid_meta_arg(Arg),
42 N2 is N + 1,
43 valid_meta_args(Head, N2).
44valid_meta_args(_, _).
45
46valid_meta_arg(I) :- integer(I), !.
47valid_meta_arg(^).
48valid_meta_arg(//).
49valid_meta_arg(:).
50valid_meta_arg(?).
51valid_meta_arg(+).
52valid_meta_arg(-).
53valid_meta_arg(*).
54valid_meta_arg(database).
55valid_meta_arg(functor(M)) :- valid_meta_arg(M).
56valid_meta_arg(add_prefix(P, M)) :- atom(P), valid_meta_arg(M).
57valid_meta_arg(add_suffix(S, M)) :- atom(S), valid_meta_arg(M).
58valid_meta_arg(is_prefix(M)) :- valid_meta_arg(M).
59valid_meta_arg(is_suffix(M)) :- valid_meta_arg(M).
60valid_meta_arg(has_arity(I,M)) :- integer(I), valid_meta_arg(M).
61valid_meta_arg(arity(M)) :- valid_meta_arg(M).
62valid_meta_arg(univ_list(M)) :- valid_meta_arg(M)