I'm not sure I understand write_canonical/1 anymore

?- X = A{}, write_canonical(X).
_{}
X = A{}.

?- X = A{}, A = {}, write_canonical(X).
{}{}
X = {}{},
A = {}.

?- X = A{}, A = {}, write_canonical(X), X = {}{}.
ERROR: Syntax error: Operator expected
ERROR: X = A{}, A = {}, write_canonical(X), X = {
ERROR: ** here **
ERROR: }{} . 
?- 

Dict tags are meant to be atoms or unbound. As is, you can create terms that cannot be read by creating a dict using a variable tag and binding it to something that is not an atom. I don’t think it is that much of a problem. The introduction of cyclic terms already broke fully transparent read/write of arbitrary Prolog terms. SWI-Prolog’s blobs added one more issue and this is number three :slight_smile: