特化系统上的确定性规则程序
1. 规则应用检查与转换
在规则应用过程中,会涉及到规则是否适用的检查以及可能的转换失败情况。例如,下面的表格展示了检查规则 r9 在特定步骤是否适用:
| 步骤 | 规则 | 确定子句 |
| ---- | ---- | ---- |
| | ans ← occur(1, [2, 1, 0]) | |
| 1 | r10 | ans ← occur(1, [1, 0]) |
| 2 | r9 | ans ← [] |
同时,也存在转换失败的情况,如下表所示:
| 步骤 | 规则 | 确定子句 |
| ---- | ---- | ---- |
| | ans ← occur(1, 2) | |
| 1 | – | ⊥ |
在规则应用检查时,首先使用 calc - atom 从 tx 产生值 ty,然后评估条件 cond(ty)。若评估成功,应用第一条规则,将目标原子替换为等式原子 =(∗z, ty);若评估失败,则使用第二条规则,将目标原子替换为 =(∗z, tx)。
这里还提到了一种规则转换的替代方案,将第一条规则改为:
calcCond(∗x, ∗z), {calc(∗x, ∗y), cond(∗y)} −→calc(∗x, ∗z)
但此替代方案在 calc - atom 评估成本高时效率较低,因为需要评估两个输入参数相同的 calc - atom。
2. 状态转换程序及其操作语义的通用框架
2.1 D - 规则程序语义的基本结构
D - 规则程序的计算是一个状态转换序列。检查 D - 规则是否适用于给定状态,不仅涉及对状态内容的简单布尔检查,还可能需要评估用户定义的条件,这可能需要基于 D - 规则应用构建其他状态转换序列。这种条件状态转换结构是简单状态转换结构的扩展。
状态转换由条件后继映射 condSucc 表征。给定一组计算 M,condSucc 关联一个部分映射 condSucc(M),该映射通过考虑 M 中计算对规则适用性条件评估的影响来确定状态的后继。由于只有当 M 提供了检查相关规则适用性所需的所有必要计算时,才能知道后继状态,所以 condSucc(M) 通常不是全映射,且 condSucc 关于 M 是单调的。
2.2 计算和状态转换程序
-
计算的定义
:
- 设 Sta 是一组状态,Sta 上的计算是 Sta 中状态的非空序列。若为无限序列,则为无限计算;否则为有限计算。
- 设 M 是 Sta 上的一组计算,若对于任意 com, com′ ∈ M,当 first(com) = first(com′) 时,有 com = com′,则 M 是确定性的。用 detComp(Sta) 表示 Sta 上所有确定性计算集的集合。
-
状态转换程序的定义
:
状态转换程序 P 是一个 8 元组 ⟨Prb, Ans, Sta, Ini, Fin, mkSta, mkAns, condSucc⟩,其中:- Prb, Ans, Sta, Ini, Fin 是集合,且 Ini ⊆ Sta,Fin ⊆ Sta。
- mkSta : Prb → Ini,用于从给定问题确定初始状态。
- mkAns : Fin → Ans,用于从最终状态确定答案。
- condSucc : detComp(Sta) → partialMap(Sta - Fin, Sta),且 condSucc 是单调的。
下面是状态转换程序相关元素的 mermaid 流程图:
graph LR
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
A(Prb):::process -->|mkSta| B(Ini):::process
B -->|状态转换| C(Sta):::process
C -->|condSucc| D(Sta - Fin):::process
D -->|状态转换| C
C -->|最终状态| E(Fin):::process
E -->|mkAns| F(Ans):::process
3. 操作语义
与状态转换程序 P 关联的是一个在 detComp(Sta) 上的映射 KP。对于任意 M ∈ detComp(Sta),KP(M) 是 Sta 上满足以下条件的所有计算 com 的集合:
1. first(com) ∈ Ini。
2. 对于 com 中任意两个连续状态 sti 和 sti + 1,condSucc(M)(sti) = sti + 1。
3. 若 com 是有限的,则 last(com) ∈ Fin。
通过迭代定义 KnP(∅),可以得到一系列计算集合。并且有以下性质:
- 对于任意 M ∈ detComp(Sta),KP(M) ∈ detComp(Sta)。
- 对于任意 n ≥ 0,KnP(∅) ∈ detComp(Sta)。
- KP 是单调的。
- [K0P(∅), K1P(∅), K2P(∅), … ] 是一个递增序列。
程序 P 的过程意义 M(P) 定义为 limn→∞KnP(∅),且 M(P) 是确定性的。
4. 计算答案
基于 M(P) 中的有限计算,使用部分映射 reach(P) 将最终状态与初始状态关联起来。reach(P) 的定义如下:对于任意 st ∈ Ini,若 M(P) 中存在有限计算 com 使得 first(com) = st,则 reach(P)(st) = last(com);否则 reach(P)(st) 未定义。
然后,使用部分映射 exec(P) 来确定程序 P 计算的答案。对于任意 prb ∈ Prb,若 reach(P)(mkSta(prb)) 已定义,则 exec(P)(prb) = mkAns(reach(P)(mkSta(prb)));否则 exec(P)(prb) 未定义。
下面是计算答案过程的列表总结:
1. 从问题 prb 通过 mkSta 得到初始状态。
2. 在 M(P) 中查找以该初始状态开始的有限计算。
3. 若存在,通过 reach(P) 得到最终状态。
4. 最后通过 mkAns 从最终状态得到答案。
5. 特化系统上的 D - 规则程序
5.1 特化系统
特化系统 Γ 是一个四元组 ⟨A, G, S, μ⟩,其中 A、G、S 是集合,μ 是从 S 到 partialMap(A) 的映射,且满足以下条件:
1. (∀s′, s′′ ∈ S)(∃s ∈ S) : μ(s) = μ(s′) ◦ μ(s′′)。
2. (∃s ∈ S)(∀a ∈ A) : μ(s)(a) = a。
3. G ⊆ A。
元素 A、G、S 分别称为原子、基原子和特化,映射 μ 称为特化算子。特化 s ∈ S 适用于 a ∈ A 当且仅当 a ∈ dom(μ(s))。
5.2 D - 规则和 D - 规则程序
假设 Ab 和 Au 是 A 的不相交闭子集,且 Ab ∪ Au = A。Ab 中的原子视为内置原子,Au 中的原子视为用户定义的原子。
- D - 规则 :D - 规则 r 是形式为 h, {c1, …, cm} −→ b1, …, bn 的表达式,其中 h ∈ Au,m, n ≥ 0,ci ∈ Ab ∪ Au,bj ∈ Ab ∪ Au。h 称为规则的头,[c1, …, cm] 称为适用性条件,[b1, …, bn] 称为规则的体。
- D - 规则程序 :特化系统 Γ 上的 D - 规则程序是 D - 规则的有限序列。
6. 子句模型语义
6.1 子句模型状态
子句模型状态(C - 状态)有以下两种形式:
1. ans(as) ← gs,其中 as, gs ∈ fseq(A)。
2. 特殊符号 ⊥,称为空 C - 状态。
初始 C - 状态是第一种形式的 C - 状态,最终 C - 状态可以是空 C - 状态或第一种形式中 gs 为空序列的 C - 状态。
6.2 子句模型语义
-
原子评估和规则匹配
:通过映射 eC 和 mC 分别表征内置评估器和规则匹配,满足以下条件:
- eC : Ab → (S ∪ {⊥})。
- mC : (Drule(Γ) × (StaC - FinC)) → (S ∪ {⊥}),对于任意规则 r ∈ Drule(Γ) 和状态 st = (ans(as) ← gs) ∈ StaC - FinC,若 mC(r, st) = θ ∈ S,则 θ 适用于 r 且 head(r)θ = first(gs)。
-
D - 规则程序确定的条件后继映射 :设 R 是 Γ 上的 D - 规则程序,定义映射 condSuccC(R, eC, mC)。对于 M ∈ detComp(StaC) 和 st = (ans(as) ← gs) ∈ StaC - FinC:
-
若 first(gs) ∈ Ab:
- 若 eC(first(gs)) = ⊥,则 condSuccC(R, eC, mC)(M)(st) = ⊥。
- 若 eC(first(gs)) = σ ∈ S 且 σ 适用于 as 和 gs 中的每个原子,则 condSuccC(R, eC, mC)(M)(st) = (ans(asσ) ← rest(gsσ))。
- 否则 condSuccC(R, eC, mC)(M)(st) 未定义。
-
若 first(gs) ∈ Au:
- 对于 R 中的任意规则 r 和适用于 r 的任意 θ ∈ S,定义 init(r, θ) = (ans(body(r)θ) ← cond(r)θ)。
- 确定 condSuccC(R, eC, mC)(M)(st):若 R 中存在规则 r 满足特定条件,则 condSuccC(R, eC, mC)(M)(st) = (ans(as) ← bs · rest(gs));否则未定义。
-
若 first(gs) ∈ Ab:
-
D - 规则程序作为状态转换程序 :D - 规则程序 R 确定一个状态转换程序 ProcC(R, eC, mC),其定义如下:
- PrbC = fseq(A) × fseq(A)。
- AnsC = fseq(A) ∪ {⊥}。
- mkStaC : PrbC → IniC,对于 ⟨gs, as⟩ ∈ PrbC,mkStaC(⟨gs, as⟩) = (ans(as) ← gs)。
- mkAnsC : FinC → AnsC,对于 st ∈ FinC,若 st = (ans(as) ← []),则 mkAnsC(st) = as;若 st = ⊥,则 mkAnsC(st) = ⊥。
通过将 D - 规则程序 R 与状态转换程序 ProcC(R, eC, mC) 等同起来,程序 R 的过程意义 M(R) 可直接从前面定义的 M(P) 得到,即 M(R) = M(ProcC(R, eC, mC))。
综上所述,本文构建了一个通用框架来形式化具有条件状态转换结构的状态转换程序的意义,并将其应用于特化系统上的 D - 规则程序。该理论可以在特定数据领域中实例化,通过实例化特化系统的概念、指定内置原子和用户定义原子集合以及确定评估内置原子和规则匹配的映射,为 D - 规则程序及其过程语义提供了精确的定义,对从声明性规范合成 D - 规则程序的理论发展具有重要意义。
特化系统上的确定性规则程序
7. 规则应用示例分析
为了更好地理解规则应用过程,我们详细分析之前提到的规则应用检查表格。以检查规则 r9 在特定步骤是否适用为例,初始确定子句为
ans ← occur(1, [2, 1, 0])
。
| 步骤 | 规则 | 确定子句 |
| ---- | ---- | ---- |
| | ans ← occur(1, [2, 1, 0]) | |
| 1 | r10 | ans ← occur(1, [1, 0]) |
| 2 | r9 | ans ← [] |
在第一步,规则 r10 被应用,将
occur(1, [2, 1, 0])
转换为
occur(1, [1, 0])
。这可能是因为 r10 的适用性条件得到满足,并且规则的体替换了原有的原子。到第二步,规则 r9 被应用,最终得到
ans ← []
。这个过程展示了规则如何逐步改变确定子句,实现状态的转换。
再看转换失败的示例:
| 步骤 | 规则 | 确定子句 |
| ---- | ---- | ---- |
| | ans ← occur(1, 2) | |
| 1 | – | ⊥ |
这里,初始确定子句为
ans ← occur(1, 2)
,但在第一步就出现了转换失败,得到空 C - 状态
⊥
。这可能是因为没有合适的规则可以应用,或者规则的适用性条件无法满足。
8. 状态转换程序的实际应用
状态转换程序在实际中有广泛的应用,例如在自动化推理、程序验证等领域。下面以一个简单的自动化推理场景为例,说明状态转换程序的工作过程。
假设我们有一个问题空间 Prb,包含一些逻辑命题,答案空间 Ans 是这些命题的推理结果。状态空间 Sta 则是推理过程中的中间状态。初始状态集合 Ini 是问题的初始命题,最终状态集合 Fin 是推理得到的结论。
- 确定初始状态 :对于一个具体的问题 prb,通过 mkSta 映射得到初始状态。例如,prb 是一个逻辑表达式,mkSta 将其转换为适合推理的初始状态。
- 状态转换 :在推理过程中,根据条件后继映射 condSucc,不断从一个状态转换到下一个状态。如果当前状态中的某个原子是内置原子,使用 eC 进行评估;如果是用户定义原子,尝试匹配规则并根据规则的适用性进行状态转换。
- 得到答案 :当推理过程结束,到达最终状态时,通过 mkAns 映射从最终状态得到答案。
下面是这个推理过程的 mermaid 流程图:
graph LR
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
A(Prb):::process -->|mkSta| B(Ini):::process
B -->|状态转换| C(Sta):::process
C -->|condSucc| D(Sta - Fin):::process
D -->|状态转换| C
C -->|最终状态| E(Fin):::process
E -->|mkAns| F(Ans):::process
9. 操作语义的深入理解
操作语义中的映射 KP 是理解状态转换程序的关键。对于任意 M ∈ detComp(Sta),KP(M) 定义了满足特定条件的计算集合。通过迭代定义 KnP(∅),我们可以逐步构建出所有可能的计算序列。
例如,从 K0P(∅) = ∅ 开始,当 n = 1 时,K1P(∅) = KP(K0P(∅)) = KP(∅)。这个过程会不断生成新的计算序列,直到达到极限 limn→∞KnP(∅),也就是程序 P 的过程意义 M(P)。
下面是一个简单的表格,展示 KnP(∅) 的迭代过程:
| n | KnP(∅) |
| ---- | ---- |
| 0 | ∅ |
| 1 | KP(∅) |
| 2 | KP(KP(∅)) |
| … | … |
这个表格清晰地展示了 KnP(∅) 是如何通过迭代逐步构建的。同时,我们知道 KP 是单调的,这保证了迭代过程的稳定性和收敛性。
10. 计算答案的详细步骤
计算答案的过程涉及到部分映射 reach(P) 和 exec(P)。下面详细说明每个步骤:
1.
从问题到初始状态
:对于一个具体的问题 prb,使用 mkSta 映射将其转换为初始状态。例如,prb 是一个逻辑问题,mkSta 会将其转换为一个包含相关命题的初始状态。
2.
查找有限计算
:在 M(P) 中查找以该初始状态开始的有限计算。这可能需要遍历所有可能的计算序列,找到满足条件的计算。
3.
得到最终状态
:如果存在这样的有限计算,使用 reach(P) 映射得到最终状态。reach(P) 会根据计算的最后一个状态确定最终状态。
4.
得到答案
:最后,使用 mkAns 映射从最终状态得到答案。如果最终状态是
(ans(as) ← [])
,则答案为 as;如果是
⊥
,则表示没有得到有效的答案。
下面是这个过程的 mermaid 流程图:
graph LR
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
A(Prb):::process -->|mkSta| B(Ini):::process
B -->|查找有限计算| C(M(P)):::process
C -->|reach(P)| D(Fin):::process
D -->|mkAns| E(Ans):::process
11. 特化系统和 D - 规则程序的关系
特化系统为 D - 规则程序提供了一个基础框架。特化系统 Γ = ⟨A, G, S, μ⟩ 定义了原子、基原子和特化的概念,以及特化算子 μ。D - 规则程序则在这个基础上,通过规则的形式对原子进行操作和转换。
内置原子 Ab 和用户定义原子 Au 的划分,使得 D - 规则程序可以区分不同类型的原子,并采用不同的处理方式。内置原子可以通过 eC 进行评估,而用户定义原子则需要通过规则匹配和状态转换来处理。
例如,在一个特化系统中,原子可能代表不同的数据结构,特化操作可以对这些数据结构进行修改和扩展。D - 规则程序则可以根据特定的规则,对这些数据结构进行处理,实现特定的功能。
12. 子句模型语义的总结
子句模型语义通过定义子句模型状态、原子评估和规则匹配,以及条件后继映射,为 D - 规则程序提供了一种具体的操作语义。
子句模型状态(C - 状态)的两种形式
ans(as) ← gs
和
⊥
,涵盖了正常状态和转换失败的情况。原子评估和规则匹配通过映射 eC 和 mC 进行,确保了对内置原子和规则的正确处理。
条件后继映射 condSuccC(R, eC, mC) 根据当前状态和规则的适用性,确定下一个状态。这个过程考虑了内置原子和用户定义原子的不同情况,保证了状态转换的正确性。
通过将 D - 规则程序 R 与状态转换程序 ProcC(R, eC, mC) 等同起来,我们可以直接使用前面定义的操作语义来理解和分析 D - 规则程序的行为。
综上所述,特化系统上的 D - 规则程序通过状态转换的方式,实现了对原子的操作和转换。从规则应用检查到状态转换程序的定义,再到操作语义和计算答案的过程,整个体系提供了一个严谨的框架,用于处理各种复杂的问题。这个框架在自动化推理、程序验证等领域有重要的应用价值,为相关领域的研究和实践提供了坚实的理论基础。
超级会员免费看
1377

被折叠的 条评论
为什么被折叠?



