%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  clp(q,r)                                         version 1.3.3 %
%                                                                 %
%  (c) Copyright 1992,1993,1994,1995                              %
%  Austrian Research Institute for Artificial Intelligence (OFAI) %
%  Schottengasse 3                                                %
%  A-1010 Vienna, Austria                                         %
%                                                                 %
%  File:   arith_r.pl                                             %
%  Author: Christian Holzbaur           christian@ai.univie.ac.at %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


:- module( arith_r, 
	[
	    arith_eps/1,
	    arith_normalize/2,
	    integerp/1,
	    integerp/2
	]).

%
% Modules receiving R expansion
%
arith_module( clpr).
arith_module( nfr).

:- multifile
	user:goal_expansion/3.

:- dynamic
	user:goal_expansion/3.
%

user:goal_expansion(arith_eval(Term,Res), Module, Expansion) :-
	arith_module( Module),
	compile_R( Term, Res, Code),
	l2conj( Code, Expansion).

user:goal_expansion(arith_eval(Rel), Module, Expansion) :-
	arith_module( Module),
	compile_R( Rel, boolean, Code),
	l2conj( Code, Expansion).

user:goal_expansion(case_signum(Term,Lt,Z,Gt), Module, Expansion) :-
	arith_module( Module),
	compile_case_signum_R( Term, Lt,Z,Gt, Code),
	l2conj( Code, Expansion).

:- ensure_loaded( '../clpqr/arith').

%
% This the only place where this constant lives
%
arith_eps( 1.0e-10).				% for Monash #zero expansion 1.0e-12
eps( 1.0e-10, -1.0e-10).

arith_normalize( X,	   Norm) :- var(X), !, 
  raise_exception( instantiation_error(arith_normalize(X,Norm),1)).
arith_normalize( rat(N,D), Norm) :- rat_float( N,D, Norm).
arith_normalize( X,	   Norm) :- number(X),
  Norm is float(X).

integerp( X) :-
  floor(/*float?*/X)=:=X.

integerp( X, I) :-
  floor(/*float?*/X)=:=X,
  I is integer(X).