From abe9f20a8580c32db26fc902883343839fd39b90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADtor=20Santos=20Costa?= Date: Sun, 20 Jan 2013 23:15:09 +0000 Subject: [PATCH] depth limit cn go to infinity --- C/arith1.c | 3 +-- C/depth_bound.c | 22 +++++++++++++++++++--- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/C/arith1.c b/C/arith1.c index 86c9b8379..9b7ac7dc5 100644 --- a/C/arith1.c +++ b/C/arith1.c @@ -523,8 +523,7 @@ eval1(Int fi, Term t) { #endif #if HAVE_ISINF if (isinf(dbl)) { - return Yap_ArithError(EVALUATION_ERROR_INT_OVERFLOW, MkFloatTerm(dbl), "integer\ -(%f)",dbl); + return Yap_ArithError(EVALUATION_ERROR_INT_OVERFLOW, MkFloatTerm(dbl), "integer (%f)",dbl); } #endif if (dbl < 0.0) diff --git a/C/depth_bound.c b/C/depth_bound.c index cf56a392a..b29558366 100644 --- a/C/depth_bound.c +++ b/C/depth_bound.c @@ -18,6 +18,11 @@ static char SccsId[] = "%W% %G%"; #endif /* SCCS */ +#include +#ifndef INFINITY +#define INFINITY (1.0/0.0) +#endif + #include "Yap.h" #ifdef DEPTH_LIMIT @@ -29,7 +34,10 @@ STD_PROTO(static Int p_set_depth_limit, ( USES_REGS1 )); static Int p_get_depth_limit( USES_REGS1 ) { - return(Yap_unify_constant(ARG1, MkIntTerm(IntOfTerm(DEPTH/2)))); + Int d = IntOfTerm(DEPTH); + if (d % 2 == 1) + return(Yap_unify(ARG1, MkFloatTerm(INFINITY))); + return(Yap_unify_constant(ARG1, MkIntTerm(d/2))); } static Int p_set_depth_limit( USES_REGS1 ) @@ -40,8 +48,12 @@ static Int p_set_depth_limit( USES_REGS1 ) Yap_Error(INSTANTIATION_ERROR, d, "set-depth_limit"); return(FALSE); } else if (!IsIntegerTerm(d)) { - Yap_Error(TYPE_ERROR_INTEGER, d, "set-depth_limit"); - return(FALSE); + if (IsFloatTerm(d) && isinf(FloatOfTerm(d))) { + d = RESET_DEPTH(); + } else { + Yap_Error(TYPE_ERROR_INTEGER, d, "set-depth_limit"); + return(FALSE); + } } d = MkIntTerm(IntegerOfTerm(d)*2); @@ -59,6 +71,10 @@ static Int p_set_depth_limit_for_next_call( USES_REGS1 ) Yap_Error(INSTANTIATION_ERROR, d, "set-depth_limit"); return(FALSE); } else if (!IsIntegerTerm(d)) { + if (IsFloatTerm(d) && isinf(FloatOfTerm(d))) { + DEPTH = RESET_DEPTH(); + return TRUE; + } Yap_Error(TYPE_ERROR_INTEGER, d, "set-depth_limit"); return(FALSE); }