call(Goal, ST1, ST2)
succeeds.
Procedurably, the mapping for each (sub) term pair T1/T2
is
defined as:
- If T1 is a variable
- mapsubterms/3 unifies T2 with T1.
- mapsubterms_var/3 treats variables as other terms.
- If
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.