3

Java プログラムで SWI-Prolog クエリを実行するために JPL を使用しています。新しいクエリを作成したい場合、jpl.Util.textToTerm自分で解析せずに、ユーザー入力から直接用語をインスタンス化できるようにしたいと考えています。

問題は、このメソッドが常に変数識別子 (大文字で始まるもの) を無名変数 (つまり で始まるもの) として解析するように見えることです_

たとえば、ではなく名前を持つjpl.Util.textToTerm("X")a が返されます。これは明らかに問題です。これは、クエリ後にバインディングにアクセスできないことを意味するためです。jpl.Variable_1X

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 に答える