- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
must_be(Type, Term) :-
+ must_be_(type, Type),
must_be_(Type, Term).
-
must_be_(Type, _) :-
var(Type),
instantiation_error(Type).
must_be_(integer, Term) :- check_(integer, integer, Term).
must_be_(atom, Term) :- check_(atom, atom, Term).
must_be_(list, Term) :- check_(ilist, list, Term).
+must_be_(type, Term) :- check_(type, type, Term).
check_(Pred, Type, Term) :-
( var(Term) -> instantiation_error(Term)
ilist([]).
ilist([_|Ls]) :- ilist(Ls).
+type(type).
+type(integer).
+type(atom).
+type(list).
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
can_be(Type, Term)
can_be(Type, Term) :-
+ must_be(type, Type),
( var(Term) -> true
; can_(Type, Term) -> true
; type_error(Type, Term)