39
40:- module(cdq, []). 41
42:- license(gpl_swipl, 'CLP(CDQ)'). 43:- use_module(library(arithmetic)). 44:- use_module(library(neck)). 45:- use_module(library(near_utils)). 46:- use_module(library(cdqr), []). 47:- use_module(library(clpcd/domain_ops)). 48:- reexport(library(clpcd)). 49:- init_expansors. 50
51clpcd_domain_ops:clpcd_module(cdq, cdq).
52
53clpcd_domain_ops:rsgn_d(Type, S, P, C) :-
54 Type = cdq,
55 neck,
56 R is integer(P) mod 2,
57 ( near_compare(=, R, 0 )
58 ->near_compare(=, S, 1),
59 pmone(C)
60 ; near_compare(=, R, 1),
61 C = S
62 ).
63
64clpcd_domain_ops:compare_d(cdq, Op, A, B) :-
65 compare_q(Op, A, B).
66
67compare_q(=, A, B) :- A =:= B.
68compare_q(=<, A, B) :- A =< B.
69compare_q(>=, A, B) :- A >= B.
70compare_q(<, A, B) :- A < B.
71compare_q(>, A, B) :- A > B.
72compare_q(\=, A, B) :- A =\= B.
73
74clpcd_domain_ops:div_d(cdq, A, B, C) :- C is A rdiv B.
75
76cdq_epsilon(R) :-
77 repsilon(E),
78 R is epsilon/E,
79 neck.
80
81clpcd_domain_ops:cast_d(cdq, A, B) :-
82 cdq_epsilon(T),
83 ( number(A)
84 ->( A >= T
85 ->B is rationalize(A)
86 ; B is rational(A)
87 )
88 ; rational(A)
89 ->B is rational(A)
90 ).
91
92clpcd_domain_ops:floor_d(cdq, A, B) :- B is floor(A).
93
94clpcd_domain_ops:ceiling_d(cdq, A, B) :- B is ceiling(A).
95
96clpcd_domain_ops:integerp(cdq, A, A) :- integer(A).
97
98clpcd_domain_ops:eval_d(cdq, F, R) :-
99 eval(F, user, R).
100
101eval(Number, _, Result) :-
102 number(Number),
103 !,
104 Result=Number.
105eval(Term, M, Value) :-
106 clause(arithmetic:eval(Term, M, Value), Body),
107 nonvar(Term),
108 Term \= (_/_),
109 neck,
110 Body.
111eval(A / B, C, D) :-
112 eval(A, C, E),
113 eval(B, C, F),
114 ( integer(E),
115 integer(F)
116 ->D is E rdiv F
117 ; D is E / F
118 )