2

我有一个简单的问题,我怀疑它没有简单的答案。本质上,我想检查一个 OWL 表达式 (#B) 从另一个 (#A) 逻辑上遵循是否是真的 - 换句话说,我想问:#A -> #B 是真的吗?

原因是我正在为应用程序编写匹配算法,该算法将基于知识的结构(由#KnowledgeStructure 类表示)与描述当前应用程序状态需求的结构(#StateRequirement)匹配。两种结构都具有属性,这些属性具有表示第三种结构(#Model)状态下的 OWL 表达式的字符串值。它们是: #KnowledgeStructure.PostCondition 表示应用于#Model 的知识结构将如何转换#Model;和#StateRequirement.GoalCondition,它表示应用程序旨在实现的#Model 状态。因此,我想通过检查#KnowledgeStructure.PostCondition 是否产生所需的#StateRequiremment.GoalCondition 来查看#KnowledgeStructure 是否满足#StateRequirement。我可以抽象地表达为:(#KnowledgeStructure.Postcondition => #StateRequirement.GoalCondition) => Match(#KnowledgeStructure, #StateRequirement)。不太容易混淆,我可以将其表示为: ((#A -> #B) -> Match(#A, #B)) 其中 #A 和 #B 都是有效的 OWL 表达式。

在一般情况下,我希望能够表达以下规则:“如果表达式 #B 从 #A 遵循是真的,那么表达式 Match(#A, #B) 也是真的”。

本质上,我的问题是:我如何在 OWL 中提出或实现这样的规则?如何测试一个表达式是否来自另一个表达式?此外,如果没有明确说明这种关系,现有的推理器是否足够强大来确定两个表达式之间的关系 #A -> #B?

4

1 回答 1

1

我不是 100% 确定我完全理解了这个问题,但根据我的理解,我会以这种方式面对这种情况。

首先,我指的是 Java,因为我知道的所有库都是为这种语言设计的。其次,我认为OWL本身不能满足你的目标,因为它可以表示规则和公理,但它不提供推理,即你需要一个推理器,所以你需要构建一个程序使用它,加上我将在下面画出的额外处理:

1)你没有提到它,但我猜你有一个潜在的本体,你需要证明你的后果关系(你用符号“->”表示)。如果本体不明确,也许可以从您在问题中提到的文本表达式中提取/组合它。

2)您需要使用一个库进行本体操作,我建议使用曼彻斯特大学的OWL API,它非常强大且简单,在“文档”部分下的教程中,您可以概述主要功能,包括推理器的使用(该示例显示了隐士,但该原理适用于任何其他推理者)。

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 et al。以及描述逻辑的基础(2011 年),鲁道夫

我不是逻辑学家或深度学习专家,所以请验证我提供的所有信息并随时纠正我:)

于 2012-12-30T11:10:26.233 回答