я после двух прологов:Как заставить Туролог признать недопустимые факты?
ontology.pl:
isSite(Url) :- string(Url).
guestPostPublished(GuestPostId, Date, Site, Url) :-
string(GuestPostId),
date(Date),
isSite(Site),
string(Url),
\+(guestPostPublished(GuestPostId, _, _, _)).
invalidFile.pl:
isSite('somesite.com').
guestPostPublished(
'gp1',
date(2016,2,2),
'somesite.com',
'someUrl').
guestPostPublished(
'gp1',
date(2016,2,2),
'somesite.com',
'anotherUrl').
invalidFile.pl
является недействительным, поскольку он нарушает правила, указанные в ontology.pl
что все GuestPostId
s должны быть уникальными.
Когда я загружаю эти данные в свой движок, я исключаю исключение, указывающее, что данные недействительны. Но это не так.
Что я делаю неправильно? Как я могу убедиться, что когда я подаю неверные данные в TuProlog, я получаю уведомление о некотором роде (например, исключение или какой-то флаг)?
Вот соответствующий фрагмент моего кода (вы можете найти весь код here):
@Test
public void test2() throws InvalidObjectIdException, IOException,
MalformedGoalException, InvalidTheoryException, UnknownVarException, NoSolutionException,
NoMoreSolutionException, InvalidLibraryException {
final Prolog engine = createEngine();
try
{
loadPrologFiles(engine, new String[]{
"src/main/resources/ontology.pl",
"src/main/resources/invalidFile.pl"
});
Assert.fail("Engine swallows invalid Prolog file.");
}
catch (final Exception exception) {
// TODO: Check that the right exception is thrown
}
final List<String> result = getResults(engine, "guestPostPublished(_,X,_,_).", "X");
System.out.println("result: " + result);
}
private Prolog createEngine() throws InvalidObjectIdException {
final Prolog engine = new Prolog();
engine.addOutputListener(new OutputListener() {
public void onOutput(OutputEvent outputEvent) {
System.out.println(String.format("PROLOG: %s", outputEvent.getMsg()));
}
});
Library lib = engine.getLibrary("alice.tuprolog.lib.OOLibrary");
((OOLibrary)lib).register(new Struct("stdout"), System.out);
return engine;
}
private void loadPrologFiles(final Prolog engine, final String[] files) throws IOException, InvalidTheoryException {
final List<String> paths = Arrays.asList(files);
final StringBuilder theoryBuilder = new StringBuilder();
for (final String path : paths) {
theoryBuilder.append(System.lineSeparator());
theoryBuilder.append("% ");
theoryBuilder.append(path);
theoryBuilder.append(" (START)");
theoryBuilder.append(System.lineSeparator());
theoryBuilder.append(FileUtils.readFileToString(new File(path)));
theoryBuilder.append(System.lineSeparator());
theoryBuilder.append("% ");
theoryBuilder.append(path);
theoryBuilder.append(" (END)");
theoryBuilder.append(System.lineSeparator());
}
final Theory test1 = new Theory(theoryBuilder.toString());
engine.setTheory(test1);
}
private List<String> getResults(final Prolog engine, final String query, final String varName) throws
MalformedGoalException, NoSolutionException, UnknownVarException, NoMoreSolutionException {
SolveInfo res2 = engine.solve(query);
final List<String> result = new LinkedList<String>();
if (res2.isSuccess()) {
result.add(res2.getTerm(varName).toString());
while (engine.hasOpenAlternatives()) {
res2 = engine.solveNext();
final Term x2 = res2.getTerm("X");
result.add(x2.toString());
}
}
return result;
}
Обычные прологи не имеют встроенного механизма для ограничений целостности данных так же, как это делает реляционная база данных. Если TuProlog не предлагает это как библиотеку, вы не можете просто объявить первичный ключ. Вы можете реализовать его самостоятельно очень легко, но: есть динамика базы данных? Будет ли это изменяться в течение всей жизни программы? Вам нужно вставить новые строки в эту таблицу? –
@Boris Файлы Prolog не будут меняться во время выполнения. Я хочу, чтобы программа выполняла следующие действия: Прочитайте набор файлов Prolog и сообщите мне, соответствуют ли они правилам, указанным в 'ontology.pl'. Затем программа завершается. –
Кажется, что вы думаете, что делаете с двумя файлами 'ontology.pl' и' invalidFile.pl': один объявляет ограничения целостности данных, а другой содержит все таблицы. Это не так, как это работает. –