1:- module(cdqr, []). 2
3:- use_module(library(arithmetic)). 4:- use_module(library(neck)). 5:- use_module(library(clpcd/domain_ops)). 6:- use_module(library(clpcd/nf)). 7:- use_module(library(clpcd/inv)). 8:- use_module(library(arithex)). 9:- init_expansors. 10
11:- meta_predicate cdqr_eval_d(+,?). 12
13cdqr_eval_d(F, R) :-
14 arithmetic_expression_value(F, R).
15
22
23:- public cdqr/1. 24
25cdqr(cdq).
26cdqr(cdr).
27
28clpcd_domain_ops:eval_d(C, F, R) :-
29 cdqr(C),
30 neck,
31 cdqr_eval_d(F, R).
32
33clpcd_nf:nl_invertible(C,F) :-
34 cdqr(C),
35 neck,
36 cd_invertible(F).
37
38clpcd_nf:nl_invert(C,F,X,Y,Res) :-
39 cdqr(C),
40 neck,
41 cd_invert(F,C,X,Y,N),
42 cast_d(C,N,Res).
43
44:- public cdqr_text/2. 45
46cdqr_text(cdq, 'a rational number').
47cdqr_text(cdr, 'a real number').
48
49clpcd_domain_ops:numbers_only(C,Y) :-
50 cdqr_text(C, Txt),
51 neck,
52 ( var(Y)
53 ; number(Y)
54 ; throw(type_error(_X = Y, 2, Txt, Y))
55 ),
56 !