From fb3b13f4e39c0d5f071275b69ff491a4e302e433 Mon Sep 17 00:00:00 2001 From: Cas Cremers Date: Mon, 22 Oct 2018 03:18:52 +0200 Subject: [PATCH] Created initial stateful version of deVar iteration. --- src/TODO-trampolines.txt | 5 ++- src/term.c | 69 ++++++++++++++++++++++++++++++++++++++++ src/term.h | 5 +++ 3 files changed, 78 insertions(+), 1 deletion(-) diff --git a/src/TODO-trampolines.txt b/src/TODO-trampolines.txt index 559e242..f2a5966 100644 --- a/src/TODO-trampolines.txt +++ b/src/TODO-trampolines.txt @@ -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 term_iterate_open_leaves dotout.c +1790 // Could be replaced by term_iterate_leaves 1 term_iterate_deVar heuristic.c +224 @@ -6,3 +6,6 @@ 1 iterateLocalToOther prune_theorems.c +54 1 term_iterate_leaves term.c +1145 1 term_iterate_deVar term.c +1544 + +term_iterate_deVar + term_iterate_state_deVar diff --git a/src/term.c b/src/term.c index 11665d2..e5984ec 100644 --- a/src/term.c +++ b/src/term.c @@ -1110,6 +1110,75 @@ term_iterate_deVar (Term term, int (*leaf) (Term t), int (*nodel) (Term t), 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 /** * Note that this function iterates over real leaves; thus closed variables can occur as diff --git a/src/term.h b/src/term.h index b779981..6bdab1c 100644 --- a/src/term.h +++ b/src/term.h @@ -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 (*nodel) (Term t), int (*nodem) (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_open_leaves (const Term term, int (*func) (Term t)); void term_rolelocals_are_variables ();