在运行Android序言(Running prolog in Android)

2019-09-16 13:31发布

我在Android的测试tuProlog。 我有一个活动TuProlog,类分析器与Prolog的互动和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();
}
}

Data.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)

Answer 1:

我之前已经做到了,并已发布在审讯源代码(的概念只有非常,非常测试证明),请参见下文。

下载Eclipse(太阳神)项目的源代码,后藤:versaggi.biz,下载Adrea,TuProlog开发项目时,Eclipse(太阳神)Java源代码项目,终于到TuProlog Android的Eclipse中,项目源。 这应该让你开始。 请记住,这是仅有的概念证明代码,并且将发布最终版本之前被彻底改写。 鉴于此,它的工作不够好,你得到一些见解如何我做了什么,我所做的。 如果你想要的任何帮助都只是直接与我联系,我会很乐意一起帮你。 :-)



Answer 2:

我得到FileNotFoundException异常,即使我的文件data.pl在项目的根目录复制

但看看错误:

java.io.FileNotFoundException:/data.pl(没有这样的文件或目录)

它试图从文件系统的根目录读取data.pl!

你可以尝试使用FileInputStream(File)构造函数用于在路径的更多控制。 看一看例如该如何让应用程序的目录问题。



Answer 3:

  1. 在Eclipse中,创建项目中的res文件夹的文件夹“plFiles”
  2. 将您的PL文件到这个文件夹(如:RES / plFiles / data.pl)
  3. 使用活动访问使用此文件(一个是当前的活动)

     InputStream in = a.getResources().openRawResource(R.plFiles.data); 
  4. 上面的行返回一个InputStream。 现在,您可以使用扫描仪或BufferedReader中或任何阅读器类你喜欢的继续解析或读取文件。

访问文件的另一种方式就是这里所说的...... 在Android的访问资源文件



文章来源: Running prolog in Android