ResearchCyc中有一个名为random-assertion的lisp函数。我想从一些Java代码中调用它。我使用的是Cyc Core API Suite v1.0.0-rc5(来自http://dev.cyc.com),但我没有看到任何调用底层Lisp代码的方法。
在旧的OpenCyc API中,有一个名为CycAccess的对象可供您使用,但我无法弄清楚如何获取。如果我能找到它,我就称之为
access.converseObject("(随机断言)&#34);
至少在ResearchCyc中,这将从Cyc知识库中检索伪随机断言。不确定它是否适用于OpenCyc,但也可能在那里工作。
有人可以解释如何通过Cyc的java API调用这样的lisp代码吗?
答案 0 :(得分:0)
(免责声明:我是Cyc API的开发人员之一......)
Core API Suite的参考实现是Core Client,它基于Base Client ...而后者又来自旧的OpenCyc API。因此,绝对有可能以几种不同的方式在ResearchCyc上调用任意的lisp(SubL)代码......
首先,已经存在一个包含随机断言的方法:
$('li').on('tap',function(){
// Only make the elements selectable when parent is not scrolling
if(checklist_scroll%2===0){
// Select the li
}
});
对于一般情况,您会发现语法与OpenCyc API非常相似:
try {
CycAccess access = CycAccessManager.getCurrentAccess();
CycAssertion cycAssertion = access.getLookupTool().getRandomAssertion();
} catch (SessionException ex) {
// Do something with the exception...
} catch (CycConnectionException connEx) {
// Do something else...
}
或者,如果可以安全地假设结果是CycObject:
try {
CycAccess access = CycAccessManager.getCurrentAccess();
Object cycAssertion = access.converse().converseObject("(random-assertion)");
} catch (SessionException ex) {
// Do something with the exception...
} catch (CycConnectionException connEx) {
// Do something else...
}
但是,Base Client通过com.cyc.baseclient.subl.SublFunction接口添加了一种封装SubL函数的新方法。 SublFunction接口本身非常简单,但com.cyc.baseclient.subl.subtypes下有许多类,它们为您提供扩展实现。例如,如果您正在调用no-arg函数并期望返回一个CycObject,则可以像这样扩展SublCycObjectNoArgFunction:
...
CycAccess access = CycAccessManager.getCurrentAccess();
CycObject cycAssertion = access.converse().converseCycObject("(random-assertion)");
...
(有关其他示例,请参阅Base Client中的com.cyc.baseclient.subl.functions。*。)
这种方法使得将SubL函数定义为静态字段而不编写(或重写)大量代码变得相当简单。我们希望核心客户端逐渐转向这种方法。
最后,您可以使用KB Client中的实现类将结果转换为KBObject。例如:
public static final SublCycObjectNoArgFunction RANDOM_ASSERTION_FUNCTION =
new SublCycObjectNoArgFunction("random-assertion");
...
try {
CycAccess access = CycAccessManager.getCurrentAccess();
CycObject cycAssertion = RANDOM_ASSERTION_FUNCTION.eval(access);
} catch (SessionException ex) {
// Do something with the exception...
} catch (CycConnectionException connEx) {
// Do something else...
}