【发布时间】:2012-02-09 16:56:39
【问题描述】:
我正在使用自定义逻辑库在 Android 中运行嵌入式库 [tuProlog (2p.jar)] Prolog 推理引擎,我可以在 Android ListView 中成功查询和显示(部分)结果。
显示的只是推理引擎本身的结果,而不是像 Prolog 'write' 语句(默认情况下)写入 STDOUT 的辅助命令。
我需要在 Android 变量中捕获“写入”打印到 STDOUT 的结果,以显示给用户。总的想法(我没有与 ListView 结婚来实现)是模拟命令行交互,如果他们运行基于 Java 的 Prolog Interpreter 终端界面,则会进行该交互。
为了完成这个项目,我想坚持知识工程领域而不是进入系统工程领域,所以我将不胜感激任何对此问题的见解。
我的研究使我here 成为进一步研究的途径,但系统方面的东西很快就超出了我的经验。
提前非常感谢....
【问题讨论】:
-
很好的问题,也是我遇到并解决的问题....简而言之,tuProlog 小巧、快速(如果设置正确)且高效。它的设计正是如此。我的应用程序加载引擎,以及 2 个独立且大小合适的知识库以及它所在的 Android 应用程序,内存为 0.89MB。考虑到这一点的一个因素是,我实现了一个线程的大内存猪来保存 2 个逻辑基......大多数应用程序可能不需要......在设置 Prolog 引擎和生成的线程以确保其正常工作...如果您需要,我会与您分享它们。
-
还有一件事......我使用了 2p.jar 库,其中包括所有东西和厨房水槽,包括 Android 平台远程不需要的东西。正确的库是 tuprolog.jar 包含核心 API、代理应用程序和默认库,我怀疑这使它更小。
-
它们在这里... (1) 将其放在您的 Activity 的类定义下方,以便在应用程序屏幕之前对其进行实例化 .... // 实例化 Prolog 引擎的实例。 // 只做一次,因为它非常昂贵。序言引擎 = 新序言(); (2) 这就是我使用外部文件加载逻辑库的方式... LoadLogicBase family_LoadLogicBase = new LoadLogicBase(theory_family, "add");您必须使用线程,并且 100000 参数是关键: Thread thread_B = new Thread(new ThreadGroup("B"), family_LoadLogicBase, "Load LogicBase" ,100000); thread_B.start();
-
不是真的...... 2p.jar 句柄可以很好地容忍这一点。最大的问题是 prolog 'write' 语句的控制台输出...... Android 将所有 STDOUT 重新路由到 /dev/null 所以根本没有。我现在正在研究一种解决方法,但我还没有完全做到。 :-(
-
经过数小时的研究和向 tuProlog 开发团队提出的问题,我确实有一个解决方案,可以让写入在 Android 系统中工作,他们将所有 STDOUT 路由到 /dev/null。但是它太大而无法包含在评论中,所以我将尝试回答我自己的问题并在其中制定如何做到这一点。简而言之,tuProlog 的基础架构考虑到了这个问题,并以侦听器/事件对的形式对其进行了一些非常优雅的调整,该对使用 STDOUT 但逃脱了 Android 锁定。在 Android 中可以捕获 N 次使用 STDOUT,稍后会详细介绍。
标签: android terminal command stdout tuprolog