1%
    2% Addition (for testing)
    3%
    4int_hook(plus, plus1(atomic, atomic), atomic, []).
    5plus1(atomic(A), atomic(B), atomic(Res), _Flags) :-
    6    !,
    7    writeln(+),
    8    Res is A + B.
    9
   10int_hook(plus, plus2(..., ...), ..., []).
   11plus2(A, B, Res, Flags) :-
   12    !,
   13    writeln(+),
   14    interval_(A + B, Res, Flags).
   15
   16%
   17% Fractions, i.e., numerator, line, and denominator
   18%
   19int_hook(frac, frac(_, _), _, []).
   20frac(A, B, Res, Flags) :-
   21    option(digits(Dig), Flags, _),
   22    interval_(round(A, atomic(Dig)), A1, Flags),
   23    interval_(round(B, atomic(Dig)), B1, Flags),
   24    !,
   25    interval(A1 / B1, Res, Flags).
   26 
   27int_hook(dfrac, dfrac(_, _), _, []).
   28dfrac(A, B, Res, Flags) :-
   29    interval(frac(A, B), Res, Flags).
   30
   31%
   32% Reasonable number of digits
   33%
   34int_hook(tstat, tstat(_), _, []).
   35tstat(A, Res, Flags) :-
   36    interval_(round(A, atomic(2)), Res, Flags).
   37
   38int_hook(hdrs, hdrs(_), _, []).
   39hdrs(A, Res, Flags) :-
   40    interval_(round(A, atomic(1)), Res, Flags).
   41
   42int_hook(chi2ratio, chi2ratio(_), _, []).
   43chi2ratio(A, Res, Flags) :-
   44    interval_(round(A, atomic(2)), Res, Flags).
   45
   46int_hook(pval, pval(_), _, []).
   47pval(A, Res, Flags) :-
   48    interval_(round(A, atomic(3)), Res, Flags).
   49
   50%
   51% Bugs
   52%
   53% Forget parts of an expression
   54int_hook(omit_left, left(_), _, [evaluate(false)]).
   55left(A, Res, Flags) :-
   56    A =.. [_Op, _L, R],
   57    interval_(R, Res, Flags).
   58
   59int_hook(omit_right, right(_), _, [evaluate(false)]).
   60right(A, Res, Flags) :-
   61    A =.. [_Op, L, _R],
   62    interval_(L, Res, Flags).
   63
   64int_hook(omit, omit(_, _), _, [evaluate(false)]).
   65omit(_Bug, _Expr, na, _Flags).
   66
   67% Instead
   68int_hook(instead, instead1(_, _, _), _, [evaluate(false)]).
   69instead1(_Bug, Wrong, _Correct, Res, Flags) :-
   70    interval_(Wrong, Res, Flags).
   71
   72int_hook(instead, instead2(_, _, _, _), _, [evaluate(false)]).
   73instead2(_Bug, Wrong, _Correct, _Correct0, Res, Flags) :-
   74    interval_(Wrong, Res, Flags).
   75
   76% Drop
   77int_hook(drop_right, drop_right(_, _), _, [evaluate(false)]).
   78drop_right(_Bug, A, Res, Flags) :-
   79    right(A, Res, Flags).
   80
   81int_hook(drop_left, drop_left(_, _), _, [evaluate(false)]).
   82drop_left(_Bug, A, Res, Flags) :-
   83    left(A, Res, Flags).
   84
   85% add_left, add_right
   86int_hook(add_right, add(_, _), _, [evaluate(false)]).
   87add(_Bug, A, Res, Flags) :-
   88    interval_(A, Res, Flags).
   89
   90int_hook(add_left, add(_, _), _, [evaluate(false)]).
   91
   92%
   93% Multiply
   94%
   95int_hook(dot, dot(_, _), _, []).
   96dot(A, B, Res, Flags) :-
   97    interval_(A * B, Res, Flags).
   98
   99%
  100% Available: not NA
  101%
  102int_hook(available, avail1(atomic), _, []).
  103avail1(atomic(A), Res, _Flags) :-
  104    avail2(atomic(A), Res),
  105    !,
  106    Res = true 
  107    ;   Res = false.
  108
  109avail2(atomic(A), Res),
  110   integer(A)
  111=> eval(A, Res).
  112
  113avail2(atomic(A), Res),
  114   number(A)
  115=> float_class(A, Class),
  116   dif(Class, nan),
  117   eval(A, Res).
  118
  119avail2(atomic(A), Res)
  120=> eval(A, A1),
  121   avail2(A1, Res).
  122
  123int_hook(available, avail3(...), _, []).
  124avail3(A ... B, Res, _Flags)
  125=> avail2(atomic(A), A1),
  126   avail2(atomic(B), B1),
  127   eval(A1, B1, _),
  128   !,
  129   Res = true;
  130   Res = false.
  131
  132int_hook(=@=, equal1(_, _), _, []).
  133equal1(A, B, Res, Flags) :-
  134    interval_(A =:= B, Res, Flags).
  135
  136% Addition CI
  137int_hook(+, ciplus1(ci, _), ci, []).
  138ciplus1(ci(A, B), C, Res, Flags) :-
  139    interval_(A + C, A1, Flags),
  140    interval_(B + C, B1, Flags),
  141    Res = ci(A1, B1).
  142
  143int_hook(+, ciplus2(_, ci), ci, []).
  144ciplus2(C, ci(A, B), Res, Flags) :-
  145    ciplus1(ci(A, B), C, Res, Flags).
  146
  147% Subtraction CI
  148int_hook(-, ciminus(ci, _), ci, []).
  149ciminus(ci(A, B), C, Res, Flags) :-
  150    interval_(A - C, A1, Flags),
  151    interval_(B - C, B1, Flags),
  152    Res = ci(A1, B1).
  153
  154% Multiplication CI
  155int_hook(*, cimult(ci, _), ci, []).
  156cimult(ci(A, B), C, Res, Flags) :-
  157    interval_(A * C, A1, Flags),
  158    interval_(B * C, B1, Flags),
  159    Res = ci(A1, B1).
  160
  161% Division CI
  162int_hook(/, cidiv(ci, _), ci, []).
  163cidiv(ci(A, B), C, Res, Flags) :-
  164    interval_(A / C, A1, Flags),
  165    interval_(B / C, B1, Flags),
  166    Res = ci(A1, B1).
  167
  168% Exponential CI
  169int_hook(exp, ciexp(ci), ci, []).
  170ciexp(ci(A, B), Res, Flags) :-
  171    interval_(exp(A), A1, Flags),
  172    interval_(exp(B), B1, Flags),
  173    Res = ci(A1, B1).
  174
  175% Plus/minus
  176int_hook(pm, pm(_, _), ci, []).
  177pm(A, B, Res, Flags) :-
  178    interval_(A - B, A1, Flags),
  179    interval_(A + B, B1, Flags),
  180    Res = ci(A1, B1).
  181
  182%
  183% Equation sign: named arguments in R functions (leave name unchanged)
  184%
  185/* int_hook(=, equ(_, _), _, []).
  186equ(Name, A, Res, Flags) :-
  187    interval_(A, A1, Flags),
  188    Res = (Name = A1). */
  189
  190%
  191% Denote
  192%
  193int_hook(denote, den(_, _, _), _, [evaluate(false)]).
  194den(_Sym, A, _Text, Res, Flags) :-
  195    interval_(A, A1, Flags),
  196    Res = A1.
  197
  198%
  199% Color
  200%
  201int_hook(color, col(_, _), _, [evaluate(false)]).
  202col(_Col, A, Res, Flags) :-
  203    interval_(A, A1, Flags),
  204    Res = A1.
  205
  206%
  207% Read intervals from input
  208%
  209int_hook(@, read(_, _), _, []).
  210read(Options, A, Res, Flags) :-
  211    !, append(Options, Flags, New),
  212    option(digits(D), New, 1.0Inf),
  213    Eps is 10^(-D)/2,
  214    MEps is -Eps,
  215    interval_(A + MEps...Eps, Res, New).
  216
  217%
  218% Other
  219%
  220int_hook(';', or(_, _), _, []).
  221or(A, B, Res, Flags) :-
  222    interval_(A, _, Flags),
  223    interval_(B, Res, Flags).
  224
  225int_hook('{}', curly(_), _, []).
  226curly(A, Res, Flags) :-
  227    interval_(A, Res, Flags)