【问题标题】:How to consistently replace atoms with variables in Prolog?如何在 Prolog 中始终用变量替换原子?
【发布时间】:2015-04-22 19:33:04
【问题描述】:

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

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

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

【问题讨论】:

  • member/2 产生存储在列表中的那个(否则我们很难称它为“成员”)。示例:?- Vs = [a-_,b-_], memberchk(a-V1, Vs), memberchk(a-V2, Vs), V1 == V2.,按预期成功。请注意,我只是使用_ 即时创建一个新变量。当然,您必须通过所有需要访问它的谓词将名称变量对列表串起来。考虑通过 DCG 隐式将其贯穿,以获得更好的可读性。此外,请考虑使用 library(assoc) 中的平衡树来存储 SPARQL 名称(=原子)和 Prolog 变量之间的对应关系。
  • 要回答您的最后一个问题,请参阅variable_names/1'$VAR'/1 是 1970 年代。

标签: variables prolog naming


【解决方案1】:

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

(@

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

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

再见

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-29
相关资源
最近更新 更多