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
10:- meta_predicate cdqr_eval_d(+,?). 11
12cdqr_eval_d(F, R) :-
13 arithmetic_expression_value(F, R).
14
21
22:- public cdqr/1. 23
24cdqr(cdq).
25cdqr(cdr).
26
27clpcd_domain_ops:eval_d(C, F, R) :-
28 cdqr(C),
29 neck,
30 cdqr_eval_d(F, R).
31
32clpcd_nf:nl_invertible(C,F) :-
33 cdqr(C),
34 neck,
35 cd_invertible(F).
36
37clpcd_nf:nl_invert(C,F,X,Y,Res) :-
38 cdqr(C),
39 neck,
40 cd_invert(F,C,X,Y,N),
41 cast_d(C,N,Res).
42
43:- public cdqr_text/2. 44
45cdqr_text(cdq, 'a rational number').
46cdqr_text(cdr, 'a real number').
47
48clpcd_domain_ops:numbers_only(C,Y) :-
49 cdqr_text(C, Txt),
50 neck,
51 ( var(Y)
52 ; number(Y)
53 ; throw(type_error(_X = Y, 2, Txt, Y))
54 ),
55 !