ResearchCyc中有一个名为随机断言的lisp函数。我想用一些Java代码来调用它。我正在使用Core v1.0.0-rc5 (来自http://dev.cyc.com),但我看不到任何方法来调用底层Lisp代码。
在旧的OpenCyc API中,有一个名为CycAccess的对象,您可以使用这个对象,但我不知道如何获得一个对象。如果我能找到它,我会称之为
Access.converseObject(“随机-断言”);
至少在ResearchCyc中,这将从Cyc知识库中检索一个伪随机断言。不确定它是否能在OpenCyc中工作,但它也可能在那里工作。
有人能解释如何通过Cyc的java API调用这样的lisp代码吗?
发布于 2016-02-09 18:25:27
(免责声明:我是Cyc API的开发人员之一)
Core套件的参考实现是基于based的Core客户端。这反过来又是从旧的OpenCyc API派生出来的。因此,绝对有可能在ResearchCyc上调用任意的lisp (ResearchCyc)代码,以几种不同的方式.
首先,已经有一个包装随机断言的方法:
try {
CycAccess access = CycAccessManager.getCurrentAccess();
CycAssertion cycAssertion = access.getLookupTool().getRandomAssertion();
} catch (SessionException ex) {
// Do something with the exception...
} catch (CycConnectionException connEx) {
// Do something else...
}不过,就一般情况而言,您会发现语法非常类似于OpenCyc API:
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...
}或者,如果可以安全地假设结果将是CycObject:
...
CycAccess access = CycAccessManager.getCurrentAccess();
CycObject cycAssertion = access.converse().converseCycObject("(random-assertion)");
...但是,Base通过SubL接口添加了一种封装com.cyc.baseclient.subl.SublFunction函数的新方法。SublFunction接口本身是非常小的,但是在com.cyc.baseclient.subl.subtypes下有许多类可以为您提供可扩展的实现。例如,如果您正在调用一个no-arg函数并期望返回一个CycObject,您可以像这样扩展SublCycObjectNoArgFunction:
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...
}(有关这方面的其他示例,请参见Base中的com.cyc.baseclient.subl.function.*。)
这种方法使将SubL函数定义为静态字段变得相当简单,而无需编写(或重写)大量代码。我们期望核心客户端逐步向这种方法迁移。
最后,可以使用KB客户机中的实现类将结果转换为KBObjects。例如:
try {
CycAccess access = CycAccessManager.getCurrentAccess();
CycObject cycAssertion = RANDOM_ASSERTION_FUNCTION.eval(access);
// To convert to a com.cyc.kb.Assertion:
Assertion assertion = AssertionImpl.get(cycAssertion);
// Or, to convert to a more general KBObject:
KbObject kbObj = KbObjectImpl.get(cycAssertion);
} catch (SessionException ex) {
// Do something with the exception...
} catch (CycConnectionException connEx) {
// Do something else...
} catch (KbTypeException ex) {
// Potentially thrown by AssertionImpl#get() & KbObjectImpl#get()
} catch (CreateException ex) {
// Also potentially thrown by AssertionImpl#get() & KbObjectImpl#get()
}https://stackoverflow.com/questions/35276397
复制相似问题