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

Wou*_*eek 7 variables naming prolog

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

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

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

小智 2

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 
Run Code Online (Sandbox Code Playgroud)

但是,如果将 write/1 与 member/2 交错,则可能会遇到问题,因为变量可能会更改其标识,即在以下情况下更改写入符号:

  • 因为垃圾回收,如果一个变量被写成 _G<memloc>
  • 由于别名,在上面的示例中可能会显示 V 的 memloc,
    而不是 Y 的 memloc

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

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

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

再见