Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
Iris
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package Registry
Model registry
Operate
Terraform modules
Monitor
Service Desk
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Terms and privacy
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Simcha van Collem
Iris
Commits
14ddb52a
Commit
14ddb52a
authored
8 years ago
by
Robbert Krebbers
Browse files
Options
Downloads
Patches
Plain Diff
Simplify definition of WP.
parent
137c80e9
No related branches found
No related tags found
No related merge requests found
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
theories/program_logic/adequacy.v
+5
-6
5 additions, 6 deletions
theories/program_logic/adequacy.v
theories/program_logic/lifting.v
+1
-1
1 addition, 1 deletion
theories/program_logic/lifting.v
theories/program_logic/weakestpre.v
+28
-49
28 additions, 49 deletions
theories/program_logic/weakestpre.v
with
34 additions
and
56 deletions
theories/program_logic/adequacy.v
+
5
−
6
View file @
14ddb52a
...
@@ -72,12 +72,11 @@ Lemma wp_step e1 σ1 e2 σ2 efs Φ :
...
@@ -72,12 +72,11 @@ Lemma wp_step e1 σ1 e2 σ2 efs Φ :
prim_step
e1
σ1
e2
σ2
efs
→
prim_step
e1
σ1
e2
σ2
efs
→
world
σ1
∗
WP
e1
{{
Φ
}}
==∗
▷
|
==>
◇
(
world
σ2
∗
WP
e2
{{
Φ
}}
∗
wptp
efs
)
.
world
σ1
∗
WP
e1
{{
Φ
}}
==∗
▷
|
==>
◇
(
world
σ2
∗
WP
e2
{{
Φ
}}
∗
wptp
efs
)
.
Proof
.
Proof
.
rewrite
{
1
}
wp_unfold
/
wp_pre
.
iIntros
(
Hstep
)
"[(Hw & HE & Hσ) [H|[_ H]]]"
.
rewrite
{
1
}
wp_unfold
/
wp_pre
.
iIntros
(?)
"[(Hw & HE & Hσ) H]"
.
{
iDestruct
"H"
as
(
v
)
"[% _]"
.
apply
val_stuck
in
Hstep
;
simplify_eq
.
}
rewrite
(
val_stuck
e1
σ1
e2
σ2
efs
)
//
fupd_eq
/
fupd_def
.
rewrite
fupd_eq
/
fupd_def
.
iMod
(
"H"
$!
σ1
with
"Hσ [Hw HE]"
)
as
">(Hw & HE & _ & H)"
;
first
by
iFrame
.
iMod
(
"H"
$!
σ1
with
"Hσ [Hw HE]"
)
as
">(Hw & HE & _ & H)"
;
first
by
iFrame
.
iModIntro
;
iNext
.
iModIntro
;
iNext
.
by
iMod
(
"H"
$!
e2
σ2
efs
with
"[%] [$Hw $HE]"
)
as
">($ & $ & $ & $)"
.
iMod
(
"H"
$!
e2
σ2
efs
with
"[%] [$Hw $HE]"
)
as
">($ & $ & $ & $)"
;
auto
.
Qed
.
Qed
.
Lemma
wptp_step
e1
t1
t2
σ1
σ2
Φ
:
Lemma
wptp_step
e1
t1
t2
σ1
σ2
Φ
:
...
@@ -133,8 +132,8 @@ Qed.
...
@@ -133,8 +132,8 @@ Qed.
Lemma
wp_safe
e
σ
Φ
:
Lemma
wp_safe
e
σ
Φ
:
world
σ
∗
WP
e
{{
Φ
}}
==∗
▷
⌜
is_Some
(
to_val
e
)
∨
reducible
e
σ
⌝.
world
σ
∗
WP
e
{{
Φ
}}
==∗
▷
⌜
is_Some
(
to_val
e
)
∨
reducible
e
σ
⌝.
Proof
.
Proof
.
rewrite
wp_unfold
/
wp_pre
.
iIntros
"[(Hw&HE&Hσ)
[H|[_ H]]
]"
.
rewrite
wp_unfold
/
wp_pre
.
iIntros
"[(Hw&HE&Hσ)
H
]"
.
{
iD
estruct
"H"
as
(
v
)
"[% _]"
;
eauto
10
.
}
d
estruct
(
to_val
e
)
as
[
v
|]
eqn
:?
;
[
eauto
10
|]
.
rewrite
fupd_eq
.
iMod
(
"H"
with
"* Hσ [-]"
)
as
">(?&?&%&?)"
;
first
by
iFrame
.
rewrite
fupd_eq
.
iMod
(
"H"
with
"* Hσ [-]"
)
as
">(?&?&%&?)"
;
first
by
iFrame
.
eauto
10
.
eauto
10
.
Qed
.
Qed
.
...
...
This diff is collapsed.
Click to expand it.
theories/program_logic/lifting.v
+
1
−
1
View file @
14ddb52a
...
@@ -18,7 +18,7 @@ Lemma wp_lift_step E Φ e1 :
...
@@ -18,7 +18,7 @@ Lemma wp_lift_step E Φ e1 :
▷
∀
e2
σ2
efs
,
⌜
prim_step
e1
σ1
e2
σ2
efs
⌝
=
{
∅
,
E
}
=∗
▷
∀
e2
σ2
efs
,
⌜
prim_step
e1
σ1
e2
σ2
efs
⌝
=
{
∅
,
E
}
=∗
state_interp
σ2
∗
WP
e2
@
E
{{
Φ
}}
∗
[
∗
list
]
ef
∈
efs
,
WP
ef
{{
_,
True
}})
state_interp
σ2
∗
WP
e2
@
E
{{
Φ
}}
∗
[
∗
list
]
ef
∈
efs
,
WP
ef
{{
_,
True
}})
⊢
WP
e1
@
E
{{
Φ
}}
.
⊢
WP
e1
@
E
{{
Φ
}}
.
Proof
.
iIntros
(?)
"H"
.
rewrite
wp_unfold
/
wp_pre
;
auto
.
Qed
.
Proof
.
by
rewrite
wp_unfold
/
wp_pre
=>
->
.
Qed
.
(** Derived lifting lemmas. *)
(** Derived lifting lemmas. *)
Lemma
wp_lift_pure_step
`{
Inhabited
(
state
Λ
)}
E
Φ
e1
:
Lemma
wp_lift_pure_step
`{
Inhabited
(
state
Λ
)}
E
Φ
e1
:
...
...
This diff is collapsed.
Click to expand it.
theories/program_logic/weakestpre.v
+
28
−
49
View file @
14ddb52a
...
@@ -13,15 +13,15 @@ Notation irisG Λ Σ := (irisG' (state Λ) Σ).
...
@@ -13,15 +13,15 @@ Notation irisG Λ Σ := (irisG' (state Λ) Σ).
Definition
wp_pre
`{
irisG
Λ
Σ
}
Definition
wp_pre
`{
irisG
Λ
Σ
}
(
wp
:
coPset
-
c
>
expr
Λ
-
c
>
(
val
Λ
-
c
>
iProp
Σ
)
-
c
>
iProp
Σ
)
:
(
wp
:
coPset
-
c
>
expr
Λ
-
c
>
(
val
Λ
-
c
>
iProp
Σ
)
-
c
>
iProp
Σ
)
:
coPset
-
c
>
expr
Λ
-
c
>
(
val
Λ
-
c
>
iProp
Σ
)
-
c
>
iProp
Σ
:=
λ
E
e1
Φ
,
(
coPset
-
c
>
expr
Λ
-
c
>
(
val
Λ
-
c
>
iProp
Σ
)
-
c
>
iProp
Σ
:=
λ
E
e1
Φ
,
(* value case *)
match
to_val
e1
with
(
∃
v
,
⌜
to_val
e1
=
Some
v
⌝
∧
|
=
{
E
}=>
Φ
v
)
∨
|
Some
v
=>
|
=
{
E
}=>
Φ
v
(* step case *)
|
None
=>
∀
σ1
,
(
⌜
to_val
e1
=
None
⌝
∧
∀
σ1
,
state_interp
σ1
=
{
E
,
∅
}
=∗
⌜
reducible
e1
σ1
⌝
∗
state_interp
σ1
=
{
E
,
∅
}
=∗
⌜
reducible
e1
σ1
⌝
∗
▷
∀
e2
σ2
efs
,
⌜
prim_step
e1
σ1
e2
σ2
efs
⌝
=
{
∅
,
E
}
=∗
▷
∀
e2
σ2
efs
,
⌜
prim_step
e1
σ1
e2
σ2
efs
⌝
=
{
∅
,
E
}
=∗
state_interp
σ2
∗
wp
E
e2
Φ
∗
state_interp
σ2
∗
wp
E
e2
Φ
∗
[
∗
list
]
ef
∈
efs
,
wp
⊤
ef
(
λ
_,
True
)))
%
I
.
[
∗
list
]
ef
∈
efs
,
wp
⊤
ef
(
λ
_,
True
)
end
%
I
.
Local
Instance
wp_pre_contractive
`{
irisG
Λ
Σ
}
:
Contractive
wp_pre
.
Local
Instance
wp_pre_contractive
`{
irisG
Λ
Σ
}
:
Contractive
wp_pre
.
Proof
.
Proof
.
...
@@ -110,7 +110,7 @@ Proof.
...
@@ -110,7 +110,7 @@ Proof.
(* FIXME: figure out a way to properly automate this proof *)
(* FIXME: figure out a way to properly automate this proof *)
(* FIXME: reflexivity, as being called many times by f_equiv and f_contractive
(* FIXME: reflexivity, as being called many times by f_equiv and f_contractive
is very slow here *)
is very slow here *)
do
1
8
(
f_contractive
||
f_equiv
)
.
apply
IH
;
first
lia
.
do
1
7
(
f_contractive
||
f_equiv
)
.
apply
IH
;
first
lia
.
intros
v
.
eapply
dist_le
;
eauto
with
omega
.
intros
v
.
eapply
dist_le
;
eauto
with
omega
.
Qed
.
Qed
.
Global
Instance
wp_proper
E
e
:
Global
Instance
wp_proper
E
e
:
...
@@ -120,25 +120,17 @@ Proof.
...
@@ -120,25 +120,17 @@ Proof.
Qed
.
Qed
.
Lemma
wp_value'
E
Φ
v
:
Φ
v
⊢
WP
of_val
v
@
E
{{
Φ
}}
.
Lemma
wp_value'
E
Φ
v
:
Φ
v
⊢
WP
of_val
v
@
E
{{
Φ
}}
.
Proof
.
Proof
.
iIntros
"HΦ"
.
rewrite
wp_unfold
/
wp_pre
to_of_val
.
auto
.
Qed
.
iIntros
"HΦ"
.
rewrite
wp_unfold
/
wp_pre
.
iLeft
;
iExists
v
;
rewrite
to_of_val
;
auto
.
Qed
.
Lemma
wp_value_inv
E
Φ
v
:
WP
of_val
v
@
E
{{
Φ
}}
=
{
E
}
=∗
Φ
v
.
Lemma
wp_value_inv
E
Φ
v
:
WP
of_val
v
@
E
{{
Φ
}}
=
{
E
}
=∗
Φ
v
.
Proof
.
Proof
.
by
rewrite
wp_unfold
/
wp_pre
to_of_val
.
Qed
.
rewrite
wp_unfold
/
wp_pre
to_of_val
.
iIntros
"[H|[% _]]"
;
[|
done
]
.
by
iDestruct
"H"
as
(
v'
)
"[% ?]"
;
simplify_eq
.
Qed
.
Lemma
wp_strong_mono
E1
E2
e
Φ
Ψ
:
Lemma
wp_strong_mono
E1
E2
e
Φ
Ψ
:
E1
⊆
E2
→
(
∀
v
,
Φ
v
=
{
E2
}
=∗
Ψ
v
)
∗
WP
e
@
E1
{{
Φ
}}
⊢
WP
e
@
E2
{{
Ψ
}}
.
E1
⊆
E2
→
(
∀
v
,
Φ
v
=
{
E2
}
=∗
Ψ
v
)
∗
WP
e
@
E1
{{
Φ
}}
⊢
WP
e
@
E2
{{
Ψ
}}
.
Proof
.
Proof
.
iIntros
(?)
"[HΦ H]"
.
iLöb
as
"IH"
forall
(
e
)
.
rewrite
!
wp_unfold
/
wp_pre
.
iIntros
(?)
"[HΦ H]"
.
iLöb
as
"IH"
forall
(
e
)
.
rewrite
!
wp_unfold
/
wp_pre
.
iDestruct
"H"
as
"[Hv|[% H]]"
;
[
iLeft
|
iRight
]
.
destruct
(
to_val
e
)
as
[
v
|]
eqn
:?
.
{
iDestruct
"Hv"
as
(
v
)
"[% Hv]"
.
iExists
v
;
iSplit
;
first
done
.
{
iApply
(
"HΦ"
with
">[-]"
)
.
by
iApply
(
fupd_mask_mono
E1
_)
.
}
iApply
(
"HΦ"
with
">[-]"
)
.
by
iApply
(
fupd_mask_mono
E1
_)
.
}
iIntros
(
σ1
)
"Hσ"
.
iMod
(
fupd_intro_mask'
E2
E1
)
as
"Hclose"
;
first
done
.
iSplit
;
[
done
|];
iIntros
(
σ1
)
"Hσ"
.
iMod
(
fupd_intro_mask'
E2
E1
)
as
"Hclose"
;
first
done
.
iMod
(
"H"
$!
σ1
with
"Hσ"
)
as
"[$ H]"
.
iMod
(
"H"
$!
σ1
with
"Hσ"
)
as
"[$ H]"
.
iModIntro
.
iNext
.
iIntros
(
e2
σ2
efs
Hstep
)
.
iModIntro
.
iNext
.
iIntros
(
e2
σ2
efs
Hstep
)
.
iMod
(
"H"
$!
_
σ2
efs
with
"[#]"
)
as
"($ & H & $)"
;
auto
.
iMod
(
"H"
$!
_
σ2
efs
with
"[#]"
)
as
"($ & H & $)"
;
auto
.
...
@@ -148,11 +140,8 @@ Qed.
...
@@ -148,11 +140,8 @@ Qed.
Lemma
fupd_wp
E
e
Φ
:
(|
=
{
E
}=>
WP
e
@
E
{{
Φ
}})
⊢
WP
e
@
E
{{
Φ
}}
.
Lemma
fupd_wp
E
e
Φ
:
(|
=
{
E
}=>
WP
e
@
E
{{
Φ
}})
⊢
WP
e
@
E
{{
Φ
}}
.
Proof
.
Proof
.
rewrite
wp_unfold
/
wp_pre
.
iIntros
"H"
.
destruct
(
to_val
e
)
as
[
v
|]
eqn
:?
.
rewrite
wp_unfold
/
wp_pre
.
iIntros
"H"
.
destruct
(
to_val
e
)
as
[
v
|]
eqn
:?
.
{
iLeft
.
iExists
v
;
iSplit
;
first
done
.
{
by
iMod
"H"
.
}
by
iMod
"H"
as
"[H|[% ?]]"
;
[
iDestruct
"H"
as
(
v'
)
"[% ?]"
|];
simplify_eq
.
}
iIntros
(
σ1
)
"Hσ1"
.
iMod
"H"
.
by
iApply
"H"
.
iRight
;
iSplit
;
[
done
|];
iIntros
(
σ1
)
"Hσ1"
.
iMod
"H"
as
"[H|[% H]]"
;
last
by
iApply
"H"
.
iDestruct
"H"
as
(
v'
)
"[% ?]"
;
simplify_eq
.
Qed
.
Qed
.
Lemma
wp_fupd
E
e
Φ
:
WP
e
@
E
{{
v
,
|
=
{
E
}=>
Φ
v
}}
⊢
WP
e
@
E
{{
Φ
}}
.
Lemma
wp_fupd
E
e
Φ
:
WP
e
@
E
{{
v
,
|
=
{
E
}=>
Φ
v
}}
⊢
WP
e
@
E
{{
Φ
}}
.
Proof
.
iIntros
"H"
.
iApply
(
wp_strong_mono
E
);
try
iFrame
;
auto
.
Qed
.
Proof
.
iIntros
"H"
.
iApply
(
wp_strong_mono
E
);
try
iFrame
;
auto
.
Qed
.
...
@@ -161,32 +150,24 @@ Lemma wp_atomic E1 E2 e Φ :
...
@@ -161,32 +150,24 @@ Lemma wp_atomic E1 E2 e Φ :
atomic
e
→
atomic
e
→
(|
=
{
E1
,
E2
}=>
WP
e
@
E2
{{
v
,
|
=
{
E2
,
E1
}=>
Φ
v
}})
⊢
WP
e
@
E1
{{
Φ
}}
.
(|
=
{
E1
,
E2
}=>
WP
e
@
E2
{{
v
,
|
=
{
E2
,
E1
}=>
Φ
v
}})
⊢
WP
e
@
E1
{{
Φ
}}
.
Proof
.
Proof
.
iIntros
(
Hatomic
)
"H"
.
destruct
(
to_val
e
)
as
[
v
|]
eqn
:
He
.
iIntros
(
Hatomic
)
"H"
.
rewrite
!
wp_unfold
/
wp_pre
.
{
apply
of_to_val
in
He
as
<-.
iApply
wp_fupd
.
iApply
wp_value'
.
destruct
(
to_val
e
)
as
[
v
|]
eqn
:
He
.
iMod
"H"
.
by
iMod
(
wp_value_inv
with
"H"
)
.
}
{
by
iDestruct
"H"
as
">>> $"
.
}
setoid_rewrite
wp_unfold
;
rewrite
/
wp_pre
.
iRight
;
iSplit
;
auto
.
iIntros
(
σ1
)
"Hσ"
.
iMod
"H"
.
iMod
(
"H"
$!
σ1
with
"Hσ"
)
as
"[$ H]"
.
iIntros
(
σ1
)
"Hσ"
.
iMod
"H"
as
"[H|[_ H]]"
.
{
iDestruct
"H"
as
(
v'
)
"[% ?]"
;
simplify_eq
.
}
iMod
(
"H"
$!
σ1
with
"Hσ"
)
as
"[$ H]"
.
iModIntro
.
iNext
.
iIntros
(
e2
σ2
efs
Hstep
)
.
iModIntro
.
iNext
.
iIntros
(
e2
σ2
efs
Hstep
)
.
iMod
(
"H"
with
"* []"
)
as
"(Hphy & H & $)"
;
first
done
.
iMod
(
"H"
with
"* []"
)
as
"(Hphy & H & $)"
;
first
done
.
rewrite
wp_unfold
/
wp_pre
.
iDestruct
"H"
as
"[H|H]"
.
rewrite
!
wp_unfold
/
wp_pre
.
destruct
(
to_val
e2
)
as
[
v2
|]
eqn
:
He2
.
-
iDestruct
"H"
as
(
v
)
"[% >>?]"
.
iModIntro
.
iFrame
.
-
iDestruct
"H"
as
">> $"
.
iFrame
.
eauto
.
rewrite
-
(
of_to_val
e2
v
)
//.
by
iApply
wp_value'
.
-
iMod
(
"H"
with
"* Hphy"
)
as
"[H _]"
.
-
iDestruct
"H"
as
"[_ H]"
.
iDestruct
"H"
as
%
(?
&
?
&
?
&
?)
.
by
edestruct
(
Hatomic
_
_
_
_
Hstep
)
.
iMod
(
"H"
with
"* Hphy"
)
as
"[H _]"
.
iDestruct
"H"
as
%
(?
&
?
&
?
&
?)
.
exfalso
.
by
eapply
(
Hatomic
_
_
_
_
Hstep
)
.
Qed
.
Qed
.
Lemma
wp_fupd_step
E1
E2
e
P
Φ
:
Lemma
wp_fupd_step
E1
E2
e
P
Φ
:
to_val
e
=
None
→
E2
⊆
E1
→
to_val
e
=
None
→
E2
⊆
E1
→
(|
=
{
E1
,
E2
}
▷=>
P
)
-∗
WP
e
@
E2
{{
v
,
P
=
{
E1
}
=∗
Φ
v
}}
-∗
WP
e
@
E1
{{
Φ
}}
.
(|
=
{
E1
,
E2
}
▷=>
P
)
-∗
WP
e
@
E2
{{
v
,
P
=
{
E1
}
=∗
Φ
v
}}
-∗
WP
e
@
E1
{{
Φ
}}
.
Proof
.
Proof
.
rewrite
!
wp_unfold
/
wp_pre
.
iIntros
(??)
"HR [Hv|[_ H]]"
.
rewrite
!
wp_unfold
/
wp_pre
.
iIntros
(
->
?)
"HR H"
.
{
iDestruct
"Hv"
as
(
v
)
"[% Hv]"
;
simplify_eq
.
}
iIntros
(
σ1
)
"Hσ"
.
iMod
"HR"
.
iMod
(
"H"
$!
_
with
"Hσ"
)
as
"[$ H]"
.
iRight
;
iSplit
;
[
done
|]
.
iIntros
(
σ1
)
"Hσ"
.
iMod
"HR"
.
iMod
(
"H"
$!
_
with
"Hσ"
)
as
"[$ H]"
.
iModIntro
;
iNext
;
iIntros
(
e2
σ2
efs
Hstep
)
.
iModIntro
;
iNext
;
iIntros
(
e2
σ2
efs
Hstep
)
.
iMod
(
"H"
$!
e2
σ2
efs
with
"[%]"
)
as
"($ & H & $)"
;
auto
.
iMod
(
"H"
$!
e2
σ2
efs
with
"[%]"
)
as
"($ & H & $)"
;
auto
.
iMod
"HR"
.
iModIntro
.
iApply
(
wp_strong_mono
E2
);
first
done
.
iMod
"HR"
.
iModIntro
.
iApply
(
wp_strong_mono
E2
);
first
done
.
...
@@ -197,12 +178,10 @@ Lemma wp_bind K `{!LanguageCtx Λ K} E e Φ :
...
@@ -197,12 +178,10 @@ Lemma wp_bind K `{!LanguageCtx Λ K} E e Φ :
WP
e
@
E
{{
v
,
WP
K
(
of_val
v
)
@
E
{{
Φ
}}
}}
⊢
WP
K
e
@
E
{{
Φ
}}
.
WP
e
@
E
{{
v
,
WP
K
(
of_val
v
)
@
E
{{
Φ
}}
}}
⊢
WP
K
e
@
E
{{
Φ
}}
.
Proof
.
Proof
.
iIntros
"H"
.
iLöb
as
"IH"
forall
(
E
e
Φ
)
.
rewrite
wp_unfold
/
wp_pre
.
iIntros
"H"
.
iLöb
as
"IH"
forall
(
E
e
Φ
)
.
rewrite
wp_unfold
/
wp_pre
.
iDestruct
"H"
as
"[Hv|[% H]]"
.
destruct
(
to_val
e
)
as
[
v
|]
eqn
:
He
.
{
iDestruct
"Hv"
as
(
v
)
"[Hev Hv]"
;
iDestruct
"Hev"
as
%
<-%
of_to_val
.
{
apply
of_to_val
in
He
as
<-.
by
iApply
fupd_wp
.
}
by
iApply
fupd_wp
.
}
rewrite
wp_unfold
/
wp_pre
fill_not_val
//.
rewrite
wp_unfold
/
wp_pre
.
iRight
;
iSplit
;
eauto
using
fill_not_val
.
iIntros
(
σ1
)
"Hσ"
.
iMod
(
"H"
$!
_
with
"Hσ"
)
as
"[% H]"
.
iModIntro
;
iSplit
.
iIntros
(
σ1
)
"Hσ"
.
iMod
(
"H"
$!
_
with
"Hσ"
)
as
"[% H]"
.
iModIntro
;
iSplit
.
{
iPureIntro
.
unfold
reducible
in
*.
naive_solver
eauto
using
fill_step
.
}
{
iPureIntro
.
unfold
reducible
in
*.
naive_solver
eauto
using
fill_step
.
}
iNext
;
iIntros
(
e2
σ2
efs
Hstep
)
.
iNext
;
iIntros
(
e2
σ2
efs
Hstep
)
.
destruct
(
fill_step_inv
e
σ1
e2
σ2
efs
)
as
(
e2'
&
->
&
?);
auto
.
destruct
(
fill_step_inv
e
σ1
e2
σ2
efs
)
as
(
e2'
&
->
&
?);
auto
.
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment