Dear all,
representation_error(max_arity) is defined relative to the max_arity
flag. That's fine for predicates like functor/3 and (=..)/2, but it's
also specified for predicate-indicator predicates like abolish/1 and
current_predicate/1.
The trouble is that some systems make compound-term arity unbounded
(or quite large) while still limiting predicate arity. On SWI:
?- functor(H, foo, 2000). % ok
?- functor(H, foo, 2000), assertz(H). % representation_error(max_procedure_arity)
SWI Prolog solves the issues by splitting max_arity from
max_procedure_arity (the latter isn't ISO). Eclipse Prolog also has
two different limits but error is underreported (ambiguous). Picat,
although not a Prolog system, also has two different limits
(probably rooted in B-Prolog).
That is definitely a problem and most of the ISO tests suites I have
available either fail here or ignore those cases. Some possible directions:
a) force one limit for terms and predicates (simplest but not a solution)
b) raise limit for predicate arity (but that can be a *significant*
implementation effort with low ROI)
c) use max_procedure_arity (and push for future standardization)
d) keep reporting max_arity for both limits, use error context (not
standard) to disambiguate which arity limit has been reached
I lean towards (c) looking for a possible change in the standard, or
(d) as a temporary solution.
(b) is difficult because some limits are intrinsically hard to
raise in some engines (every reasonable computer language has some
kind of procedure argument limits). A fallback calling convention may
help but the implementation cost is not trivial.
What are your opinions?
Thanks,
--
Jose