1:- module(rint, []).    2
    3:- multifile r_hook/1.    4
    5:- reexport(interval).    6:- reexport(r), r_initialize.    7
    8%
    9% Skip R vectors
   10%
   11interval:int_hook((:)/2).
   12interval:int_hook(A:B, A:B, _).
   13
   14%
   15% Obtain atoms or functions from R
   16%
   17interval:eval_hook(Atom, Res) :-
   18    atomic(Atom),
   19    r_hook(Atom),
   20    !,
   21    r(Atom, Res).
   22
   23interval:eval_hook(Expr, Res) :-
   24    compound(Expr),
   25    compound_name_arity(Expr, Name, Arity),
   26    r_hook(Name/Arity),
   27    !,
   28    r(Expr, Res).
   29
   30r_hook(true).
   31r_hook(false).
   32
   33%
   34% Binomial distribution
   35%
   36interval:int_hook(pbinom/4).
   37
   38% lower tail
   39interval:int_hook(pbinom(X, N, P, true), Res, Opt) :-
   40    interval(pbinom0(X, N, P), Res, Opt).
   41
   42r_hook(pbinom0/3).
   43interval:mono(pbinom0/3, [+, -, -]).
   44
   45% upper tail
   46interval:int_hook(pbinom(X, N, P, false), Res, Opt) :-
   47    interval(pbinom1(X, N, P), Res, Opt).
   48
   49r_hook(pbinom1/3).
   50interval:mono(pbinom1/3, [-, +, +]).
   51
   52%
   53% Quantile function
   54%
   55interval:int_hook(qbinom/4).
   56
   57% lower tail
   58interval:int_hook(qbinom(Alpha, N, P, true), Res, Opt) :-
   59    interval(qbinom0(Alpha, N, P), Res, Opt).
   60
   61r_hook(qbinom0/3).
   62interval:mono(qbinom0/3, [+, +, +]).
   63
   64% upper tail
   65interval:int_hook(qbinom(Alpha, N, P, false), Res, Opt) :-
   66    interval(qbinom1(Alpha, N, P), Res, Opt).
   67
   68r_hook(qbinom1/3).
   69interval:mono(qbinom1/3, [-, +, +]).
   70
   71%
   72% Density
   73%
   74interval:int_hook(dbinom/3).
   75
   76% left to X / N
   77interval:int_hook(dbinom(X1...X2, N1...N2, P1...P2), Res, Opt) :-
   78    X2 < N1 * P1,
   79    !,
   80    interval(dbinom0(X1...X2, N1...N2, P1...P2), Res, Opt).
   81
   82r_hook(dbinom0/3).
   83interval:mono(dbinom0/3, [+, -, -]).
   84
   85% right to X / N
   86interval:int_hook(dbinom(X1...X2, N1...N2, P1...P2), Res, Opt) :-
   87    X1 > N2 * P2,
   88    !,
   89    interval(dbinom1(X1...X2, N1...N2, P1...P2), Res, Opt).
   90
   91r_hook(dbinom1/3).
   92interval:mono(dbinom1/3, [-, +, +]).
   93
   94% otherwise
   95interval:int_hook(dbinom(X1...X2, N1...N2, P1...P2), Res, _) :-
   96    r(dbinom2(X1, X2, N1, N2, P1, P2), #(L, U)),
   97    Res = L...U.
   98
   99%
  100% Normal distribution
  101%
  102r_hook(pnorm0/1).
  103interval:mono(pnorm0/1, [+]).
  104
  105interval:int_hook(pnorm/3).
  106interval:int_hook(pnorm(X, Mu, Sigma), Res, Opt) :-
  107     interval((X - Mu)/Sigma, Z, Opt),
  108     interval(pnorm0(Z), Res, Opt).
  109
  110%
  111% Quantile function
  112%
  113r_hook(qnorm0/1).
  114interval:mono(qnorm0/1, [+]).
  115
  116interval:int_hook(qnorm/3).
  117interval:int_hook(qnorm(P, Mu, Sigma), Res, Opt) :-
  118     interval(qnorm0(P), Z, Opt),
  119     interval(Mu + Z * Sigma, Res, Opt).
  120
  121%
  122% Density
  123%
  124r_hook(dnorm1/1).
  125interval:mono(dnorm1/1, [+]).
  126
  127r_hook(dnorm2/1).
  128interval:mono(dnorm2/1, [-]).
  129
  130interval:int_hook(dnorm/3).
  131interval:int_hook(dnorm(X, Mu, Sigma), Res, Opt) :-
  132    interval((X - Mu)/Sigma, Z, Opt),
  133    interval(1/Sigma * dnorm0(Z), Res, Opt).
  134
  135interval:int_hook(dnorm0/1).
  136interval:int_hook(dnorm0(A...B), Res, Opt) :-
  137    B =< 0,
  138    !,
  139    interval(dnorm1(A...B), Res, Opt).
  140
  141interval:int_hook(dnorm0(A...B), Res, Opt) :-
  142    A >= 0,
  143    !,
  144    interval(dnorm2(A...B), Res, Opt).
  145
  146% mixed
  147interval:int_hook(dnorm0(A