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

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

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

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

最佳答案

_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}

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

关于java - JPL textToTerm仅产生匿名变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32381298/

10-10 12:30