如何在Prolog中用变量一致地替换原子?

时间:2015-04-22 19:33:04

标签: variables prolog naming

我正在使用DCG为SPARQL(语义Web查询语言)编写解析器。我想用Prolog变量替换SPARQL变量名。我该怎么做呢?

我可以使用length([NewVar], 1)生成新变量,但我无法通过简单地使用名称变量对列表来跟踪现有分配。列表上的member/2操作将返回一个新变量,而不是列表中存储的变量。

是否有一种简单的方法可以在Prolog中命名变量,例如'$VAR(Name)'

1 个答案:

答案 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交错,则可能会出现问题, 因为变量可能会改变其身份,即在以下情况下写入符号:

  • 因为垃圾收集,如果变量写为_G< memloc>
  • 由于混叠,在上面的例子中,V的memloc可能会显示为
    而不是Y
  • 的memloc

与(@<)/ 2相同的问题。一种方法是使用属性变量,这至少会结束别名,因为属性变量通常是最后统一的,

所以在上面的例子中,如果Y是一个属性变量,而V是一个普通变量,你将永远不会看到V的memloc 呼叫成员/ 2。

此外,您还可以通过使用ISO核心标准mentioned写入选项来缓解此问题,以写出可变的术语。 variable_names / 1 write选项不受垃圾收集或别名的影响。

再见