2013-06-03 2 views
1

Так что есть пролог ...Tuprolog и определений инфиксных операторов

cobrakai$more operator.pl 
be(a,c). 
:-op(35,xfx,be). 



+=(a,c). 
:-op(35,xfx,+=). 
cobrakai$ 

который определяет некоторые операторы инфиксных. Я запустить его с помощью SWI пролога и получить следующее (отлично прогнозным) результаты

?- halt. 
cobrakai$swipl -s operator.pl 
% library(swi_hooks) compiled into pce_swi_hooks 0.00 sec, 3,992 bytes 
% /Users/josephreddington/Documents/workspace/com.plancomps.prolog.helloworld/operator.pl compiled 0.00 sec, 992 bytes 
Welcome to SWI-Prolog (Multi-threaded, 64 bits, Version 5.10.5) 
Copyright (c) 1990-2011 University of Amsterdam, VU Amsterdam 
SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software, 
and you are welcome to redistribute it under certain conditions. 
Please visit http://www.swi-prolog.org for details. 

For help, use ?- help(Topic). or ?- apropos(Word). 

?- be(a,c). 
true. 

?- a be c. 
true. 

?- +=(a,c). 
ERROR: toplevel: Undefined procedure: (+=)/2 (DWIM could not correct goal) 
?- halt. 
cobrakai$swipl -s operator.pl 
% library(swi_hooks) compiled into pce_swi_hooks 0.00 sec, 3,992 bytes 
% /Users/josephreddington/Documents/workspace/com.plancomps.prolog.helloworld/operator.pl compiled 0.00 sec, 1,280 bytes 
Welcome to SWI-Prolog (Multi-threaded, 64 bits, Version 5.10.5) 
Copyright (c) 1990-2011 University of Amsterdam, VU Amsterdam 
SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software, 
and you are welcome to redistribute it under certain conditions. 
Please visit http://www.swi-prolog.org for details. 

For help, use ?- help(Topic). or ?- apropos(Word). 

?- be(a,c). 
true. 

?- a be c. 
true. 

?- +=(a,c). 
true. 

?- a += c. 
true. 

?- halt. 

Однако, когда я использую Tuprolog обрабатывать один и тот же файл из Java (используя следующий код)

import java.io.BufferedReader; 
import java.io.FileReader; 
import java.io.IOException; 
import alice.tuprolog.Prolog; 
import alice.tuprolog.SolveInfo; 
import alice.tuprolog.Theory; 

public class Testinfixoperatorconstruction { 
    public static void main(String[] args) throws Exception { 
     Prolog engine = new Prolog(); 
     engine.loadLibrary("alice.tuprolog.lib.DCGLibrary"); 
     engine.addTheory(new Theory(readFile("/Users/josephreddington/Documents/workspace/com.plancomps.prolog.helloworld/operator.pl"))); 
     SolveInfo info = engine.solve("be(a,c)."); 
     System.out.println(info.getSolution()); 
     info = engine.solve("a be c."); 
     System.out.println(info.getSolution()); 
    } 

    private static String readFile(String file) throws IOException { 
     BufferedReader reader = new BufferedReader(new FileReader(file)); 
     String line = null; 
     StringBuilder stringBuilder = new StringBuilder(); 
     String ls = System.getProperty("line.separator"); 
     while ((line = reader.readLine()) != null) { 
      stringBuilder.append(line); 
      stringBuilder.append(ls); 
     } 
     return stringBuilder.toString(); 
    } 
} 

пролог файл не анализируется - сбой на токене «+ =».

Exception in thread "main" alice.tuprolog.InvalidTheoryException: Unexpected token '+=' 
    at alice.tuprolog.TheoryManager.consult(TheoryManager.java:193) 
    at alice.tuprolog.Prolog.addTheory(Prolog.java:242) 
    at Testinfixoperatorconstruction.main(Testinfixoperatorconstruction.java:14) 

Мы можем попробовать несколько иной подход, при добавлении оператора непосредственно в коде Java с ...

государственной статической силы основных (String [] арг) бросает исключение { Пролог двигатель = новый Prolog(); engine.loadLibrary ("alice.tuprolog.lib.DCGLibrary");

engine.getOperatorManager().opNew("be", "xfx", 35); 
engine.getOperatorManager().opNew("+=", "xfx", 35); 
engine.addTheory(new Theory(
     readFile("/Users/josephreddington/Documents/workspace/com.plancomps.prolog.helloworld/operator2.pl"))); 
SolveInfo info = engine.solve("be(a,c)."); 
System.out.println(info.getSolution()); 
info = engine.solve("a be c."); 
System.out.println(info.getSolution()); 

}

но мы получаем ту же ошибку ... :(

Может кто-нибудь сказать мне, почему это происходит? (И решения также будет приветствоваться).

+0

Возможно, Tuprolog не поддерживает это, обратите внимание, что он имеет [класс управления оператором] (http://grepcode.com/file/repo1.maven.org/ Maven2/it.unibo.alice.tuprolog/tuprolog/2.1.1/алиса/tuprolog/OperatorManager.java # OperatorManager). Эта ошибка была лексической (токенизатор) ошибкой, поэтому она явно не ожидала нового токена и не зарегистрировала его с помощью lexer. – Orbling

ответ

0

SWI -Пролог может быть слишком разрешенным во время разбора директив. Попробуйте заключить операторы между круглыми скобками:

:-op(35,xfx,(+=)). 

Редактировать Я пробовал использовать 2p.jar, что позволило мне обнаружить проблему. Необходимо указать оператор 'atom:

:-op(35,xfx, '+='). 

X += Y. 
p :- a += b. 

интерактивная консоль 2p принимает этот синтаксис. Обратите внимание, что 2p.jar по умолчанию load tuprolog библиотеки

+0

Это хорошая идея, и спасибо за ответ, но я боюсь, что это не помогло :( – Joe

+0

SWI не «слишком разрешительный» здесь. Ни кавычки, ни скобки не нужны. ': - op (35, xfx, + =). 'является синтаксисом ISO Prolog. – false