1:- module(rint, []). 2
3:- multifile r_hook/1. 4
5:- reexport(interval). 6:- reexport(r), r_initialize. 7
11interval:int_hook((:)/2).
12interval:int_hook(A:B, A:B, _).
13
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
36interval:int_hook(pbinom/4).
37
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
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
55interval:int_hook(qbinom/4).
56
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
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
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
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
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
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