我正在使用DCG为SPARQL(语义Web查询语言)编写解析器。我想用Prolog变量替换SPARQL变量名。我该怎么做呢?
我可以使用length([NewVar], 1)
生成新变量,但我无法通过简单地使用名称变量对列表来跟踪现有分配。列表上的member/2
操作将返回一个新变量,而不是列表中存储的变量。
是否有一种简单的方法可以在Prolog中命名变量,例如'$VAR(Name)'
?
答案 0 :(得分:2)
会员/ 2会做你想要的。这是一个例子:
Welcome to SWI-Prolog (Multi-threaded, 64 bits, Version 7.3.25)
Copyright (c) 1990-2016 University of Amsterdam, VU Amsterdam
L=[a-X,b-Y,c-Z], member(b-V,L).
L = [a-X, b-V, c-Z],
Y = V
但如果将write / 1与member / 2交错,则可能会出现问题, 因为变量可能会改变其身份,即在以下情况下写入符号:
与(@<)/ 2相同的问题。一种方法是使用属性变量,这至少会结束别名,因为属性变量通常是最后统一的,
所以在上面的例子中,如果Y是一个属性变量,而V是一个普通变量,你将永远不会看到V的memloc 呼叫成员/ 2。
此外,您还可以通过使用ISO核心标准mentioned写入选项来缓解此问题,以写出可变的术语。 variable_names / 1 write选项不受垃圾收集或别名的影响。
再见