130 lines
3.6 KiB
C
130 lines
3.6 KiB
C
/*************************************************************************
|
|
* *
|
|
* YAP Prolog *
|
|
* *
|
|
* Yap Prolog was developed at NCCUP - Universidade do Porto *
|
|
* *
|
|
* Copyright L.Damas, V. Santos Costa and Universidade do Porto 1985-- *
|
|
* *
|
|
**************************************************************************
|
|
* *
|
|
* File: range.c *
|
|
* comments: Arithmetic interval computation *
|
|
* *
|
|
* *
|
|
* *
|
|
*************************************************************************/
|
|
#ifdef SCCS
|
|
static char SccsId[] = "%W% %G%";
|
|
#endif
|
|
|
|
#include "Yap.h"
|
|
#include "Yatom.h"
|
|
#include "YapHeap.h"
|
|
#include "eval.h"
|
|
|
|
static Int
|
|
p_in_range( USES_REGS1 ) {
|
|
Term t;
|
|
double i,j;
|
|
double d1;
|
|
double d2;
|
|
double d3;
|
|
|
|
t = Deref(ARG1);
|
|
if (IsFloatTerm(t)) i = FloatOfTerm(t); else i = IntegerOfTerm(t);
|
|
t = Deref(ARG4);
|
|
if (IsFloatTerm(t)) j = FloatOfTerm(t); else j = IntegerOfTerm(t);
|
|
d1 = i-j;
|
|
t = Deref(ARG2);
|
|
if (IsFloatTerm(t)) i = FloatOfTerm(t); else i = IntegerOfTerm(t);
|
|
t = Deref(ARG5);
|
|
if (IsFloatTerm(t)) j = FloatOfTerm(t); else j = IntegerOfTerm(t);
|
|
d2 = i-j;
|
|
t = Deref(ARG3);
|
|
if (IsFloatTerm(t)) i = FloatOfTerm(t); else i = IntegerOfTerm(t);
|
|
t = Deref(ARG6);
|
|
if (IsFloatTerm(t)) j = FloatOfTerm(t); else j = IntegerOfTerm(t);
|
|
d3 = i-j;
|
|
t = Deref(ARG7);
|
|
if (IsFloatTerm(t)) i = FloatOfTerm(t); else i = IntegerOfTerm(t);
|
|
t = Deref(ARG8);
|
|
if (IsFloatTerm(t)) j = FloatOfTerm(t); else j = IntegerOfTerm(t);
|
|
|
|
return fabs(sqrt(d1*d1 + d2*d2 + d3*d3)-i) <= j;
|
|
|
|
}
|
|
|
|
static Int
|
|
p_in_range2( USES_REGS1 ) {
|
|
CELL *p1, *p2;
|
|
Term t;
|
|
double i,j;
|
|
double d1;
|
|
double d2;
|
|
double d3;
|
|
UInt arity;
|
|
p1 = RepAppl(Deref(ARG1));
|
|
arity = ArityOfFunctor((Functor)*p1);
|
|
p1 += arity-2;
|
|
p2 = RepAppl(Deref(ARG2))+(arity-2);;
|
|
|
|
t = Deref(p1[0]);
|
|
if (IsFloatTerm(t)) i = FloatOfTerm(t); else i = IntegerOfTerm(t);
|
|
t = Deref(p2[0]);
|
|
if (IsFloatTerm(t)) j = FloatOfTerm(t); else j = IntegerOfTerm(t);
|
|
d1 = i-j;
|
|
t = Deref(p1[1]);
|
|
if (IsFloatTerm(t)) i = FloatOfTerm(t); else i = IntegerOfTerm(t);
|
|
t = Deref(p2[1]);
|
|
if (IsFloatTerm(t)) j = FloatOfTerm(t); else j = IntegerOfTerm(t);
|
|
d2 = i-j;
|
|
t = Deref(p1[2]);
|
|
if (IsFloatTerm(t)) i = FloatOfTerm(t); else i = IntegerOfTerm(t);
|
|
t = Deref(p2[2]);
|
|
if (IsFloatTerm(t)) j = FloatOfTerm(t); else j = IntegerOfTerm(t);
|
|
d3 = i-j;
|
|
t = Deref(ARG3);
|
|
if (IsFloatTerm(t)) i = FloatOfTerm(t); else i = IntegerOfTerm(t);
|
|
t = Deref(ARG4);
|
|
if (IsFloatTerm(t)) j = FloatOfTerm(t); else j = IntegerOfTerm(t);
|
|
|
|
return fabs(sqrt(d1*d1 + d2*d2 + d3*d3)-i) <= j;
|
|
}
|
|
|
|
static Int
|
|
p_euc_dist( USES_REGS1 ) {
|
|
Term t1 = Deref(ARG1);
|
|
Term t2 = Deref(ARG2);
|
|
double d1 = (double)(IntegerOfTerm(ArgOfTerm(1,t1))-IntegerOfTerm(ArgOfTerm(1,t2)));
|
|
double d2 = (double)(IntegerOfTerm(ArgOfTerm(2,t1))-IntegerOfTerm(ArgOfTerm(2,t2)));
|
|
double d3 = (double)(IntegerOfTerm(ArgOfTerm(3,t1))-IntegerOfTerm(ArgOfTerm(3,t2)));
|
|
Int result = (Int)sqrt(d1*d1+d2*d2+d3*d3);
|
|
return(Yap_unify(ARG3,MkIntegerTerm(result)));
|
|
}
|
|
|
|
#if DEBUG
|
|
volatile int loop_counter = 0;
|
|
|
|
static Int
|
|
p_loop( USES_REGS1 ) {
|
|
while (loop_counter == 0);
|
|
return(TRUE);
|
|
}
|
|
#endif
|
|
|
|
void
|
|
Yap_InitRange(void)
|
|
{
|
|
CACHE_REGS
|
|
Term cm = CurrentModule;
|
|
CurrentModule = RANGE_MODULE;
|
|
Yap_InitCPred("euclidean_distance", 3, p_euc_dist, SafePredFlag);
|
|
#ifdef DEBUG
|
|
Yap_InitCPred("loop", 0, p_loop, SafePredFlag);
|
|
#endif
|
|
Yap_InitCPred("in_range", 8, p_in_range, TestPredFlag|SafePredFlag);
|
|
Yap_InitCPred("in_range", 4, p_in_range2, TestPredFlag|SafePredFlag);
|
|
CurrentModule = cm;
|
|
}
|