我有一个简单的问题,我怀疑没有简单的答案。本质上,我想检查一个OWL表达式( #B )在逻辑上跟在另一个表达式( #A )之后是不是真的-换句话说,我想问:#A -> #B是真的吗?
这样做的原因是,我正在为一个应用程序编写一个匹配算法,它将基于知识(由#KnowledgeStructure类表示)中的结构与描述当前应用程序状态需求的结构(#StateRequirement)进行匹配。这两种结构都具有字符串值,这些字符串值表示第三种结构(#Model)的状态上的OWL表达式。它们是:#KnowledgeStructure.PostCondition,表示应用于#模型的知识结构将如何转换#模型;以及#StateRequirement.GoalCondition,表示应用程序旨在实现的#模型状态。因此,我想看看#KnowledgeStructure是否会通过检查#KnowledgeStructure.PostCondition生成所需的#StateRequiremment.GoalCondition来满足#StateRequirement。我可以抽象地表达为:(#KnowledgeStructure.Postcondition => #StateRequirement.GoalCondition) =>匹配(#KnowledgeStructure,#StateRequirement)。我可以将其表达为:((#A -> #B) -> Match( #A,#B)),其中#A和#B都是有效的OWL表达式。
在一般情况下,我希望能够表达以下规则:“如果表达式#B跟随在#A之后,那么表达式Match(#A,#B)也是真的”。
本质上,我的问题是:我如何在OWL中提出或实现这样的规则?如何测试一个表达式是否跟在另一个表达式之后?另外,如果没有明确声明两个表达式之间的关系#A -> #B,现有的推理者是否足够强大来确定这种关系?
发布于 2012-12-30 19:10:26
我不是百分之百确定我完全理解了这个问题,但从我所掌握的情况来看,我会以这种方式面对这种情况。
首先,我提到Java是因为我所知道的所有库都是针对这种语言的。其次,我认为OWL本身不能满足您的目标,因为它可以表示规则和公理,但它不提供推理,也就是说,您需要一个推理机,所以您需要构建一个使用它的程序,外加执行我将在下面概述的额外处理:
1)你没有提到它,但我猜你有一个潜在的本体w.r.t。你需要证明你的结果关系(你用符号“->”表示的)。如果本体不明确,也许可以从您在问题中提到的文本表达式中提取/组合它。
2)你需要使用一个库来操纵本体,我推荐曼彻斯特大学的OWL API,它非常强大和简单,在教程的“文档”一节中,你已经概述了主要功能,包括使用推理程序(示例显示了Hermit,但这个原则适用于任何其他推理程序)。
3)在这一点上,你需要检查本体是否一致(否则任何东西都可以派生,因为它经常发生在错误的前提下)
4)将以下公理添加到本体中(您直接在Java语言中构建它,无需序列化,您可以让推理器在内存表示上工作)并检查一致性:A \sqsubseteq B,即使用关联的解释: A^I \ => B^I,因此它等同于A subseteq B(它们具有相同的真值表)。
5)此时,您可以添加公理匹配(A,B),其中A和B是您的类表达式,Match是一个角色/关系,它关联所有类表达式,对于这些类表达式,第二个是第一个表达式的结果。
6)在多次重复这些步骤之后,您可能想要序列化结果并存储它,这同样可以通过使用内存中的OWL非常简单地实现。
有关描述逻辑(支撑OWL本体的逻辑)的一些基础知识,可以参考A description logic Primer (2012), Horrocks et al.和Foundations of Description Logics (2011), Rudolph。
我不是逻辑专家,也不是DL专家,所以请核实我提供的所有信息,并随时纠正我:)
https://stackoverflow.com/questions/14034656
复制相似问题