Java JPL textToTerm只生成匿名变量

Java JPL textToTerm只生成匿名变量,java,prolog,swi-prolog,jpl,Java,Prolog,Swi Prolog,Jpl,我正在使用JPL在Java程序中执行一些SWI Prolog查询。当我想要创建一个新的查询时,我希望能够使用jpl.Util.textToTerm直接从用户输入中实例化术语,而无需自己对其进行解析 问题在于,此方法似乎总是将变量标识符(即以大写字母开头的内容)解析为匿名变量(即以\uuu开头的内容) 例如,jpl.Util.textToTerm(“X”)返回一个名为\u 1的jpl.Variable,而不是X,这显然是一个问题,因为这意味着我在查询后将无法访问任何绑定 直接从字符串创建jpl.Q

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

问题在于,此方法似乎总是将变量标识符(即以大写字母开头的内容)解析为匿名变量(即以
\uuu
开头的内容)

例如,
jpl.Util.textToTerm(“X”)
返回一个名为
\u 1
jpl.Variable
,而不是
X
,这显然是一个问题,因为这意味着我在查询后将无法访问任何绑定


直接从字符串创建
jpl.Query
,比如
newquery(“reverse([1,2],X)”)
有着完全相同的问题。

\u 1
它不是一个匿名变量,所以这个问题没有乍一看那么重要

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

您应该使用作为选项传递的谓词族
变量名(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)


所以,也许我一开始不理解你的问题,对不起。。。您使用的是最新安装吗

我不明白这有什么用。假设我创建一个查询
Query=newquery(“X=1”)
query.nextSolution()
将返回一个空哈希表,而不是包含绑定X=2的哈希表。从原子中读取术语与此有什么关系?您描述的问题似乎与问题中要求的问题不同。哈希表应该包含绑定
\u 1=1
如果没有,我在问题中指出“查询后我将无法访问任何绑定”
\u 1
不是一个匿名变量,但它就像一个
不想知道的
变量。在hastable中我什么也没有得到似乎是合乎逻辑的,因为它是那种类型的变量,我只是不明白为什么它会被重命名为这种类型,当创建变量时
新变量(“X”)
工作正常。使用
所有解决方案
我仍然得到一个空绑定。所以我猜它来自我的JPLJAR或链接库。我看到您的JPL类位于package
org.jpl7
中,而我的JPL类位于
JPL
中。我从我的SWI Prolog安装的lib和bin目录中得到了我的jar和链接库,我不知道还能从哪里得到它们,JPL网页上没有下载链接。这也解释了为什么我在版本7字符串上使用JPL运行查询(带引号
),它的行为类似于旧的SWI Prolog版本,该版本将
视为字符代码。
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}