Java JPL textToTerm只生成匿名变量
我正在使用JPL在Java程序中执行一些SWI Prolog查询。当我想要创建一个新的查询时,我希望能够使用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.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类位于packageorg.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}