Skip to content

Commit 4f6a151

Browse files
committed
Sketch of Full correctness algorithm
1 parent 9b8df51 commit 4f6a151

File tree

1 file changed

+389
-0
lines changed

1 file changed

+389
-0
lines changed
Lines changed: 389 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,389 @@
1+
Proving Full Correctness All-Path Reachability Claims
2+
=====================================================
3+
4+
This document details Full Correctness All-Path Reachability without solving the
5+
most-general-unifier (MGU) problem.
6+
MGU will be detailed in a separate document.
7+
8+
_Prepared by Traian Șerbănuță, based on [proving All-Path Reachability
9+
claims](2019-03-28-All-Path-Reachability-Proofs.md)_
10+
11+
Background
12+
----------
13+
14+
Similarly to the All-Path Reachability document, we assume all pattern variables
15+
used in this document to be _extended function-like patterns_, that is patterns
16+
which can be written as `t ∧ p` where the interpretation of `t` contains at most
17+
one element and `p` is a predicate.
18+
19+
_Extended constructor patterns_ will be those extended function-like patterns
20+
for which `t` is a functional term, composed out of constructor-like symbols
21+
and variables.
22+
23+
24+
__Note:__
25+
Whenever `φ` is a function-like pattern,
26+
```
27+
φ ∧ ∃z.ψ = φ ∧ ∃z.⌈φ ∧ ψ⌉
28+
```
29+
and
30+
```
31+
φ ∧ ¬∃z.ψ = φ ∧ ¬∃z.⌈φ ∧ ψ⌉
32+
```
33+
34+
In this document we prefer the formulations on the right because they are of the
35+
form pattern and predicate.
36+
37+
Moreover, suppose all free variables in the above formulae are from `x`,
38+
we will assume that the unification condition `⌈φ ∧ ψ⌉` can always be
39+
computed to be of the form `z = t ∧ p`, where
40+
41+
* `t`s are functional patterns with no free variables from `z`
42+
* i.e., `[t / z]` is a substitution.
43+
* `p` is a predicate over `x ∪ z`
44+
45+
Under this assumption, `∃z.⌈φ ∧ ψ⌉` can be rewritten without the existential
46+
quantification, as `p[t/z]`, i.e., `p` in which all ocurrences of the variables
47+
from `z` are substituted with the corresponding term in `t`.
48+
49+
50+
Definitions
51+
-----------
52+
53+
### All-path finally
54+
55+
Given a formula `φ`, let `♢φ` denote the formula “all-path finally” `φ`,
56+
defined by:
57+
58+
```
59+
♢φ := μX.φ ∨ (○X ∧ •⊤)
60+
```
61+
62+
one consequence of the above is that `♢φ ≡ φ ∨ (○♢φ ∧ •⊤)`.
63+
64+
Given this definition of all-path finally, a full correctness all-path
65+
reachability claim
66+
```
67+
∀x.φ(x) → ♢∃z.ψ(x,z)
68+
```
69+
basically states that if `φ(x)` holds for a configuration `γ`, for some `x`,
70+
then `P(γ)` holds, where `P(G)` is recursively defined on configurations as:
71+
* there exists `z` such that `ψ(x,z)` holds for `G`
72+
* or
73+
* `G` is not stuck (`G → • T`) and
74+
* `P(G')` for all configurations `G'` in which `G` can transition
75+
76+
__Note:__
77+
Using the least fix-point (`μ`) instead of the greatest fix-point (`ν`)
78+
restricts paths to finite ones. Therefore, the intepretation of a reachability
79+
claim guarantees full-correctness, as it requires that the conclusion is
80+
reached in a finite number of steps.
81+
82+
Problem Description
83+
-------------------
84+
85+
Given a set of reachability claims, of the form `∀x.φ(x) → ♢∃z.ψ(x,z)`,
86+
we are trying to prove all of them together.
87+
88+
### Additional complication
89+
90+
Since proving a claim now also needs to guarantee termination, there are several
91+
extra requirements, as applications of circularities would now need to be
92+
guarded by a measure of decreasingness instead of a measure of progress
93+
(switching from coinduction to induction).
94+
95+
## Proposal of syntax changes to address the above mentioned complication
96+
97+
- claims need to mention the other claims (including themselves) which are
98+
needed to complete their proof; this induces a dependency relation
99+
- claims which are part of a dependency cycle (including self-dependencies)
100+
would need to be specified together as a "claim group"
101+
- a claim group would need to provide a metric on their input variables, which
102+
would be used as part of the decreasingness guard whenever one tries to apply
103+
a claim from the group during the proof of one the claims in the group
104+
105+
A claim group would be something like
106+
```
107+
claim group
108+
decreasing measure(x)
109+
110+
. . .
111+
112+
claim φᵢ(x) → ♢∃zᵢ.ψᵢ(x,zᵢ) [using(claimᵢ₁, ..., claimᵢₖ)]
113+
114+
. . .
115+
116+
end claim group
117+
```
118+
119+
where the claims in the `using` mention the dependencies which are not part of
120+
the cycle.
121+
122+
## Algorithms
123+
-------------
124+
(detailed in the next section)
125+
126+
127+
### Algorithm `proveAllPath`
128+
129+
__Input:__ claim group `∀x. (φ₁(x) → ♢∃z.ψ₁(x,z)) ∧ ... ∧ (φₙ(x) → ♢∃z.ψₙ(x,z)) [decreasing measure(x)]`
130+
131+
__Output:__ Proved or Unproved
132+
133+
* Fix an instance `x₀` for the variables `x`
134+
* Let `claims ::= { ∀ x . φᵢ(x) ∧ measure(x) <Int measure(x₀) → ♢∃z.ψᵢ(x,z) }`
135+
* For each claim `φᵢ(x₀) → ♢∃z.ψᵢ(x₀,z)`
136+
* check that `φᵢ(x₀) → measure(x) >=Int 0`
137+
* Let `claimsᵢ ::= claims ∪ { claimᵢ₁, ..., claimᵢₖ }`
138+
* Let `Goals := { φᵢ(x₀) }`
139+
* While `Goals` is not empty:
140+
* Extract and remove `goal` of the form `φ` from `Goals`
141+
* Let `goalᵣₑₘ := φ ∧ ¬∃z.⌈φ ∧ ψᵢ⌉`
142+
* If `goalᵣₑₘ` is bottom (`goalᵣₑₘ ≡ ⊥`)
143+
* continue to the next goal
144+
* `(Goals', goal'ᵣₑₘ) := derivePar(goalᵣₑₘ, claimsᵢ)`
145+
* Let `(Goals'', goal''ᵣₑₘ) := derivePar(goal'ᵣₑₘ, axioms)`
146+
* If `goal''ᵣₑₘ` is not trivially valid (its lhs is not equivalent to ``)
147+
* Return `Unprovable`
148+
* Let `Goals := Goals ∪ Goals' ∪ Goals''`
149+
* Return `Provable`
150+
151+
__Note:__ Since the derivation process can continue indefinitely, one could add
152+
a bound on the total number of (levels of) expansions attempted before
153+
returning `Unprovable`.
154+
155+
__Note__: If the unfication condition `⌈φ ∧ ψ⌉ = (z=t)∧ p`
156+
with `t` functional, `p` predicate, and `t` free of `z`.
157+
Then `goalᵣₑₘ := φ ∧ ¬∃z.⌈φ ∧ ψ⌉`
158+
is equivalent to `φ ∧ ¬pᵢ[tᵢ/xᵢ]`.
159+
160+
### Algorithm `derivePar`
161+
162+
__Input:__: goal `φ` and set of tuples `{ (xᵢ,φᵢ,zᵢ,ψᵢ) : 1 ≤ i ≤ n }` representing either
163+
164+
* claims `{ ∀xᵢ.φᵢ → ♢∃zᵢ.ψᵢ : 1 ≤ i ≤ n }`, or
165+
* axioms `{ ∀xᵢ.φᵢ → •∃zᵢ.ψᵢ : 1 ≤ i ≤ n }`
166+
167+
__Output:__ `(Goals, goalᵣₑₘ)`
168+
169+
* Let `goalᵣₑₘ := φ ∧ ¬∃x₁.⌈φ∧φ₁⌉ ∧ … ∧ ¬∃xₙ.⌈φ∧φₙ⌉`
170+
* Let `Goals := { ∀z₁.(∃x₁.ψ₁ ∧ ⌈φ∧φ₁⌉), … , ∀zₙ.(∃xₙ.ψₙ ∧ ⌈φ∧φₙ⌉) }`
171+
172+
__Note__: `∀zᵢ.(∃xᵢ.ψᵢ ∧ ⌈φ∧φᵢ⌉)` is obtained from
173+
`(∃xᵢ.(∃zᵢ.ψᵢ) ∧ ⌈φ∧φᵢ⌉) → ♢∃z.ψ`
174+
175+
__Note__: If the unfication condition `⌈φ ∧ φᵢ⌉ = (xᵢ=tᵢ)∧ pᵢ`
176+
with `tᵢ` functional, `pᵢ` predicate, and `tᵢ` free of `xi`.
177+
Then the goal `∀x∪zᵢ.(∃xᵢ.ψᵢ ∧ ⌈φ∧φᵢ⌉) → ♢∃z.ψ`
178+
is equivalent to `∀x∪zᵢ.ψᵢ[tᵢ/xᵢ] ∧ pᵢ[tᵢ/xᵢ] → ♢∃z.ψ`.
179+
180+
Similarly `goalᵣₑₘ := (φ ∧ ¬∃x₁.⌈φ∧φ₁⌉ ∧ … ∧ ¬∃xₙ.⌈φ∧φₙ⌉)`
181+
is equivalent to `(φ ∧ ⋀ⱼ ¬pⱼ[tⱼ/xⱼ])`
182+
where `j` ranges over the set `{ i : 1 ≤ i ≤ n, φ unifies with φᵢ }`.
183+
184+
__Note__: If `φ` does not unify with `φᵢ`, then `⌈φ∧φᵢ⌉ = ⊥`, hence
185+
the goal `∀x∪zᵢ.(∃xᵢ.ψᵢ ∧ ⌈φᵢʳᵉᵐ∧φᵢ⌉) → ♢∃z.ψ` is equivalent to
186+
`∀x.⊥ → ♢∃z.ψ` which can be discharged immediately. Also, in the
187+
remainder `¬∃x₁.⌈φ∧φ₁⌉ = ⊤` so the conjunct can be removed.
188+
189+
190+
Explanation
191+
-----------
192+
193+
Say we want to prove `∀x. (φ₁(x) → ♢∃z.ψ₁(x,z)) ∧ ... ∧ (φₙ(x) → ♢∃z.ψₙ(x,z)) [decreasing measure(x)]`.
194+
195+
We will do that by well-founded induction over `measure(x)`.
196+
To do that, we would need to ensure that `measure(x)` is always positive;
197+
this could be checked either syntactically, or using the SMT.
198+
199+
Fix an arbitrary instance `x₀` of the variables. We have to prove each
200+
reachability claim `φᵢ(x₀) → ♢∃z.ψᵢ(x₀,z)`, using the induction hypothesis
201+
`∀x. measure(x) < measure(x₀) → (φ₁(x) → ♢∃z.ψ₁(x,z)) ∧ ... ∧ (φₙ(x) → ♢∃z.ψₙ(x,z))`
202+
which can be split into induction hypotheses for each claim
203+
`∀x. φᵢ(x) ∧ measure(x) < measure(x₀) → ♢∃z.ψᵢ(x,z)`.
204+
205+
Since we might be using the claims to advance the proof of the claim, to avoid
206+
confusion (and to reduce caring about indices) we will denote a goal with
207+
`φ(x₀) → ♢∃z.ψ(x₀,z)` in all subsequent steps, although the exact goal might
208+
change from one step to the next.
209+
210+
### Eliminating the conclusion
211+
212+
First, let us eliminate the case when the conclusion holds now. We have
213+
the following sequence of equivalent claims:
214+
215+
```
216+
φ(x₀) → ♢∃z.ψ(x₀,z)
217+
φ(x₀) ∧ (∃z.ψ(x₀, z) ∨ ¬∃z.ψ(x₀, z)) → ♢∃z.ψ(x₀,z)
218+
(φ(x₀) ∧ ∃z.ψ(x₀, z)) ∨ (φ(x₀) ∧ ¬∃z.ψ(x₀, z)) → ♢∃z.ψ(x₀,z)
219+
(φ(x₀) ∧ ∃z.ψ(x₀, z) → ♢∃z.ψ(x₀,z)) ∧ (φ(x₀) ∧ ¬∃z.ψ(x₀, z) → ♢∃z.ψ(x₀,z))
220+
```
221+
222+
The first conjunct, `φ(x₀) ∧ ∃z.ψ(x₀, z) → ♢∃z.ψ(x₀,z)` can be discharged by
223+
unrolling `♢∃z.ψ(x₀,z)` to `∃z.ψ(x₀,z) φ ∨ (○♢∃z.ψ(x₀,z) ∧ •⊤)`, and then
224+
using that `∃z.ψ(x₀, z)` appears in both lhs (as a conjunct) and rhs (as a
225+
disjunct).
226+
227+
This reduces the above to proving the following remainder claim:
228+
229+
````
230+
φ(x₀) ∧ ¬∃z.ψ(x₀, z) → ♢∃z.ψ(x₀,z)
231+
```
232+
233+
Let `φ(x₀)` denote `φ(x₀) ∧ ¬(∃z.ψ(x₀, z))` in the sequel.
234+
If `φ(x₀)` is equivalent to `⊥`, then the implication holds and we are done.
235+
236+
### Applying circularities (induction hypotheses)
237+
238+
To apply circularities we have to ensure that the measure has decreased.
239+
However, whenever circularities may be applied, we want to apply them
240+
immediately (to allow skipping over loops/recursive calls), and to only apply
241+
regular rules on the parts on which circularities cannot apply.
242+
243+
On the other hand, care should be taken when choosing the measure, to ensure
244+
it actually holds whenever one needs to reenter a loop/call a recursive
245+
function. Failing to have a good such measure would result in the circularities
246+
never being applied and the proof looping (and branching) forever.
247+
248+
In the following, let `∀x.φᵢ(x) → ♢∃z.ψᵢ(x,z)` denote the ith induction
249+
hypothesis, with `φᵢ(x)` including the `measure(x) < measure(x₀)` check.
250+
251+
```
252+
φ(x₀) → ♢∃z.ψ(x₀,z)
253+
φ(x₀) ∧ (∃x.φ₁(x) ∨ … ∨ ∃x.φₙ(x) ∨ (¬∃x.φ₁(x) ∧ … ∧ ¬∃x.φₙ(x)) → ♢∃z.ψ(x₀,z)
254+
(φ(x₀) ∧ ∃x.φ₁(x)) ∨ … ∨ (φ(x₀) ∧ ∃x.φₙ(x)) ∨ (φ(x₀) ∧ (¬∃x.φ₁(x) ∧ … ∧ ¬∃x.φₙ(x))) → ♢∃z.ψ(x₀,z)
255+
(φ(x₀) ∧ ∃x.φ₁(x) → ♢∃z.ψ(x₀,z)) ∧ … (φ(x₀) ∧ ∃x.φₙ(x) → ♢∃z.ψ(x₀,z)) ∧ (φ(x₀) ∧ (¬∃x₁.φ₁ ∧ … ∧ ¬∃xₙ.φₙ)) → ♢∃z.ψ(x₀,z))
256+
```
257+
258+
Note that the remainder can be rewritten using the following equivalences:
259+
260+
```
261+
φ(x₀) ∧ (¬∃x.φ₁(x) ∧ … ∧ ¬∃x.φₙ(x)) → ♢ψ(x₀,z)
262+
(φ(x₀) ∧ ¬∃x.φ₁(x)) ∧ … ∧ (φ(x₀) ∧ ¬∃x.φₙ(x)) → ♢ψ(x₀,z)
263+
(φ(x₀) ∧ ¬∃x.⌈φ(x₀) ∧ φ₁(x)⌉) ∧ … ∧ (φ(x₀) ∧ ¬∃x.⌈φ(x₀)∧φₙ(x)⌉) → ♢ψ(x₀,z)
264+
φ(x₀) ∧ (¬∃x.⌈φ(x₀) ∧ φ₁(x)⌉ ∧ … ∧ ¬∃x.⌈φ(x₀)∧φₙ(x)⌉) → ♢ψ(x₀,z)
265+
```
266+
267+
In particular, part of the predicate of the remainder will include the negation
268+
of the measure check, `¬measure(x) < measure(x₀)` instantiated with the
269+
substitution associated with any term part of some `φᵢ(x)` matching `φ(x₀)`.
270+
271+
#### Using a claim to advance the corresponding goal
272+
273+
We want to prove that from the induction hypothesis `∀x. φᵢ(x) → ♢∃z.ψᵢ(x,z)`
274+
and the derived goal `∀zᵢ.∃x.(ψᵢ(x,zᵢ) ∧ ⌈φ(x₀) ∧ φᵢ(x)⌉) → ♢∃z.ψ(x₀, z)`
275+
we can deduce that `φ(x₀) ∧ ∃x.φᵢ(x) → ♢∃z.ψ(x₀,z)`.
276+
277+
This would allow us to replace goal `φ(x₀) ∧ ∃x.φᵢ(x) → ♢∃z.ψ(x₀,z)`
278+
with goal `∀zᵢ.∃x.(ψᵢ(x,zᵢ) ∧ ⌈φ(x₀) ∧ φᵢ(x)⌉) → ♢∃z.ψ(x₀,z)`.
279+
280+
_Proof:_
281+
282+
The main step of our proof is to prove
283+
`φ(x₀) ∧ ∃x.φᵢ(x) → ♢∃x.((∃zᵢ.ψᵢ(x,z)) ∧ ⌈φ(x₀) ∧ φᵢ(x)⌉)`
284+
from `∀x. φᵢ(x) → ♢∃z.ψᵢ(x,z)`.
285+
286+
Assume `⌈φ(x₀) ∧ φᵢ(x)⌉ = (x=tᵢ(x₀))∧ pᵢ(x, x₀)` with `tᵢ(x₀)` functional and
287+
free of `x` and `pᵢ(x₀,x)` predicate.
288+
289+
Then,
290+
```
291+
φᵢ(tᵢ) → ♢∃z.ψᵢ(tᵢ, z) // by induction hypothesis ∀x.φᵢ(x) → ♢∃z.ψᵢ(x,z) instantiated to x := tᵢ
292+
φᵢ(tᵢ) ∧ p(x₀,tᵢ) → (♢∃z.ψᵢ(tᵢ, z)) ∧ p(x₀,tᵢ) // framing
293+
φᵢ(tᵢ) ∧ p(x₀,tᵢ) → ♢((∃z.ψᵢ(tᵢ, z)) ∧ p(x₀,tᵢ)) // predicate properties
294+
∃x.φᵢ(x) ∧ x=tᵢ ∧ p(x₀,x) → ♢∃x.((∃z.ψᵢ(x,z)) ∧ x=tᵢ ∧ p(x₀,x)) // substitution properties
295+
∃x.φᵢ(x) ∧ ⌈φ(x₀)∧φᵢ(x)⌉ → ♢∃x.((∃z.ψᵢ(x,z)) ∧ ⌈φ(x₀)∧φᵢ(x)⌉) // definition of ⌈φ(x₀)∧φᵢ(x)⌉
296+
φ(x₀) ∧ ∃x.φᵢ(x) ∧ ⌈φ(x₀)∧φᵢ(x)⌉ → ♢∃x.((∃z.ψᵢ(x,z)) ∧ ⌈φ(x₀)∧φᵢ(x)⌉) // Strengthening
297+
φ(x₀) ∧ ∃x.⌈φ(x₀) ∧ φᵢ(x) ∧ ⌈φ(x₀)∧φᵢ(x)⌉⌉ → ♢∃x.((∃z.ψᵢ(x,z)) ∧ ⌈φ(x₀)∧φᵢ(x)⌉) // φ is functional
298+
φ(x₀) ∧ ∃x.(⌈φ(x₀) ∧ φᵢ(x)⌉ ∧ ⌈φ(x₀)∧φᵢ(x)⌉) → ♢∃x.((∃z.ψᵢ(x,z)) ∧ ⌈φ(x₀)∧φᵢ(x)⌉) // predicate properties
299+
φ(x₀) ∧ ∃x.⌈φ(x₀) ∧ φᵢ(x)⌉ → ♢∃x.((∃z.ψᵢ(x,z)) ∧ ⌈φ(x₀)∧φᵢ(x)⌉) // idempotency
300+
φ(x₀) ∧ ∃x.φᵢ(x) → ♢∃x.((∃z.ψᵢ(x,z)) ∧ ⌈φ(x₀)∧φᵢ(x)⌉) // φ is functional
301+
```
302+
303+
#### Summary of applying circularities
304+
305+
By applying the circularities, we will replace the existing goal with a set
306+
consisting of a goal for each circularity (some with the hypothesis equivalent
307+
with `⟂`) and a remainder.
308+
309+
For a given induction hypothesis ``∀x. φᵢ(x) → ♢∃z.ψᵢ(x,z)`,
310+
since `φ(x₀)` and `φᵢ(x)` are both function-like patterns (constrained terms),
311+
we can assume that `⌈φ(x₀) ∧ φᵢ(x)⌉` can be written of the form
312+
`(x=tᵢ(x₀)) ∧ pᵢ(x, x₀)` with `tᵢ(x₀)` functional and free of `x` and
313+
`pᵢ(x₀,x)` a predicate (which can be bottom to account for unification failure).
314+
315+
Then the derived goal associated to this induction hypothesis will be
316+
`∀zᵢ.∃x.(ψᵢ(x,zᵢ) ∧ ⌈φ(x₀) ∧ φᵢ(x)⌉) → ♢∃z.ψ(x₀,z)`, which, using the above
317+
identity, is equivalent to
318+
319+
```
320+
∀zᵢ.∃x.(ψᵢ(x,zᵢ) ∧ (x=tᵢ(x₀)) ∧ pᵢ(x, x₀)) → ♢∃z.ψ(x₀,z)
321+
∀zᵢ.∃x.(ψᵢ(tᵢ(x₀),zᵢ) ∧ pᵢ(tᵢ(x₀), x₀)) → ♢∃z.ψ(x₀,z)
322+
∀zᵢ.ψᵢ(tᵢ(x₀),zᵢ) ∧ pᵢ(tᵢ(x₀), x₀) → ♢∃z.ψ(x₀,z)
323+
```
324+
325+
Using the fact that the variables `zᵢ` only appear in the lhs, we can
326+
instantiate them to arbitrary (but fixed) symbolic variables `z₀`, and then
327+
let `φ(x₀)` denote ψᵢ(tᵢ(x₀),z₀) ∧ pᵢ(tᵢ(x₀), x₀)` for the next phase of the
328+
algorithm.
329+
330+
331+
### Applying axioms
332+
333+
We're back now to `φ(x₀) → (○♢∃z.ψ(x₀,z)) ∧ •⊤`, which is equivalent to
334+
`(φ(x₀) → ○♢∃z.ψ(x₀, z)) ∧ (φ(x₀) → •⊤)`
335+
336+
Therefore we need to check two things:
337+
338+
1. That `φ(x₀)` is not stuck
339+
1. That `φ(x₀) → ○♢∃z.ψ`
340+
341+
Assume `∀xᵢ.φᵢ(xᵢ) → •∃zᵢ.ψᵢ(xᵢ,zᵢ), 1 ≤ i ≤ n` are all the one-step axioms
342+
in the definition, and `P -> o ⋁ᵢ ∃xᵢ.⌈P ∧ φᵢ(xᵢ)⌉ ∧ ∃zᵢ.ψᵢ(xᵢ,zᵢ)`
343+
is the STEP rule associated to them.
344+
345+
Using the same reasoning as when applying all claims in parallel,
346+
`φ(x₀) → α` is equivalent with
347+
```
348+
(φ(x₀) ∧ ∃x₁.φ₁(x₁) → α) ∧ … ∧ (φ(x₀) ∧ ∃xₙ.φₙ(xₙ) → α) ∧ (φ(x₀) ∧ ¬∃x₁.φ₁(x₁) ∧ … ∧ ¬∃xₙ.φₙ(xₙ) → α)
349+
```
350+
351+
Now, for the first thing to check, take `α := •⊤`.
352+
Since all but the last conjunct are guaranteed to hold
353+
(because of the rewrite axioms), `φ` is stuck if the remainder after attempting
354+
to apply all axioms (i.e., the lhs of the last conjunct) is not equivalent to `⊥`.
355+
356+
We want to prove that from the STEP rule and
357+
```
358+
(∀z₁.∃x₁.ψ₁(x₁,z₁) ∧ ⌈φ(x₀) ∧ φ₁(x₁)⌉ → ♢∃z.ψ(x₀,z)) ∧ … ∧ (∀zₙ.∃xₙ.ψₙ(xₙ,zₙ) ∧ ⌈φ(x₀) ∧ φₙ(xₙ)⌉ → ♢∃z.ψ(x₀,z))
359+
```
360+
361+
we can derive `φ(x₀) → ○♢∃z.ψ(x₀,z)`
362+
363+
This would allow us to replace the goal `φ(x₀) → ○♢∃z.ψ(x₀,z)` with the set of goals
364+
```
365+
{ ∀zᵢ.∃xᵢ.ψᵢ(xᵢ,zᵢ) ∧ ⌈φ(x₀) ∧ φᵢ(xᵢ)⌉ → ♢∃z.ψ(x₀,z) : 1 ≤ i ≤ n }
366+
```
367+
368+
_Proof:_
369+
370+
Apply `(STEP)` on `φ(x₀)`, and we obtain that
371+
```
372+
φ(x₀) → o ⋁ᵢ ∃xᵢ.⌈φ(x₀) ∧ φᵢ(xᵢ)⌉ ∧ ∃zᵢ.ψᵢ(xᵢ,zᵢ)
373+
```
374+
375+
We can replace our goal succesively with:
376+
```
377+
o ⋁ᵢ ∃xᵢ.⌈φ(x₀) ∧ φᵢ(xᵢ)⌉ ∧ ∃zᵢ.ψᵢ(xᵢ,zᵢ) → ○♢∃z.ψ(x₀, z) // transitivity of →
378+
⋁ᵢ ∃xᵢ.⌈φ(x₀) ∧ φᵢ(xᵢ)⌉ ∧ ∃zᵢ.ψᵢ(xᵢ,zᵢ) → ♢∃z.ψ(x₀, z) // framing on ○
379+
∃xᵢ.⌈φ(x₀) ∧ φᵢ(xᵢ)⌉ ∧ ∃zᵢ.ψᵢ(xᵢ,zᵢ) → ♢∃z.ψ(x₀, z) for all i
380+
```
381+
382+
#### Summary of applying the claims
383+
384+
- Check that the remainder `φ(x₀) ∧ ¬∃x₁.φ₁(x₁) ∧ … ∧ ¬∃xₙ.φₙ(xₙ)` is equivalent to `⟂`
385+
- Replace the goal `φ(x₀) → ○♢∃z.ψ(x₀,z)` by the set of goals
386+
```
387+
{ ∀zᵢ.∃xᵢ.ψᵢ(xᵢ,zᵢ) ∧ ⌈φ(x₀) ∧ φᵢ(xᵢ)⌉ → ♢∃z.ψ(x₀,z) : 1 ≤ i ≤ n }
388+
```
389+

0 commit comments

Comments
 (0)