【发布时间】:2015-04-22 19:33:04
【问题描述】:
我正在使用 DCG 为 SPARQL(语义 Web 查询语言)编写解析器。我想用 Prolog 变量替换 SPARQL 变量名。我该怎么办?
我可以使用length([NewVar], 1) 生成新变量,但我无法通过简单地使用名称-变量对列表来跟踪现有分配。列表上的member/2 操作将返回一个新变量,而不是列表中存储的变量。
在 Prolog 中有没有一种简单的方法来命名变量,例如,'$VAR(Name)'?
【问题讨论】:
-
member/2将产生存储在列表中的那个(否则我们很难称它为“成员”)。示例:?- Vs = [a-_,b-_], memberchk(a-V1, Vs), memberchk(a-V2, Vs), V1 == V2.,按预期成功。请注意,我只是使用_即时创建一个新变量。当然,您必须通过所有需要访问它的谓词将名称变量对列表串起来。考虑通过 DCG 隐式将其贯穿,以获得更好的可读性。此外,请考虑使用library(assoc)中的平衡树来存储 SPARQL 名称(=原子)和 Prolog 变量之间的对应关系。 -
要回答您的最后一个问题,请参阅
variable_names/1。'$VAR'/1是 1970 年代。