write infinite terms

This commit is contained in:
Vitor Santos Costa 2018-08-09 16:42:43 +01:00
parent d5c1ca716e
commit ecab37f72c
8 changed files with 43 additions and 16 deletions

View File

@ -1615,6 +1615,8 @@ void Yap_fail_all(choiceptr bb USES_REGS) {
saved_p = P; saved_p = P;
saved_cp = CP; saved_cp = CP;
/* prune away choicepoints */ /* prune away choicepoints */
if (B == bb)
return;
while (B->cp_b && B->cp_b != bb && B->cp_ap != NOCODE) { while (B->cp_b && B->cp_b != bb && B->cp_ap != NOCODE) {
B = B->cp_b; B = B->cp_b;
#ifdef YAPOR #ifdef YAPOR

View File

@ -687,8 +687,9 @@ static void putUnquotedString(Term string, struct write_globs *wglb)
static Term from_pointer(CELL *ptr0, struct rewind_term *rwt, static Term from_pointer(CELL *ptr0, struct rewind_term *rwt,
struct write_globs *wglb) { struct write_globs *wglb) {
CACHE_REGS CACHE_REGS
Term t; Term t, ti;
CELL *ptr = ptr0; CELL *ptr = ptr0;
int i = 0;
while (IsVarTerm(*ptr) && !IsUnboundVar(ptr)) while (IsVarTerm(*ptr) && !IsUnboundVar(ptr))
ptr = (CELL *)*ptr; ptr = (CELL *)*ptr;
@ -701,9 +702,13 @@ static Term from_pointer(CELL *ptr0, struct rewind_term *rwt,
if (!IsAtomicTerm(t) && !IsVarTerm(t)) { if (!IsAtomicTerm(t) && !IsVarTerm(t)) {
while (x) { while (x) {
if (Yap_GetDerefedFromSlot(x->u_sd.s.old) == t) if (Yap_GetDerefedFromSlot(x->u_sd.s.old) == t) {
return TermFoundVar; ti = MkIntegerTerm(i);
return Yap_MkApplTerm(FunctorDoubleHat, 1, &ti);
}
x = x->parent; x = x->parent;
i++;
} }
} }
} else { } else {
@ -713,9 +718,12 @@ static Term from_pointer(CELL *ptr0, struct rewind_term *rwt,
struct rewind_term *x = rwt->parent; struct rewind_term *x = rwt->parent;
while (x) { while (x) {
if (x->u_sd.d.old == t) if (x->u_sd.d.old == t) {
return TermFoundVar; ti = MkIntegerTerm(i);
return Yap_MkApplTerm(FunctorDoubleHat, 1, &ti);
}
x = x->parent; x = x->parent;
i++;
} }
} }
} }
@ -790,20 +798,23 @@ static void write_var(CELL *t, struct write_globs *wglb,
} }
} }
static Term check_infinite_loop(Term t, struct rewind_term *x, static int check_infinite_loop(Term t, struct rewind_term *x,
struct write_globs *wglb) { struct write_globs *wglb) {
CACHE_REGS CACHE_REGS
int i =0;
if (wglb->Keep_terms) { if (wglb->Keep_terms) {
while (x) { while (x) {
if (Yap_GetFromSlot(x->u_sd.s.old) == t) if (Yap_GetFromSlot(x->u_sd.s.old) == t)
return TermFoundVar; return i;
x = x->parent; x = x->parent;
i++;
} }
} else { } else {
while (x) { while (x) {
if (x->u_sd.d.old == t) if (x->u_sd.d.old == t)
return TermFoundVar; return i;
x = x->parent; x = x->parent;
i++;
} }
} }
return t; return t;
@ -826,9 +837,16 @@ static void write_list(Term t, int direction, int depth,
ti = TailOfTerm(t); ti = TailOfTerm(t);
if (IsVarTerm(ti)) if (IsVarTerm(ti))
break; break;
if (!IsPairTerm(ti) || if (!IsPairTerm(ti))
!IsPairTerm((ti = check_infinite_loop(ti, rwt, wglb))))
break; break;
int i;
if ((i = check_infinite_loop(ti, rwt, wglb))>0) {
char s[1024];
snprintf(s, 1023, "%d", i);
wrputs(" ^^(", wglb->stream);
wrputs(s, wglb->stream);
wrputs(") ", wglb->stream);
}
ndirection = RepPair(ti) - RepPair(t); ndirection = RepPair(ti) - RepPair(t);
/* make sure we're not trapped in loops */ /* make sure we're not trapped in loops */
if (ndirection > 0) { if (ndirection > 0) {

View File

@ -187,6 +187,7 @@ A GlobalSp N "global_sp"
A GlobalTrie N "global_trie" A GlobalTrie N "global_trie"
A GoalExpansion N "goal_expansion" A GoalExpansion N "goal_expansion"
A Hat N "^" A Hat N "^"
A DoubleHat N "^^"
A HERE N "\n <====HERE====> \n" A HERE N "\n <====HERE====> \n"
A HandleThrow F "$handle_throw" A HandleThrow F "$handle_throw"
A Heap N "heap" A Heap N "heap"
@ -535,6 +536,7 @@ F GoalExpansion2 GoalExpansion 2
F GoalExpansion GoalExpansion 3 F GoalExpansion GoalExpansion 3
F HandleThrow HandleThrow 3 F HandleThrow HandleThrow 3
F Hat Hat 2 F Hat Hat 2
F DoubleHat DoubleHat 1
F I I 2 F I I 2
F Id Id 1 F Id Id 1
F Info1 Info 1 F Info1 Info 1

View File

@ -182,6 +182,7 @@
AtomGlobalTrie = Yap_LookupAtom("global_trie"); TermGlobalTrie = MkAtomTerm(AtomGlobalTrie); AtomGlobalTrie = Yap_LookupAtom("global_trie"); TermGlobalTrie = MkAtomTerm(AtomGlobalTrie);
AtomGoalExpansion = Yap_LookupAtom("goal_expansion"); TermGoalExpansion = MkAtomTerm(AtomGoalExpansion); AtomGoalExpansion = Yap_LookupAtom("goal_expansion"); TermGoalExpansion = MkAtomTerm(AtomGoalExpansion);
AtomHat = Yap_LookupAtom("^"); TermHat = MkAtomTerm(AtomHat); AtomHat = Yap_LookupAtom("^"); TermHat = MkAtomTerm(AtomHat);
AtomDoubleHat = Yap_LookupAtom("^^"); TermDoubleHat = MkAtomTerm(AtomDoubleHat);
AtomHERE = Yap_LookupAtom("\n <====HERE====> \n"); TermHERE = MkAtomTerm(AtomHERE); AtomHERE = Yap_LookupAtom("\n <====HERE====> \n"); TermHERE = MkAtomTerm(AtomHERE);
AtomHandleThrow = Yap_FullLookupAtom("$handle_throw"); TermHandleThrow = MkAtomTerm(AtomHandleThrow); AtomHandleThrow = Yap_FullLookupAtom("$handle_throw"); TermHandleThrow = MkAtomTerm(AtomHandleThrow);
AtomHeap = Yap_LookupAtom("heap"); TermHeap = MkAtomTerm(AtomHeap); AtomHeap = Yap_LookupAtom("heap"); TermHeap = MkAtomTerm(AtomHeap);
@ -530,6 +531,7 @@
FunctorGoalExpansion = Yap_MkFunctor(AtomGoalExpansion,3); FunctorGoalExpansion = Yap_MkFunctor(AtomGoalExpansion,3);
FunctorHandleThrow = Yap_MkFunctor(AtomHandleThrow,3); FunctorHandleThrow = Yap_MkFunctor(AtomHandleThrow,3);
FunctorHat = Yap_MkFunctor(AtomHat,2); FunctorHat = Yap_MkFunctor(AtomHat,2);
FunctorDoubleHat = Yap_MkFunctor(AtomDoubleHat,1);
FunctorI = Yap_MkFunctor(AtomI,2); FunctorI = Yap_MkFunctor(AtomI,2);
FunctorId = Yap_MkFunctor(AtomId,1); FunctorId = Yap_MkFunctor(AtomId,1);
FunctorInfo1 = Yap_MkFunctor(AtomInfo,1); FunctorInfo1 = Yap_MkFunctor(AtomInfo,1);

View File

@ -182,6 +182,7 @@
AtomGlobalTrie = AtomAdjust(AtomGlobalTrie); TermGlobalTrie = MkAtomTerm(AtomGlobalTrie); AtomGlobalTrie = AtomAdjust(AtomGlobalTrie); TermGlobalTrie = MkAtomTerm(AtomGlobalTrie);
AtomGoalExpansion = AtomAdjust(AtomGoalExpansion); TermGoalExpansion = MkAtomTerm(AtomGoalExpansion); AtomGoalExpansion = AtomAdjust(AtomGoalExpansion); TermGoalExpansion = MkAtomTerm(AtomGoalExpansion);
AtomHat = AtomAdjust(AtomHat); TermHat = MkAtomTerm(AtomHat); AtomHat = AtomAdjust(AtomHat); TermHat = MkAtomTerm(AtomHat);
AtomDoubleHat = AtomAdjust(AtomDoubleHat); TermDoubleHat = MkAtomTerm(AtomDoubleHat);
AtomHERE = AtomAdjust(AtomHERE); TermHERE = MkAtomTerm(AtomHERE); AtomHERE = AtomAdjust(AtomHERE); TermHERE = MkAtomTerm(AtomHERE);
AtomHandleThrow = AtomAdjust(AtomHandleThrow); TermHandleThrow = MkAtomTerm(AtomHandleThrow); AtomHandleThrow = AtomAdjust(AtomHandleThrow); TermHandleThrow = MkAtomTerm(AtomHandleThrow);
AtomHeap = AtomAdjust(AtomHeap); TermHeap = MkAtomTerm(AtomHeap); AtomHeap = AtomAdjust(AtomHeap); TermHeap = MkAtomTerm(AtomHeap);
@ -530,6 +531,7 @@
FunctorGoalExpansion = FuncAdjust(FunctorGoalExpansion); FunctorGoalExpansion = FuncAdjust(FunctorGoalExpansion);
FunctorHandleThrow = FuncAdjust(FunctorHandleThrow); FunctorHandleThrow = FuncAdjust(FunctorHandleThrow);
FunctorHat = FuncAdjust(FunctorHat); FunctorHat = FuncAdjust(FunctorHat);
FunctorDoubleHat = FuncAdjust(FunctorDoubleHat);
FunctorI = FuncAdjust(FunctorI); FunctorI = FuncAdjust(FunctorI);
FunctorId = FuncAdjust(FunctorId); FunctorId = FuncAdjust(FunctorId);
FunctorInfo1 = FuncAdjust(FunctorInfo1); FunctorInfo1 = FuncAdjust(FunctorInfo1);

View File

@ -182,6 +182,7 @@ X_API EXTERNAL Atom AtomGlobalSp; X_API EXTERNAL Term TermGlobalSp;
X_API EXTERNAL Atom AtomGlobalTrie; X_API EXTERNAL Term TermGlobalTrie; X_API EXTERNAL Atom AtomGlobalTrie; X_API EXTERNAL Term TermGlobalTrie;
X_API EXTERNAL Atom AtomGoalExpansion; X_API EXTERNAL Term TermGoalExpansion; X_API EXTERNAL Atom AtomGoalExpansion; X_API EXTERNAL Term TermGoalExpansion;
X_API EXTERNAL Atom AtomHat; X_API EXTERNAL Term TermHat; X_API EXTERNAL Atom AtomHat; X_API EXTERNAL Term TermHat;
X_API EXTERNAL Atom AtomDoubleHat; X_API EXTERNAL Term TermDoubleHat;
X_API EXTERNAL Atom AtomHERE; X_API EXTERNAL Term TermHERE; X_API EXTERNAL Atom AtomHERE; X_API EXTERNAL Term TermHERE;
X_API EXTERNAL Atom AtomHandleThrow; X_API EXTERNAL Term TermHandleThrow; X_API EXTERNAL Atom AtomHandleThrow; X_API EXTERNAL Term TermHandleThrow;
X_API EXTERNAL Atom AtomHeap; X_API EXTERNAL Term TermHeap; X_API EXTERNAL Atom AtomHeap; X_API EXTERNAL Term TermHeap;
@ -614,6 +615,8 @@ X_API EXTERNAL Functor FunctorHandleThrow;
X_API EXTERNAL Functor FunctorHat; X_API EXTERNAL Functor FunctorHat;
X_API EXTERNAL Functor FunctorDoubleHat;
X_API EXTERNAL Functor FunctorI; X_API EXTERNAL Functor FunctorI;
X_API EXTERNAL Functor FunctorId; X_API EXTERNAL Functor FunctorId;

View File

@ -207,8 +207,6 @@
:- module(learning,[do_learning/1, :- module(learning,[do_learning/1,
do_learning/2, do_learning/2,
set_problog_flag/2,
problog_flag/2,
reset_learning/0 reset_learning/0
]). ]).
@ -630,7 +628,7 @@ init_one_query(QueryID,Query,Type) :-
rb_new(H0), rb_new(H0),
maplist_to_hash(MapList, H0, Hash), maplist_to_hash(MapList, H0, Hash),
Tree \= [], Tree \= [],
% writeln(Dir:Tree:MapList), writeln(QueryID),
tree_to_grad(Tree, Hash, [], Grad), tree_to_grad(Tree, Hash, [], Grad),
recordz(QueryID,bdd(Dir, Grad, MapList),_) recordz(QueryID,bdd(Dir, Grad, MapList),_)
) )

View File

@ -181,7 +181,7 @@ display(Stream, T) :-
/* interface to user portray */ /* interface to user portray */
'$portray'(T) :- '$portray'(T) :-
\+ '$undefined'(portray(_),user), \+ '$undefined'(portray(_),user),
'$system_catch'(call(portray(T)),user,Error,user:'$Error'(Error)), !, catch(user:portray(T),user,Error,user:'$Error'(Error)), !,
set_value('$portray',true), fail. set_value('$portray',true), fail.
'$portray'(_) :- set_value('$portray',false), fail. '$portray'(_) :- set_value('$portray',false), fail.