【问题标题】:Running prolog in Android在 Android 中运行 prolog
【发布时间】:2012-04-27 08:36:52
【问题描述】:

我正在 Android 中测试 tuProlog。我有一个活动 TuProlog,类 Parser 与序言代码和 data.pl 交互,其中包含序言代码。我可以将它作为一个输出到控制台的 java 项目很好地运行,但作为一个 Android 项目我遇到了麻烦。对于 Android,即使我的文件 data.pl 被复制到项目的根目录、src 和我的包中,我也会得到 FileNotFoundException。我只想将结果作为字符串获取并在 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)

【问题讨论】:

    标签: android prolog tuprolog


    【解决方案1】:

    即使我的文件 data.pl 被复制到项目的根目录中,我也会收到 FileNotFoundException

    但是看看错误:

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

    它正在尝试从文件系统的根目录读取data.pl

    您可以尝试使用FileInputStream(File) 构造函数来更好地控制路径。看看例如this question on how to get application's directory。

    【讨论】:

      【解决方案2】:

      我之前已经做过,并且已经发布了(非常非常beta的概念证明)源代码用于审讯,请参见下文。

      要下载 Eclipse (Helios) 项目源代码,请转到:versaggi.biz,下载 Adrea、TuProlog Dev Project、Eclipse (Helios) Java 源项目,最后到 TuProlog Android Eclipse 项目源。这应该让你开始。请记住,这只是概念验证代码,将在最终版本发布之前完全重写。鉴于此,它确实运作良好,足以让您深入了解我是如何做到的。如果您需要任何帮助,请直接与我联系,我很乐意为您提供帮助。 :-)

      【讨论】:

        【解决方案3】:
        1. 在eclipse中,在你项目的res文件夹中创建一个文件夹“plFiles”
        2. 将您的 pl 文件移动到此文件夹(例如:res/plFiles/data.pl)
        3. 使用活动来访问这个文件使用(a是当前活动)

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

        这里提到了另一种访问文件的方式...Access resource files in Android

        【讨论】:

          猜你喜欢
          • 2010-12-31
          • 2022-06-16
          • 1970-01-01
          • 2023-03-20
          • 2016-09-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多