Oh no, so you have even more types of text to deal with! Amending my previous post for the sake of accuracy:
“Text” is a routine which prints something out. Since it’s a routine, something like “It is currently [time of day].” can show a different time every time it’s run.
“Indexed text” is an array of characters, like in most other programming languages. (I think it’s stored Pascal-style, with the first byte holding the total number of characters, rather than C-style with a terminator, but you never actually need to worry about that.) You can modify individual characters, convert the whole thing to uppercase, and so on. But since it’s just a bunch of characters, it’ll never change unless you change it: text substitutions don’t work any more.
Inform has ways of converting text to indexed text (running the routine and capturing its output), and printing out indexed text, so these differences aren’t as big as they might seem. You just need to remember to convert at the right time. (And remember that an indexed text can never turn back into a normal text.) Using them wrong can hit your performance hard, though.
But back to your actual problem!
Topics, being parsing routines, cannot be printed out. (After all, what should <"[something]'s ghost/spirit" or “the/-- figure”> look like?) One option, as Matt said, is to add a new column to your table holding a text representation. Another option is to use a new kind of value (or “enum”, if we want to continue using jargon).
A friend is a kind of value. The friends are word1, word2, word3, and word4.
Instead of asking someone about "[friend]":
say "'Ah, you mean [the friend understood]?'".
Instead of asking someone about a topic:
say "'I know nothing about that.'"
Kinds-of-value can be both parsed and printed out, though unlike topics they can’t contain alternative phrasings or more complicated parsing options.