如何始终如一地与Prolog的变量替换原子?

问题描述 投票:7回答:1

我写使用DCG为SPARQL解析器(语义Web查询语言)。我想,以取代Prolog的变量SPARQL变量名。我将如何去吗?

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

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

variables prolog naming
1个回答
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 

但是,如果你写交织/ 1件/ 2,因为变量可能会改变其身份,即在下列情况下写的符号你可能会得到问题:

  • 因为垃圾收集的,如果一个变量被写成_G <memloc>
  • 因为混叠的,在上述实施例V的memloc可能显示 而不是Y的memloc

同样的问题(@ <)/ 2。一条出路是使用属性变量,其中至少杜绝了混淆,因为属性变量通常最后的统一,

因此,在上面的例子中,如果Y是一个属性可变,并且V是你再也看不到V的memloc主叫构件/ 2之后一个普通的变量。

此外,你还可以通过使用ISO标准的核心写variable_names/1选项,谱写出一段variablified长期缓解的问题。该variable_names / 1写入选项不受垃圾收集或走样。

再见

© www.soinside.com 2019 - 2024. All rights reserved.