1/*****************************************************************************
    2 * This file is part of the Prolog Development Tool (PDT)
    3 * 
    4 * Author: Andreas Becker
    5 * WWW: http://sewiki.iai.uni-bonn.de/research/pdt/start
    6 * Mail: pdt@lists.iai.uni-bonn.de
    7 * Copyright (C): 2012, CS Dept. III, University of Bonn
    8 * 
    9 * All rights reserved. This program is  made available under the terms
   10 * of the Eclipse Public License v1.0 which accompanies this distribution,
   11 * and is available at http://www.eclipse.org/legal/epl-v10.html
   12 * 
   13 ****************************************************************************/
   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)