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