我在事件B中遇到排除证明义务的问题。在我的工作中,
我想形式化内存保护要求的规范,以检查它们之间的一致性。为了做到这一点,我使用Event-B Context来形式化系统的结构,并使用Event-B Machine来描述需求。每个要求都在Invariant和Event中描述。事件-B将检查每对需求以找出不一致性。
但是,它无法证明两个要求是一致的:
1:&#34; 读取从 NonTrusted 访问其他OS_Apps 的 data_section may_prevent < /强>&#34;
2:&#34; 读取 从 OS_App 访问 拥有data_section 是 shall_permit &#34;
这是我的工作。首先,在上下文文件中,我描述了系统的结构和访问控制:
的 1。系统结构:
我们有两种类型的OS_Application:可信和 NonTrusted 。
2种类型的OS_Objects:任务和 ISR 。
2种类型的ISR: Category_1 和 Category_2 。
每个OS_Object属于一个OS_App: ContainerOf∈OS_Obj→OS_App
每个OS_App都有一个代码段: AppCode∈OS_App→CodeSection
记忆有两部分: DataSection 和 Stack
OS_App和OS_Obj 可能 有DataSection:
OS_Obj有自己的堆栈: ObjStack∈OS_Obj→堆栈
2。访问控制:
访问权限从 主题 到 对象 :
主题包括: OS_App 和 OS_Obj
对象包括: Code_Section 和 内存
在下面的代码中,第20行描述:&#34;根据定义,这些对象的堆栈只属于所有者对象,因此无需在对象之间共享堆栈数据,即使这些对象属于同一个OS-Application。&#34;
第21行 描述:&#34;代码段是OS-Application专用的,或者可以在所有OS-Applications&#34;之间共享。
第22,23行 描述:&#34;操作系统应用程序可以拥有私有数据部分,而任务/ ISR可以拥有私有数据部分。&#34;
第24行 描述:&#34; OS-Application的私人数据部分 由所有人共享 属于该OS-Application的任务/ ISR。 &#34;
通过分析,我将上下文定义如下:
1: OS_Obj ⊆ Subjects
2: OS_App ⊆ Subjects ∖ OS_Obj
3: Tasks ⊆ OS_Obj
4: ISRs ⊆ OS_Obj∖Tasks
5: Category_1_ISRs ⊆ ISRs
6: Category_2_ISRs = ISRs ∖ Category_1_ISRs
7: Trusted_OS ⊆ OS_App
8: NonTrusted_OS = OS_App ∖ Trusted_OS
9: CodeSection ⊆ Objects
10: Memory ⊆ Objects ∖ CodeSection
11: DataSecs ⊆ Memory
12: Stacks ⊆ Memory ∖ DataSecs
13: partition(actions_set, {initact}, {read}, {write}, {execute})
14: partition(status_set, {initStt}, {shall_prevent}, {shall_permit}, {may_prevent}, {may_permit})
15: ObjData ∈ OS_Obj ⇸ DataSecs
16: ObjStack ∈ OS_Obj → Stacks
17: AppCode ∈ OS_App → CodeSection
18: AppData ∈ OS_App ⇸ DataSecs
19: ContainerOf ∈ OS_Obj → OS_App
20: ∀obj1,obj2 · (obj1 ∈ OS_Obj ∧ obj2 ∈ OS_Obj ∧ (obj1 ≠ obj2) ⇒ (ObjStack(obj1) ≠ ObjStack(obj2)))
21: ∀app1, app2 · (app1 ∈ OS_App ∧ app2 ∈ OS_App ∧ app1 ≠ app2) ⇒ AppCode(app1) = AppCode(app2)
22: ∀app1, app2 · (app1 ∈ dom(AppData) ∧ app2 ∈ dom(AppData) ∧ app1 ≠ app2) ⇒ AppData(app1) ≠ AppData(app2)
23: ∀ obj1, obj2 · (obj1 ∈ dom(ObjData) ∧ obj2 ∈ dom(ObjData) ∧ obj1 ≠ obj2) ⇒ ObjData(obj1) ≠ ObjData(obj2)
24: ∀ obj, app · (app ∈ dom(AppData) ∧ obj ∈ OS_Obj ∧ obj ∈ dom(ObjData) ∧ app ≠ ContainerOf(obj)) ⇒ ObjData(obj) ≠ AppData(app)
25: ∀ app, app1, app2 · (app ∈ dom(AppData) ∧ app2 ∈ dom(AppData) ∧ app1 ∈ NonTrusted_OS ∧ app = app1 ∧ app1 ≠ app2 ∧ AppData(app) = AppData(app2)) ⇒ ⊥
其次,在Machine文件中,我描述了:
prf_1: ∀app1, app2 · ((action = read) ∧ app1 ∈ NonTrusted_OS ∧ app2 ∈ dom(AppData)
∧ app1 ≠ app2 ∧ src = app1 ∧ dst = AppData(app2)
∧ status ≠ initStt) ⇒ status = may_prevent
prf_2: ∀app · ((action = read ∨ action = write) ∧ app ∈ dom(AppData)
∧ src = app ∧ dst = AppData(app) ∧ status ≠ initStt) ⇒ status = shall_permit
两个事件:Two events
之后,事件-B生成证据义务并尝试证明一致性。但是,这两个要求不一致如下:
undischarged Proof Obligation
在目标框中:它不能证明:
A = (¬(app∈dom(AppData) ∧ app1=app ∧ AppData(app2)=AppData(app)))
是真的。
但是,在要求2中,我们有:app1 ≠ app2
=&GT; app ≠ app2 (because app1=app)
=&GT; AppData(app2) ≠ AppData(app)
因此,(app∈dom(AppData) ∧ app1=app ∧ AppData(app2)=AppData(app)
= FALSE
然后A = (¬(app∈dom(AppData) ∧ app1=app ∧ AppData(app2)=AppData(app)))
= TRUE。
你能给我一些提示或评论吗?
答案 0 :(得分:0)
我在这里有点猜测,因为你给定的模型很长,并且不明显出现了什么问题或应该证明什么。您可以通过删除未使用的内容来改善您的问题。
你想要证明
¬(app∈dom(AppData) ∧ app1=app ∧ AppData(app2)=AppData(app))
(我不理解A=
部分,右边是谓词,而不是表达。)
让我们在app∈dom(AppData) ∧ app1=app
上应用案例区分:
如果确实如此,我们将其作为一个额外的假设,并且仍有待证明(*):
¬(AppData(app2)=AppData(app1))
在屏幕截图中,我们可以看到app1 ≠ app2
,因此要实例化公理22,您仍然需要app2∈dom(AppData)
才能获得所需的结果AppData(app2)≠AppData(app1)
。它在屏幕截图中不可见,但可能在某处。
(*):也许你可以通过引入假设¬(AppData(app2)=AppData(app1))
(由“啊”)来实现这一点。之后你可以使用这个以及上述案例区分的假设来证明你的目标。
只是评论:公理22和23可以通过将函数AppData
和ObjData
定义为内射来完全替换,例如: ObjData ∈ OS_Obj -+>> DataSecs
。这不仅会使规范更具可读性,我认为证明者可以比量化的陈述更好地处理这些规范。