如何在 Prolog 中始终用变量替换原子?

How to consistently replace atoms with variables in Prolog?

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

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

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

member/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
  • 由于别名,在上面的示例中可能会显示 V 的 memloc
    而不是 Y
  • 的 memloc

(@<)/2 也有同样的问题。一种出路是使用属性变量,这至少可以杜绝别名,因为属性变量通常最后统一,

所以在上面的例子中,如果 Y 是一个属性变量而 V 是一个普通变量,你将永远不会看到 V 的 memloc 调用 member/2.

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

再见