【发布时间】:2019-06-18 18:12:38
【问题描述】:
我正在尝试编写一个 SWI-Prolog 谓词,它将 numbervars/3 应用于术语的匿名变量,但保留用户提供的非匿名变量的名称。我最终计划为term_expansion(或类似的东西)添加某种钩子。
所需输出示例:
?- TestList=[X,Y,Z,_,_].
> TestList=[X,Y,Z,A,B].
This answer 到问题Converting Terms to Atoms preserving variable names in YAP prolog 展示了如何使用read_term 将术语中使用的变量的名称作为原子获得。这个列表(形式为 [X='X',Y='Y',...])不包含匿名变量,与term_variables 获得的变量列表不同,这使得匿名变量的隔离相当简单。
但是,如果仅将其应用于直接从终端读取的术语,则此功能的有用性会受到一定限制。我注意到答案中的所有示例都涉及该术语的直接用户输入。 是否有可能获取(作为原子)通过用户直接输入非获得的术语的变量名称?也就是说,是否有某种方法可以“编写”一个术语(保留变量名)到一些不可见的流,然后像从终端输入一样“读取”它?
另外...也许这更像是一种 LaTeX 式的思路,但是在 Prolog 扩展/尝试将它们统一为变量之前,是否有某种方法可以将变量“包装”在单引号内(从而将它们原子化) , 最终结果是它们被视为以大写字母开头的原子而不是变量?
【问题讨论】:
-
write_term不够好? -
如果您想从终端以外的地方读取术语,您可以使用
read_term/3在第一个位置提供流。您能否详细说明为什么您需要此功能?如果我们对您正在尝试做的事情有更多了解,那么您可能要从另一个角度更直接地解决您要解决的真正问题。 -
糟糕,我链接到了错误的问题和答案。我刚刚纠正了它。很抱歉,如果这造成任何混乱
标签: variables io stream prolog iso-prolog