3

我正在使用 JPL 在 Java 程序中执行一些 SWI-Prolog 查询。当我想创建一个新的查询时,我希望能够jpl.Util.textToTerm直接从用户输入中实例化术语,而无需自己解析它。

问题是这种方法似乎总是将变量标识符(即以大写字母开头的东西)解析为匿名变量(即以 开头的东西_)。

例如,jpl.Util.textToTerm("X")返回一个jpl.Variable具有 name_1而不是 的X,这显然是一个问题,因为这意味着我将无法在查询后访问任何绑定。

jpl.Query直接从字符串创建一个,就像new Query("reverse([1,2],X)")有完全相同的问题。

4

1 回答 1

3

_1不是一个匿名变量,所以问题并不像乍一看那么重要。

从 JPL 接口返回后,具有相同名称的变量(实际上是相同的变量)将具有相同的表示形式。否则,您应该提交邮件列表的错误...

您应该使用read_term作为选项传递的谓词系列variable_names(Vars)。例如,在 REPL

?- read_term_from_atom('a(X,Y,X)',T,[variable_names(L)]).
T = a(_G1434, _G1435, _G1434),
L = ['X'=_G1434, 'Y'=_G1435].

编辑重用 JPL 测试基础设施的快速测试(我已将文件命名为 TestQuery.java)

import java.util.Map;

import org.jpl7.Query;
import org.jpl7.Term;

public class TestQuery {
    public static void main(String argv[]) {
        Query q = new Query("X = 1");
        Map<String, Term>[] solutions = q.allSolutions();
        System.out.println(solutions[0]);
    }
}

输出

./run.sh
Compiling TestQuery

JPL demo: TestQuery

{X=1}

所以,也许我一开始就不明白你的问题,对不起......你使用的是最新的安装吗?

于 2015-09-03T19:05:10.500 回答