YAP 7.1.0
range.c
1/*************************************************************************
2* *
3* YAP Prolog *
4* *
5* Yap Prolog was developed at NCCUP - Universidade do Porto *
6* *
7* Copyright L.Damas, V. Santos Costa and Universidade do Porto 1985-- *
8* *
9**************************************************************************
10* *
11* File: range.c *
12* comments: Arithmetic interval computation *
13* *
14* *
15* *
16*************************************************************************/
17#ifdef SCCS
18static char SccsId[] = "%W% %G%";
19#endif
20
21#include "Yap.h"
22#include "Yatom.h"
23#include "YapHeap.h"
24#include "YapEval.h"
25
26static Int
27p_in_range( USES_REGS1 ) {
28 Term t;
29 double i,j;
30 double d1;
31 double d2;
32 double d3;
33
34 t = Deref(ARG1);
35 if (IsFloatTerm(t)) i = FloatOfTerm(t); else i = IntegerOfTerm(t);
36 t = Deref(ARG4);
37 if (IsFloatTerm(t)) j = FloatOfTerm(t); else j = IntegerOfTerm(t);
38 d1 = i-j;
39 t = Deref(ARG2);
40 if (IsFloatTerm(t)) i = FloatOfTerm(t); else i = IntegerOfTerm(t);
41 t = Deref(ARG5);
42 if (IsFloatTerm(t)) j = FloatOfTerm(t); else j = IntegerOfTerm(t);
43 d2 = i-j;
44 t = Deref(ARG3);
45 if (IsFloatTerm(t)) i = FloatOfTerm(t); else i = IntegerOfTerm(t);
46 t = Deref(ARG6);
47 if (IsFloatTerm(t)) j = FloatOfTerm(t); else j = IntegerOfTerm(t);
48 d3 = i-j;
49 t = Deref(ARG7);
50 if (IsFloatTerm(t)) i = FloatOfTerm(t); else i = IntegerOfTerm(t);
51 t = Deref(ARG8);
52 if (IsFloatTerm(t)) j = FloatOfTerm(t); else j = IntegerOfTerm(t);
53
54 return fabs(sqrt(d1*d1 + d2*d2 + d3*d3)-i) <= j;
55
56}
57
58static Int
59p_in_range2( USES_REGS1 ) {
60 CELL *p1, *p2;
61 Term t;
62 double i,j;
63 double d1;
64 double d2;
65 double d3;
66 UInt arity;
67 p1 = RepAppl(Deref(ARG1));
68 arity = ArityOfFunctor((Functor)*p1);
69 p1 += arity-2;
70 p2 = RepAppl(Deref(ARG2))+(arity-2);;
71
72 t = Deref(p1[0]);
73 if (IsFloatTerm(t)) i = FloatOfTerm(t); else i = IntegerOfTerm(t);
74 t = Deref(p2[0]);
75 if (IsFloatTerm(t)) j = FloatOfTerm(t); else j = IntegerOfTerm(t);
76 d1 = i-j;
77 t = Deref(p1[1]);
78 if (IsFloatTerm(t)) i = FloatOfTerm(t); else i = IntegerOfTerm(t);
79 t = Deref(p2[1]);
80 if (IsFloatTerm(t)) j = FloatOfTerm(t); else j = IntegerOfTerm(t);
81 d2 = i-j;
82 t = Deref(p1[2]);
83 if (IsFloatTerm(t)) i = FloatOfTerm(t); else i = IntegerOfTerm(t);
84 t = Deref(p2[2]);
85 if (IsFloatTerm(t)) j = FloatOfTerm(t); else j = IntegerOfTerm(t);
86 d3 = i-j;
87 t = Deref(ARG3);
88 if (IsFloatTerm(t)) i = FloatOfTerm(t); else i = IntegerOfTerm(t);
89 t = Deref(ARG4);
90 if (IsFloatTerm(t)) j = FloatOfTerm(t); else j = IntegerOfTerm(t);
91
92 return fabs(sqrt(d1*d1 + d2*d2 + d3*d3)-i) <= j;
93}
94
95static Int
96p_euc_dist( USES_REGS1 ) {
97 Term t1 = Deref(ARG1);
98 Term t2 = Deref(ARG2);
99 double d1 = (double)(IntegerOfTerm(ArgOfTerm(1,t1))-IntegerOfTerm(ArgOfTerm(1,t2)));
100 double d2 = (double)(IntegerOfTerm(ArgOfTerm(2,t1))-IntegerOfTerm(ArgOfTerm(2,t2)));
101 double d3 = (double)(IntegerOfTerm(ArgOfTerm(3,t1))-IntegerOfTerm(ArgOfTerm(3,t2)));
102 Int result = (Int)sqrt(d1*d1+d2*d2+d3*d3);
103 return(Yap_unify(ARG3,MkIntegerTerm(result)));
104}
105
106#if DEBUG
107volatile int loop_counter = 0;
108
109static Int
110p_loop( USES_REGS1 ) {
111 while (loop_counter == 0);
112 return(TRUE);
113}
114#endif
115
116void
117Yap_InitRange(void)
118{
119 CACHE_REGS
120 Term cm = CurrentModule;
121 CurrentModule = RANGE_MODULE;
122 Yap_InitCPred("euclidean_distance", 3, p_euc_dist, SafePredFlag);
123#ifdef DEBUG
124 Yap_InitCPred("loop", 0, p_loop, SafePredFlag);
125#endif
126 Yap_InitCPred("in_range", 8, p_in_range, TestPredFlag|SafePredFlag);
127 Yap_InitCPred("in_range", 4, p_in_range2, TestPredFlag|SafePredFlag);
128 CurrentModule = cm;
129}
Main definitions.