Created initial stateful version of deVar iteration.

This commit is contained in:
Cas Cremers 2018-10-22 03:18:52 +02:00
parent 596d5dc528
commit fb3b13f4e3
3 changed files with 78 additions and 1 deletions

View File

@ -1,4 +1,4 @@
2 iterateTermOther arachne.c +1010 ; system.c +1139 2 iterateTermOther arachne.c +1053 ; system.c +1155
1 subtermUnify arachne.c +961 1 subtermUnify arachne.c +961
1 term_iterate_open_leaves dotout.c +1790 // Could be replaced by term_iterate_leaves 1 term_iterate_open_leaves dotout.c +1790 // Could be replaced by term_iterate_leaves
1 term_iterate_deVar heuristic.c +224 1 term_iterate_deVar heuristic.c +224
@ -6,3 +6,6 @@
1 iterateLocalToOther prune_theorems.c +54 1 iterateLocalToOther prune_theorems.c +54
1 term_iterate_leaves term.c +1145 1 term_iterate_leaves term.c +1145
1 term_iterate_deVar term.c +1544 1 term_iterate_deVar term.c +1544
term_iterate_deVar
term_iterate_state_deVar

View File

@ -1110,6 +1110,75 @@ term_iterate_deVar (Term term, int (*leaf) (Term t), int (*nodel) (Term t),
return true; return true;
} }
//! Generic term iteration with state
int
term_iterate_state_deVar (Term term, int (*leaf) (Term t, void (*st)),
int (*nodel) (Term t, void (*state)),
int (*nodem) (Term t, void (*st)),
int (*noder) (Term t, void (*st)), void (*state))
{
term = deVar (term);
if (term != NULL)
{
if (realTermLeaf (term))
{
// Leaf
if (leaf != NULL)
{
return leaf (term, state);
}
else
{
return true;
}
}
else
{
int flag;
flag = true;
if (nodel != NULL)
flag = flag && nodel (term, state);
// Left part
if (realTermTuple (term))
flag = flag
&&
(term_iterate_state_deVar
(TermOp1 (term), leaf, nodel, nodem, noder, state));
else
flag = flag
&&
(term_iterate_state_deVar
(TermOp (term), leaf, nodel, nodem, noder, state));
// Center
if (nodem != NULL)
flag = flag && nodem (term, state);
// right part
if (realTermTuple (term))
flag = flag
&&
(term_iterate_state_deVar
(TermOp2 (term), leaf, nodel, nodem, noder, state));
else
flag = flag
&&
(term_iterate_state_deVar
(TermKey (term), leaf, nodel, nodem, noder, state));
if (noder != NULL)
flag = flag && noder (term, state);
return flag;
}
}
return true;
}
//! Iterate over the leaves in a term //! Iterate over the leaves in a term
/** /**
* Note that this function iterates over real leaves; thus closed variables can occur as * Note that this function iterates over real leaves; thus closed variables can occur as

View File

@ -197,6 +197,11 @@ int term_iterate (const Term term, int (*leaf) (Term t),
int term_iterate_deVar (Term term, int (*leaf) (Term t), int term_iterate_deVar (Term term, int (*leaf) (Term t),
int (*nodel) (Term t), int (*nodem) (Term t), int (*nodel) (Term t), int (*nodem) (Term t),
int (*noder) (Term t)); int (*noder) (Term t));
int term_iterate_state_deVar (Term term, int (*leaf) (Term t, void (*st)),
int (*nodel) (Term t, void (*state)),
int (*nodem) (Term t, void (*st)),
int (*noder) (Term t, void (*st)),
void (*state));
int term_iterate_leaves (const Term t, int (*func) (Term t)); int term_iterate_leaves (const Term t, int (*func) (Term t));
int term_iterate_open_leaves (const Term term, int (*func) (Term t)); int term_iterate_open_leaves (const Term term, int (*func) (Term t));
void term_rolelocals_are_variables (); void term_rolelocals_are_variables ();