JPL textToTerm создает только анонимные переменные

Я использую JPL для выполнения некоторых запросов SWI-Prolog в программе Java. Когда я хочу создать новый запрос, я хотел бы иметь возможность использовать jpl.Util.textToTerm для прямого создания экземпляров терминов из пользовательского ввода, не анализируя его самостоятельно.

Проблема в том, что этот метод, кажется, всегда анализирует идентификаторы переменных (т. е. то, что начинается с заглавной буквы) как анонимные переменные (т. е. то, что начинается с _).

Например, jpl.Util.textToTerm("X") возвращает jpl.Variable с именем _1 вместо X, что, очевидно, является проблемой, поскольку это означает, что я не смогу получить доступ к каким-либо привязкам после запроса.

Создание jpl.Query непосредственно из строки, например new Query("reverse([1,2],X)"), имеет ту же проблему.


person Fatalize    schedule 03.09.2015    source источник


Ответы (1)


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

так что, может быть, я не понимаю вашей проблемы в первую очередь, извините... Вы используете последнюю версию установки?

person CapelliC    schedule 03.09.2015
comment
Я не понимаю, как это может помочь. Скажем, я создаю запрос query = new Query("X = 1"). query.nextSolution() вернет пустую Hashtable вместо таблицы, содержащей привязку X = 2. При чем тут read_term_from_atom? - person Fatalize; 03.09.2015
comment
То, что вы описываете, кажется другой проблемой, чем то, что запрашивается в вопросе. Хэш-таблица должна содержать привязку _1 = 1 - person CapelliC; 03.09.2015
comment
Ну, это не так, я указал, что не смогу получить доступ к каким-либо привязкам после запроса в моем вопросе. _1 не является анонимной переменной _, но похожа на переменную don't-want-to-know. Кажется логичным, что я ничего не получаю в hastable, так как это такой тип переменной, я просто не понимаю, почему она переименовывается в это, при создании переменной new Variable("X") работает нормально. - person Fatalize; 03.09.2015
comment
Используя allSolutions, я все еще получаю пустую привязку. Так что я предполагаю, что это происходит из моей банки JPL или связанных библиотек. Я вижу, что ваши классы JPL находятся в пакете org.jpl7, а мои только в jpl. Я получил свой jar и связанные библиотеки из каталогов lib и bin моей установки SWI-Prolog, и я не вижу, где еще я могу их получить, на веб-странице JPL нет ссылки для скачивания. - person Fatalize; 03.09.2015
comment
Это также объясняет, почему, когда я выполнял запросы с использованием JPL для строк версии 7 (с кавычками "), он действовал как старая версия SWI-Prolog, которая считает " кодами символов. - person Fatalize; 03.09.2015
comment
Такие базовые конструкции не должны были изменяться, но поскольку я собираю SWI-Prolog из исходников, я не могу протестировать прямо сейчас. Если вы работаете в Windows, проще скачать и переустановить... - person CapelliC; 03.09.2015
comment
Я его переустановил и jpl.jar вроде бы теперь такой же как у вас (в нем есть пакет org.jpl7), но теперь простой запрос даже не запускается и выдает кучу ошибок типа Message: error(instantiation_error,context(system: $set_predicate_attribute/3,_G74)) - person Fatalize; 03.09.2015
comment
Я установил SWI-Prolog на другой компьютер и сразу же заставил JPL работать, как в вашем примере. Я приму ваш ответ, так как он помог мне точно определить, что не так. - person Fatalize; 04.09.2015