:- use_module(library(terms)).(can be autoloaded)
call(Goal, ST1, ST2)succeeds. Procedurably, the mapping for each (sub) term pair
T1/T2is defined as:
- If T1 is a variable
- mapsubterms/3 unifies T2 with T1.
- mapsubterms_var/3 treats variables as other terms.
call(Goal, T1, T2)succeeds we are done. Note that the mapping does not continue in T2. If this is desired, Goal must call mapsubterms/3 explicitly as part of its conversion.
- If T1 is a dict, map all values, i.e., the tag and keys are left untouched.
- If T1 is a list, map all elements, i.e., the list structure is left untouched.
- If T1 is a compound, use same_functor/3 to instantiate T2 and recurse over the term arguments left to right.
- Otherwise T2 is unified with T1.
Both predicates are implemented using foldsubterms/5.