Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
L
lambda-rust
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Model registry
Operate
Environments
Monitor
Incidents
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
Michael Sammler
lambda-rust
Commits
a3fb7a8b
Commit
a3fb7a8b
authored
8 years ago
by
Ralf Jung
Browse files
Options
Downloads
Patches
Plain Diff
update sum type definition
parent
57b5f2a3
No related branches found
No related tags found
No related merge requests found
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
theories/typing/sum.v
+70
-54
70 additions, 54 deletions
theories/typing/sum.v
theories/typing/type.v
+2
-1
2 additions, 1 deletion
theories/typing/type.v
with
72 additions
and
55 deletions
theories/typing/sum.v
+
70
−
54
View file @
a3fb7a8b
...
@@ -6,101 +6,117 @@ From lrust.typing Require Import type_incl.
...
@@ -6,101 +6,117 @@ From lrust.typing Require Import type_incl.
Section
sum
.
Section
sum
.
Context
`
{
typeG
Σ
}
.
Context
`
{
typeG
Σ
}
.
Local
Obligation
Tactic
:=
idtac
.
Program
Definition
emp
:
type
:=
{|
st_own
tid
vl
:=
False
%
I
|}
.
Program
Definition
emp
:
type
:=
{|
st_own
tid
vl
:=
False
%
I
|}
.
Next
Obligation
.
iIntros
(
tid
vl
)
"[]"
.
Qed
.
Next
Obligation
.
iIntros
(
tid
vl
)
"[]"
.
Qed
.
Global
Instance
emp_empty
:
Empty
type
:=
emp
.
Global
Instance
emp_empty
:
Empty
type
:=
emp
.
Definition
list_max
(
l
:
list
nat
)
:=
foldr
max
0
%
nat
l
.
Lemma
split_sum_mt
l
tid
q
tyl
:
Lemma
split_sum_mt
l
tid
q
tyl
:
(
l
↦∗
{
q
}:
λ
vl
,
(
l
↦∗
{
q
}:
λ
vl
,
∃
(
i
:
nat
)
vl
'
,
⌜
vl
=
#
i
::
vl
'⌝
∗
ty_own
(
nth
i
tyl
∅
)
tid
vl
'
)
%
I
∃
(
i
:
nat
)
vl
'
vl
''
,
⌜
vl
=
#
i
::
vl
'
++
vl
''⌝
∗
⊣⊢
∃
(
i
:
nat
),
l
↦
{
q
}
#
i
∗
shift_loc
l
1
↦∗
{
q
}:
ty_own
(
nth
i
tyl
∅
)
tid
.
⌜
length
vl
=
S
(
list_max
$
map
ty_size
$
tyl
)
⌝
∗
ty_own
(
nth
i
tyl
∅
)
tid
vl
'
)
%
I
⊣⊢
∃
(
i
:
nat
),
l
↦
{
q
}
#
i
∗
shift_loc
l
1
↦∗
{
q
}:
(
nth
i
tyl
∅
).(
ty_own
)
tid
∗
shift_loc
l
(
S
$
(
nth
i
tyl
∅
).(
ty_size
))
↦∗
{
q
}:
λ
vl
,
⌜
((
nth
i
tyl
∅
).(
ty_size
)
+
length
vl
)
%
nat
=
(
list_max
$
map
ty_size
$
tyl
)
⌝
.
Proof
.
Proof
.
iSplit
;
iIntros
"H"
.
iSplit
;
iIntros
"H"
.
-
iDestruct
"H"
as
(
vl
)
"[Hmt Hown]"
.
iDestruct
"Hown"
as
(
i
vl
'
)
"[%
Hown
]
"
.
-
iDestruct
"H"
as
(
vl
)
"[Hmt Hown]"
.
iDestruct
"Hown"
as
(
i
vl
'
vl
''
)
"(% & % &
Hown
)
"
.
subst
.
iExists
i
.
iDestruct
(
heap_mapsto_vec_cons
with
"Hmt"
)
as
"[$ Hmt]"
.
subst
.
iExists
i
.
iDestruct
(
heap_mapsto_vec_cons
with
"Hmt"
)
as
"[$ Hmt]"
.
iExists
vl
'
.
by
iFrame
.
(
*
TODO
:
I
should
not
have
to
say
'
[#]
'
here
,
similar
to
iDestruct
...
as
%
....
*
)
-
iDestruct
"H"
as
(
i
)
"[Hmt1 Hown]"
.
iDestruct
"Hown"
as
(
vl
)
"[Hmt2 Hown]"
.
iAssert
(
⌜
length
vl
'
=
(
nth
i
tyl
∅
).(
ty_size
)
⌝
%
I
)
with
"[#]"
as
%
Hvl
'
.
iExists
(#
i
::
vl
).
rewrite
heap_mapsto_vec_cons
.
iFrame
.
eauto
.
{
iApply
ty_size_eq
.
done
.
}
iDestruct
(
heap_mapsto_vec_app
with
"Hmt"
)
as
"[Hmt Htail]"
.
iSplitR
"Htail"
.
+
iExists
vl
'
.
by
iFrame
.
+
iExists
vl
''
.
rewrite
(
shift_loc_assoc_nat
_
1
)
Hvl
'
.
iFrame
.
iPureIntro
.
rewrite
-
Hvl
'
.
simpl
in
*
.
rewrite
-
app_length
.
congruence
.
-
iDestruct
"H"
as
(
i
)
"(Hmt1 & Hown & Htail)"
.
iDestruct
"Hown"
as
(
vl
'
)
"[Hmt2 Hown]"
.
iDestruct
"Htail"
as
(
vl
''
)
"[Hmt3 %]"
.
(
*
TODO
:
I
should
not
have
to
say
'
[#]
'
here
,
similar
to
iDestruct
...
as
%
....
*
)
iAssert
(
⌜
length
vl
'
=
(
nth
i
tyl
∅
).(
ty_size
)
⌝
%
I
)
with
"[#]"
as
%
Hvl
'
.
{
iApply
ty_size_eq
.
done
.
}
iExists
(#
i
::
vl
'
++
vl
''
).
rewrite
heap_mapsto_vec_cons
heap_mapsto_vec_app
(
shift_loc_assoc_nat
_
1
)
Hvl
'
.
iFrame
.
iExists
i
,
vl
'
,
vl
''
.
iSplit
;
first
done
.
iFrame
.
iPureIntro
.
simpl
.
f_equal
.
by
rewrite
app_length
Hvl
'
.
Qed
.
Qed
.
Class
LstTySize
(
n
:
nat
)
(
tyl
:
list
type
)
:=
Program
Definition
sum
(
tyl
:
list
type
)
:=
size_eq
:
Forall
((
=
n
)
∘
ty_size
)
tyl
.
{|
ty_size
:=
S
(
list_max
$
map
ty_size
$
tyl
);
Instance
LstTySize_nil
n
:
LstTySize
n
nil
:=
List
.
Forall_nil
_.
Lemma
LstTySize_cons
n
ty
tyl
:
ty
.(
ty_size
)
=
n
→
LstTySize
n
tyl
→
LstTySize
n
(
ty
::
tyl
).
Proof
.
intros
.
constructor
;
done
.
Qed
.
Lemma
sum_size_eq
n
tid
i
tyl
vl
{
Hn
:
LstTySize
n
tyl
}
:
ty_own
(
nth
i
tyl
∅
)
tid
vl
-
∗
⌜
length
vl
=
n
⌝
.
Proof
.
iIntros
"Hown"
.
iDestruct
(
ty_size_eq
with
"Hown"
)
as
%->
.
revert
Hn
.
rewrite
/
LstTySize
List
.
Forall_forall
/=
=>
Hn
.
edestruct
nth_in_or_default
as
[
|
->
].
by
eauto
.
iDestruct
"Hown"
as
"[]"
.
Qed
.
Program
Definition
sum
{
n
}
(
tyl
:
list
type
)
{
_
:
LstTySize
n
tyl
}
:=
{|
ty_size
:=
S
n
;
ty_own
tid
vl
:=
ty_own
tid
vl
:=
(
∃
(
i
:
nat
)
vl
'
,
⌜
vl
=
#
i
::
vl
'⌝
∗
(
nth
i
tyl
∅
).(
ty_own
)
tid
vl
'
)
%
I
;
(
∃
(
i
:
nat
)
vl
'
vl
''
,
⌜
vl
=
#
i
::
vl
'
++
vl
''⌝
∗
⌜
length
vl
=
S
(
list_max
$
map
ty_size
$
tyl
)
⌝
∗
(
nth
i
tyl
∅
).(
ty_own
)
tid
vl
'
)
%
I
;
ty_shr
κ
tid
N
l
:=
ty_shr
κ
tid
N
l
:=
(
∃
(
i
:
nat
),
(
&
frac
{
κ
}
λ
q
,
l
↦
{
q
}
#
i
)
∗
(
∃
(
i
:
nat
),
(
&
frac
{
κ
}
λ
q
,
l
↦
{
q
}
#
i
)
∗
(
nth
i
tyl
∅
).(
ty_shr
)
κ
tid
N
(
shift_loc
l
1
))
%
I
(
nth
i
tyl
∅
).(
ty_shr
)
κ
tid
N
(
shift_loc
l
1
)
∗
(
&
frac
{
κ
}
λ
q
,
shift_loc
l
(
S
$
(
nth
i
tyl
∅
).(
ty_size
))
↦∗
{
q
}:
λ
vl
,
⌜
((
nth
i
tyl
∅
).(
ty_size
)
+
length
vl
)
%
nat
=
(
list_max
$
map
ty_size
$
tyl
)
⌝
))
%
I
|}
.
|}
.
Next
Obligation
.
Next
Obligation
.
iIntros
(
n
tyl
Hn
tid
vl
)
"Hown"
.
iDestruct
"Hown"
as
(
i
vl
'
)
"(%&
Hown
)"
.
iIntros
(
tyl
tid
vl
)
"Hown"
.
iDestruct
"Hown"
as
(
i
vl
'
vl
''
)
"(%&
%&_
)"
.
subst
.
simpl
.
by
iDestruct
(
sum_size_eq
with
"Hown"
)
as
%->
.
subst
.
done
.
Qed
.
Qed
.
Next
Obligation
.
Next
Obligation
.
intros
n
tyl
Hn
E
N
κ
l
tid
??
.
iIntros
"#LFT Hown"
.
rewrite
split_sum_mt
.
intros
tyl
E
N
κ
l
tid
??
.
iIntros
"#LFT Hown"
.
rewrite
split_sum_mt
.
iMod
(
bor_exists
with
"LFT Hown"
)
as
(
i
)
"Hown"
.
set_solver
.
iMod
(
bor_exists
with
"LFT Hown"
)
as
(
i
)
"Hown"
.
set_solver
.
iMod
(
bor_sep
with
"LFT Hown"
)
as
"[Hmt Hown]"
.
set_solver
.
iMod
(
bor_sep
with
"LFT Hown"
)
as
"[Hmt Hown]"
.
solve_ndisj
.
iMod
(
bor_sep
with
"LFT Hown"
)
as
"[Hown Htail]"
.
solve_ndisj
.
iMod
((
nth
i
tyl
∅
).(
ty_share
)
with
"LFT Hown"
)
as
"#Hshr"
;
try
done
.
iMod
((
nth
i
tyl
∅
).(
ty_share
)
with
"LFT Hown"
)
as
"#Hshr"
;
try
done
.
iMod
(
bor_fracture
with
"LFT [-]"
)
as
"H"
;
last
by
eauto
.
set_solver
.
iFrame
.
iMod
(
bor_fracture
with
"LFT [Htail]"
)
as
"H"
;[
set_solver
|
|
];
last
first
.
-
iMod
(
bor_fracture
with
"LFT [Hmt]"
)
as
"H'"
;[
set_solver
|
|
];
last
eauto
.
by
iFrame
.
-
by
iFrame
.
Qed
.
Qed
.
Next
Obligation
.
Next
Obligation
.
intros
n
tyl
Hn
κ
κ'
tid
E
E
'
l
?
.
iIntros
"#LFT #Hord H"
.
intros
tyl
κ
κ'
tid
E
E
'
l
?
.
iIntros
"#LFT #Hord H"
.
iDestruct
"H"
as
(
i
)
"[Hown0 Hown]"
.
iExists
i
.
iSplitL
"Hown0"
.
iDestruct
"H"
as
(
i
)
"[Hown0 [Hown Htail]]"
.
iExists
i
.
by
iApply
(
frac_bor_shorten
with
"Hord"
).
iSplitL
"Hown0"
;
last
iSplitL
"Hown"
.
iApply
((
nth
i
tyl
∅
).(
ty_shr_mono
)
with
"LFT Hord"
);
last
done
.
done
.
-
by
iApply
(
frac_bor_shorten
with
"Hord"
).
-
iApply
((
nth
i
tyl
∅
).(
ty_shr_mono
)
with
"LFT Hord"
);
last
done
.
done
.
-
by
iApply
(
frac_bor_shorten
with
"Hord"
).
Qed
.
Qed
.
(
*
TODO
:
Make
the
Forall
parameter
a
typeclass
*
)
(
*
TODO
:
Make
the
Forall
parameter
a
typeclass
*
)
Global
Program
Instance
sum_copy
`
(
LstTySize
n
tyl
)
:
(
*
TODO
:
This
next
step
is
suspuciously
slow
.
*
)
Global
Program
Instance
sum_copy
tyl
:
Forall
Copy
tyl
→
Copy
(
sum
tyl
).
Forall
Copy
tyl
→
Copy
(
sum
tyl
).
Next
Obligation
.
Next
Obligation
.
intros
n
tyl
Hn
HFA
tid
vl
.
intros
tyl
HFA
tid
vl
.
cut
(
∀
i
vl
'
,
PersistentP
(
ty_own
(
nth
i
tyl
∅
)
tid
vl
'
)).
by
apply
_.
cut
(
∀
i
vl
'
,
PersistentP
(
ty_own
(
nth
i
tyl
∅
)
tid
vl
'
)).
by
apply
_.
intros
.
apply
@
copy_persistent
.
edestruct
nth_in_or_default
as
[
|
->
];
intros
.
apply
@
copy_persistent
.
edestruct
nth_in_or_default
as
[
|
->
];
[
by
eapply
List
.
Forall_forall
|
apply
_
].
[
by
eapply
List
.
Forall_forall
|
apply
_
].
Qed
.
Qed
.
Next
Obligation
.
Next
Obligation
.
intros
n
tyl
Hn
HFA
κ
tid
E
F
l
q
?
.
intros
tyl
HFA
κ
tid
E
F
l
q
?
.
iIntros
"#LFT #H[[Htok1 Htok2] Htl]"
.
iIntros
"#LFT #H[[Htok1
[
Htok2
Htok3]
] Htl]"
.
setoid_rewrite
split_sum_mt
.
iDestruct
"H"
as
(
i
)
"[Hshr0 Hshr]"
.
setoid_rewrite
split_sum_mt
.
iDestruct
"H"
as
(
i
)
"[Hshr0
[
Hshr
Hshrtail]
]"
.
iMod
(
frac_bor_acc
with
"LFT Hshr0 Htok1"
)
as
(
q
'1
)
"[Hown Hclose]"
.
set_solver
.
iMod
(
frac_bor_acc
with
"LFT Hshr0 Htok1"
)
as
(
q
'1
)
"[Hown Hclose]"
.
set_solver
.
iMod
(
@
copy_shr_acc
_
_
(
nth
i
tyl
∅
)
with
"LFT Hshr [Htok2 $Htl]"
)
iMod
(
frac_bor_acc
with
"LFT Hshrtail Htok2"
)
as
(
q
'
2
)
"[Htail Hclose']"
.
set_solver
.
as
(
q
'
2
)
"[Hownq Hclose']"
;
try
done
.
iMod
(
@
copy_shr_acc
_
_
(
nth
i
tyl
∅
)
with
"LFT Hshr [Htok3 $Htl]"
)
as
(
q
'
3
)
"[Hownq Hclose'']"
;
try
done
.
{
edestruct
nth_in_or_default
as
[
|
->
];
last
by
apply
_.
{
edestruct
nth_in_or_default
as
[
|
->
];
last
by
apply
_.
by
eapply
List
.
Forall_forall
.
}
by
eapply
List
.
Forall_forall
.
}
destruct
(
Qp_lower_bound
q
'1
q
'
2
)
as
(
q
'
&
q
'01
&
q
'0
2
&
->
&
->
).
destruct
(
Qp_lower_bound
q
'1
q
'
2
)
as
(
q
'0
&
q
'01
&
q
'0
2
&
->
&
->
).
rewrite
-{
1
}
heap_mapsto_vec_prop_op
;
last
(
by
intros
;
apply
sum_size_eq
,
Hn
).
destruct
(
Qp_lower_bound
q
'0
q
'
3
)
as
(
q
'
&
q
'11
&
q
'1
2
&
->
&
->
).
rewrite
-
(
heap_mapsto_vec_prop_op
_
q
'
q
'1
2
);
last
(
by
intros
;
apply
ty_size_eq
).
rewrite
-!
Qp_plus_assoc
.
rewrite
-
(
heap_mapsto_vec_prop_op
_
q
'
(
q
'11
+
q
'0
2
)
(
list_max
(
map
ty_size
tyl
)
-
(
ty_size
(
nth
i
tyl
∅
)))
%
nat
);
last
first
.
{
intros
.
iIntros
(
<-
).
iPureIntro
.
by
rewrite
minus_plus
.
}
iDestruct
"Hownq"
as
"[Hownq1 Hownq2]"
.
iDestruct
"Hown"
as
"[Hown1 >Hown2]"
.
iDestruct
"Hownq"
as
"[Hownq1 Hownq2]"
.
iDestruct
"Hown"
as
"[Hown1 >Hown2]"
.
iExists
q
'
.
iModIntro
.
iSplitL
"Hown1 Hownq1"
.
iDestruct
"Htail"
as
"[Htail1 Htail2]"
.
iExists
q
'
.
iModIntro
.
iSplitL
"Hown1 Hownq1 Htail1"
.
-
iNext
.
iExists
i
.
by
iFrame
.
-
iNext
.
iExists
i
.
by
iFrame
.
-
iIntros
"H"
.
iDestruct
"H"
as
(
i
'
)
"[>Hown1 Hownq1]"
.
-
iIntros
"H"
.
iDestruct
"H"
as
(
i
'
)
"[>Hown1
[
Hownq1
Htail1]
]"
.
iDestruct
(
heap_mapsto_agree
with
"[$Hown1 $Hown2]"
)
as
%
[
=
->%
Z_of_nat_inj
].
iDestruct
(
heap_mapsto_agree
with
"[$Hown1 $Hown2]"
)
as
%
[
=
->%
Z_of_nat_inj
].
iCombine
"Hown1"
"Hown2"
as
"Hown"
.
iMod
(
"Hclose"
with
"[Hown]"
)
as
"$"
;
first
by
eauto
.
iMod
(
"Hclose''"
with
"[$Hownq1 $Hownq2]"
).
iMod
(
"Hclose'"
with
"[$Htail1 $Htail2]"
).
iCombine
"Hownq1"
"Hownq2"
as
"Hownq"
.
iMod
(
"Hclose"
with
"[$Hown1 $Hown2]"
)
as
"$"
.
by
iFrame
.
rewrite
heap_mapsto_vec_prop_op
;
last
(
by
intros
;
apply
sum_size_eq
,
Hn
).
by
iApply
"Hclose'"
.
Qed
.
Qed
.
End
sum
.
End
sum
.
Existing
Instance
LstTySize_nil
.
Hint
Extern
1
(
LstTySize
_
(
_
::
_
))
=>
apply
LstTySize_cons
;
[
compute
;
reflexivity
|
]
:
typeclass_instances
.
(
*
Σ
is
commonly
used
for
the
current
functor
.
So
it
cannot
be
defined
(
*
Σ
is
commonly
used
for
the
current
functor
.
So
it
cannot
be
defined
as
Π
for
products
.
We
stick
to
the
following
form
.
*
)
as
Π
for
products
.
We
stick
to
the
following
form
.
*
)
Notation
"Σ[ ty1 ; .. ; tyn ]"
:=
Notation
"Σ[ ty1 ; .. ; tyn ]"
:=
...
...
This diff is collapsed.
Click to expand it.
theories/typing/type.v
+
2
−
1
View file @
a3fb7a8b
...
@@ -153,8 +153,9 @@ Section subtyping.
...
@@ -153,8 +153,9 @@ Section subtyping.
iApply
(
type_incl_trans
with
"[] []"
).
iApply
(
type_incl_trans
with
"[] []"
).
+
iApply
(
H12
with
"[] []"
);
done
.
+
iApply
(
H12
with
"[] []"
);
done
.
+
iApply
(
H23
with
"[] []"
);
done
.
+
iApply
(
H23
with
"[] []"
);
done
.
Qed
.
Qed
.
(
*
TODO
:
The
prelude
should
have
a
symmetric
closure
.
*
)
Definition
eqtype
(
ty1
ty2
:
type
)
:
Prop
:=
Definition
eqtype
(
ty1
ty2
:
type
)
:
Prop
:=
subtype
ty1
ty2
∧
subtype
ty2
ty1
.
subtype
ty1
ty2
∧
subtype
ty2
ty1
.
...
...
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