Запуск пролога в Android

Я тестирую tuProlog в Android. У меня есть Activity TuProlog, класс Parser для взаимодействия с кодом пролога и data.pl, который содержит код пролога. Я могу нормально запустить его как java-проект с выводом на консоль, но у меня возникают проблемы с этим как с проектом Android. Для Android я получаю FileNotFoundException, хотя мой файл data.pl копируется в корень проекта, внутри src и внутри моего пакета. Я просто хочу получить результат в виде строки и отобразить результат в TextView. Вот мои коды

public class TuProlog extends Activity implements OnClickListener{

TextView tv;
Button b1;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    tv = (TextView)findViewById(R.id.label);
    b1 = (Button)findViewById(R.id.button1);
    b1.setOnClickListener(this);
}

@Override
public void onClick(View v) {
    Parser custom = new Parser();
    String result = custom.parse();
    tv.setText(result);
}   
}


public class Parser {

Prolog engine;
PrintStream orgStream   = System.out;

ByteArrayOutputStream baos = new ByteArrayOutputStream();
PrintStream psout = new PrintStream(baos, Boolean.TRUE); // Using autoFlush
String myResult ;

public String parse()
{
    engine  = new Prolog();
    try{
        Theory t = new Theory(new FileInputStream("data.pl"));
        try{
            engine.setTheory(t);
            try{
                SolveInfo answer = engine.solve("likes(john,X).");
                try{
                    Term derivative = answer.getTerm("X");
                    return myResult;;
                }
                catch (NoSolutionException e){
                    e.printStackTrace();
                }
                catch (UnknownVarException e){
                    e.printStackTrace();
                }
            }
            catch (MalformedGoalException e){
                e.printStackTrace();
            }
        }
        catch (InvalidTheoryException e){
            e.printStackTrace();
        }
    } 
    catch (FileNotFoundException e){
        e.printStackTrace();
    }
    catch (IOException e){
        e.printStackTrace();
    }
    return null;
}
    @Override
public void onSpy(SpyEvent e) {
    // TODO Auto-generated method stub
    Log.d("TAG", "** LG'd onSpy => SpyEvent Occured ** " );
    System.out.println("** onSpy => SpyEvent Occured ** \n ");
    myResult =  e.getMsg();
}


@Override
public void onOutput(OutputEvent e) {
    // TODO Auto-generated method stub
     Log.d("TAG", "** LG'd: onOutput => OutputEvent Occured ** " );
        System.out.println("** onOutput => OutputEvent Occured ** \n ");
        myResult =  e.getMsg();

}


@Override
public void onWarning(WarningEvent e) {
    // TODO Auto-generated method stub
    Log.d("TAG", "** LG'd: onWarning => WarningEvent Occured ** " );
    System.out.println("** onWarning => WarningEvent Occured ** \n ");
    myResult = e.getMsg();
}
}

Данные.pl

likes(john,mary).
likes(mary,wine).

Вот мой вывод logcat, я не знаю о System.err

04-15 18:51:25.480: W/System.err(23813): java.io.FileNotFoundException: /data.pl (No such file or directory)
04-15 18:51:25.484: W/System.err(23813): at org.apache.harmony.luni.platform.OSFileSystem.open(Native Method)
04-15 18:51:25.484: W/System.err(23813): at dalvik.system.BlockGuard$WrappedFileSystem.open(BlockGuard.java:232)
04-15 18:51:25.484: W/System.err(23813): at java.io.FileInputStream.<init>(FileInputStream.java:80)
04-15 18:51:25.484: W/System.err(23813): at java.io.FileInputStream.<init>(FileInputStream.java:132)
04-15 18:51:25.484: W/System.err(23813): at com.tuprolog.alicia.Parser.parse(Parser.java:32)
04-15 18:51:25.484: W/System.err(23813): at com.tuprolog.alicia.TuProlog.onClick(TuProlog.java:51)
04-15 18:51:25.484: W/System.err(23813): at android.view.View.performClick(View.java:2485)
04-15 18:51:25.484: W/System.err(23813): at android.view.View$PerformClick.run(View.java:9080)
04-15 18:51:25.484: W/System.err(23813): at android.os.Handler.handleCallback(Handler.java:587)

person Yogesh    schedule 15.04.2012    source источник


Ответы (3)


Я делал это раньше и выложил исходный код (очень, очень бета-доказательство концепции) для допроса, пожалуйста, смотрите ниже.

Чтобы загрузить исходный код проекта Eclipse (Helios), перейдите по ссылке: versaggi.biz, Downloads Adrea, TuProlog Dev Project, Eclipse (Helios) Java Source Project и, наконец, TuProlog Android Eclipse Porject Source. Это должно заставить вас начать. Пожалуйста, имейте в виду, что это ТОЛЬКО код проверки концепции, и он будет полностью переписан перед выпуском окончательной версии. Учитывая это, он работает достаточно хорошо, чтобы вы могли получить некоторое представление о том, как я делал то, что делал. Если вам нужна какая-либо помощь, просто свяжитесь со мной напрямую, и я буду рад помочь вам. :-)

person ProfVersaggi    schedule 24.04.2012

Я получаю FileNotFoundException, хотя мой файл data.pl копируется в корень проекта

Но посмотрите на ошибку:

java.io.FileNotFoundException: /data.pl (Нет такого файла или каталога)

Он пытается прочитать data.pl из корня файловой системы!

Вы можете попробовать использовать конструктор FileInputStream(File) для большего контроля над путем. Взгляните, например, на этот вопрос о том, как получить каталог приложения.

person Joonas Pulakka    schedule 16.04.2012

  1. В eclipse создайте папку «plFiles» в папке res вашего проекта.
  2. Переместите файлы pl в эту папку (например, res/plFiles/data.pl)
  3. Используйте действие для доступа к этому файлу с помощью (a - текущее действие)

    InputStream in = a.getResources().openRawResource(R.plFiles.data);
    
  4. Приведенная выше строка возвращает InputStream. Теперь вы можете использовать Scanner или BufferedReader или любой другой класс чтения, который вам нравится, чтобы продолжить синтаксический анализ или чтение файла.

Здесь упоминается еще один способ доступа к файлам... Доступ к файлам ресурсов в Android

person Savio    schedule 11.06.2012