- Added more generic term iterators.
This commit is contained in:
parent
eb5a39522b
commit
c5695d6fe8
74
src/term.c
74
src/term.c
@ -278,7 +278,8 @@ termSubTerm (Term t, Term tsub)
|
|||||||
return (termSubTerm (t->left.op1, tsub)
|
return (termSubTerm (t->left.op1, tsub)
|
||||||
|| termSubTerm (t->right.op2, tsub));
|
|| termSubTerm (t->right.op2, tsub));
|
||||||
else
|
else
|
||||||
return (termSubTerm (t->left.op, tsub) || termSubTerm (t->right.key, tsub));
|
return (termSubTerm (t->left.op, tsub)
|
||||||
|
|| termSubTerm (t->right.key, tsub));
|
||||||
}
|
}
|
||||||
|
|
||||||
//! See if a term is an interm of another.
|
//! See if a term is an interm of another.
|
||||||
@ -912,6 +913,77 @@ termOrder (Term t1, Term t2)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//! Generic term iteration
|
||||||
|
int
|
||||||
|
term_iterate (const Term term, int (*leaf) (), int (*nodel) (),
|
||||||
|
int (*nodem) (), int (*noder) ())
|
||||||
|
{
|
||||||
|
if (term != NULL)
|
||||||
|
{
|
||||||
|
if (realTermLeaf (term))
|
||||||
|
{
|
||||||
|
// Leaf
|
||||||
|
if (leaf != NULL)
|
||||||
|
{
|
||||||
|
return leaf (term);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int flag;
|
||||||
|
|
||||||
|
flag = 1;
|
||||||
|
|
||||||
|
if (nodel != NULL)
|
||||||
|
flag = flag && nodel (term);
|
||||||
|
|
||||||
|
if (realTermTuple (term))
|
||||||
|
flag = flag
|
||||||
|
&& (term_iterate (term->left.op1, leaf, nodel, nodem, noder));
|
||||||
|
else
|
||||||
|
flag = flag
|
||||||
|
&& (term_iterate (term->left.op, leaf, nodel, nodem, noder));
|
||||||
|
|
||||||
|
if (nodem != NULL)
|
||||||
|
flag = flag && nodem (term);
|
||||||
|
|
||||||
|
if (realTermTuple (term))
|
||||||
|
flag = flag
|
||||||
|
&& (term_iterate (term->left.op1, leaf, nodel, nodem, noder));
|
||||||
|
else
|
||||||
|
flag = flag
|
||||||
|
&& (term_iterate (term->left.op, leaf, nodel, nodem, noder));
|
||||||
|
|
||||||
|
if (noder != NULL)
|
||||||
|
flag = flag && noder (term);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
//! Generic term iteration with deVar
|
||||||
|
int
|
||||||
|
term_iterate_deVar (const Term term, int (*leaf) (), int (*nodel) (),
|
||||||
|
int (*nodem) (), int (*noder) ())
|
||||||
|
{
|
||||||
|
int deVar_leaf (const Term term)
|
||||||
|
{
|
||||||
|
if (substVar (term))
|
||||||
|
{
|
||||||
|
return term_iterate_deVar (term->subst, deVar_leaf, nodel, nodem,
|
||||||
|
noder);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (leaf == NULL)
|
||||||
|
return 1;
|
||||||
|
else
|
||||||
|
return leaf (term);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return term_iterate (term, deVar_leaf, nodel, nodem, noder);
|
||||||
|
}
|
||||||
|
|
||||||
//! 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
|
||||||
|
@ -168,6 +168,10 @@ Term tupleProject (Term tt, int n);
|
|||||||
int termSize (Term t);
|
int termSize (Term t);
|
||||||
float termDistance (Term t1, Term t2);
|
float termDistance (Term t1, Term t2);
|
||||||
int termOrder (Term t1, Term t2);
|
int termOrder (Term t1, Term t2);
|
||||||
|
int term_iterate (const Term term, int (*leaf) (), int (*nodel) (),
|
||||||
|
int (*nodem) (), int (*noder) ());
|
||||||
|
int term_iterate_deVar (const Term term, int (*leaf) (), int (*nodel) (),
|
||||||
|
int (*nodem) (), int (*noder) ());
|
||||||
int term_iterate_leaves (const Term t, int (*func) ());
|
int term_iterate_leaves (const Term t, int (*func) ());
|
||||||
int term_iterate_open_leaves (const Term term, int (*func) ());
|
int term_iterate_open_leaves (const Term term, int (*func) ());
|
||||||
void term_rolelocals_are_variables ();
|
void term_rolelocals_are_variables ();
|
||||||
|
Loading…
Reference in New Issue
Block a user