YAP 7.1.0
depth_bound.c
1/*************************************************************************
2* *
3* YAP Prolog *
4* *
5* Yap Prolog was developed at NCCUP - Universidade do Porto *
6* *
7* Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997 *
8* *
9**************************************************************************
10* *
11* File: it_deep.c *
12* Last rev: *
13* mods: *
14* comments: Support for Iterative Deepening *
15* *
16*************************************************************************/
17#ifdef SCCS
18static char SccsId[] = "%W% %G%";
19#endif /* SCCS */
20
21#include <math.h>
22
23#include "Yap.h"
24#include "Yatom.h"
25#include "YapEval.h"
26#include "amiops.h"
27
28#ifdef DEPTH_LIMIT
29
30#include "Yatom.h"
31
32static Int p_get_depth_limit( USES_REGS1 );
33static Int p_set_depth_limit( USES_REGS1 );
34
35static Int p_get_depth_limit( USES_REGS1 )
36{
37 Int d = IntOfTerm(DEPTH);
38 if (d % 2 == 1)
39 return(Yap_unify(ARG1, MkFloatTerm(INFINITY)));
40 return(Yap_unify_constant(ARG1, MkIntTerm(d/2)));
41}
42
43static Int p_set_depth_limit( USES_REGS1 )
44{
45 Term d = Deref(ARG1);
46
47 if (IsVarTerm(d)) {
48 Yap_Error(INSTANTIATION_ERROR, d, "set-depth_limit");
49 return(FALSE);
50 } else if (!IsIntegerTerm(d)) {
51 if (IsFloatTerm(d) && isinf(FloatOfTerm(d))) {
52 d = RESET_DEPTH();
53 } else {
54 Yap_Error(TYPE_ERROR_INTEGER, d, "set-depth_limit");
55 return(FALSE);
56 }
57 }
58 d = MkIntTerm(IntegerOfTerm(d)*2);
59
60 YENV[E_DEPTH] = d;
61 DEPTH = d;
62
63 return(TRUE);
64}
65
66static Int p_set_depth_limit_for_next_call( USES_REGS1 )
67{
68 Term d = Deref(ARG1);
69
70 if (IsVarTerm(d)) {
71 Yap_Error(INSTANTIATION_ERROR, d, "set-depth_limit");
72 return(FALSE);
73 } else if (!IsIntegerTerm(d)) {
74 if (IsFloatTerm(d) && isinf(FloatOfTerm(d))) {
75 DEPTH = RESET_DEPTH();
76 return TRUE;
77 }
78 Yap_Error(TYPE_ERROR_INTEGER, d, "set-depth_limit");
79 return(FALSE);
80 }
81 d = MkIntTerm(IntegerOfTerm(d)*2);
82
83 DEPTH = d;
84
85 return(TRUE);
86}
87
88void Yap_InitItDeepenPreds(void)
89{
90 Yap_InitCPred("get_depth_limit", 1, p_get_depth_limit, SafePredFlag);
91 Yap_InitCPred("$set_depth_limit", 1, p_set_depth_limit, 0);
92 Yap_InitCPred("$set_depth_limit_for_next_call", 1, p_set_depth_limit_for_next_call, 0);
93}
94
95#endif
Main definitions.