I’m struggling with a simple example of term_expansion. I seems to be missing a trick, or simply having a brain fart.
:- module(scratch,[ z/2, x/1 ]). term_expansion(q(A,B), z(B,A)). q(1,2). % ==> z(2,1). x(q(1,2)). % ==> x(z(2,1)).
?- use_module(scratch). true. ?- scratch:q(X,Y). ERROR: Unknown procedure: scratch:q/2 (DWIM could not correct goal) % Expected ?- scratch:z(2,1). true.
So far so good. But,
?- scratch:x(X). X = q(1, 2). % X = z(2,1) expected.
Am I right in thinking that
q(A,B) is a Term in both
x(q(1,2)).? So why isn’t the replacement
x(q(1,2)) => x(z(2,1)). applied?
I thought that perhaps term_expansion applies only to the clauses asserted during consultion (and not their subcomponent terms) – however, the docs says its applied to “all terms read during consulting” https://www.swi-prolog.org/pldoc/doc_for?object=term_expansion/2 Am I misreading it?