Step
*
of Lemma
C_Struct_vs_DVALp
∀store:C_STOREp(). ∀ctyp:C_TYPE(). ∀env:C_TYPE_env(). ∀dval:C_DVALUEp().
(C_STOREp-welltyped(env;store)
⇒ (↑C_Struct?(ctyp))
⇒ C_TYPE_vs_DVALp(env;ctyp) dval
= if DVp_Struct?(dval)
then let r = map(λp.<fst(p), C_TYPE_vs_DVALp(env;snd(p))>;C_Struct-fields(ctyp)) in
let lbls = DVp_Struct-lbls(dval) in
let g = DVp_Struct-struct(dval) in
(∀p∈r.let a,wt = p
in a ∈b lbls) ∧b (wt (g a)))_b
else ff
fi )
BY
{ ((D 0 THENA Auto)
THEN BLemma `C_TYPE-induction`
THEN Reduce 0
THEN (RepUR ``let`` 0 THEN Auto)
THEN UnfoldAtAddr [2;1] 0⋅
THEN Reduce 0
THEN AutoSplit
THEN Fold `C_TYPE_vs_DVALp` 0
THEN RepUR ``let`` 0
THEN Auto) }
1
1. store : C_STOREp()@i
2. fields : (Atom × C_TYPE()) List@i
3. (∀u∈fields.let u1,u2 = u
in ∀env:C_TYPE_env(). ∀dval:C_DVALUEp().
(C_STOREp-welltyped(env;store)
⇒ (↑C_Struct?(u2))
⇒ C_TYPE_vs_DVALp(env;u2) dval
= if DVp_Struct?(dval)
then (∀p∈map(λp.<fst(p), C_TYPE_vs_DVALp(env;snd(p))>;C_Struct-fields(u2)).
let a,wt = p
in a ∈b DVp_Struct-lbls(dval)) ∧b (wt (DVp_Struct-struct(dval) a)))_b
else ff
fi ))@i
4. env : C_TYPE_env()@i
5. dval : C_DVALUEp()@i
6. C_STOREp-welltyped(env;store)@i
7. True@i
8. ↑DVp_Struct?(dval)
⊢ bdd-all(||fields||;i.eval a = fst(fields[i]) in
a ∈b DVp_Struct-lbls(dval))
∧b (let v2,v3 = fields[i] in C_TYPE_vs_DVALp(env;v3) (DVp_Struct-struct(dval) a)))
= (∀p∈map(λp.<fst(p), C_TYPE_vs_DVALp(env;snd(p))>;fields).let a,wt = p
in a ∈b DVp_Struct-lbls(dval))
∧b (wt (DVp_Struct-struct(dval) a)))_b
Latex:
\mforall{}store:C\_STOREp(). \mforall{}ctyp:C\_TYPE(). \mforall{}env:C\_TYPE\_env(). \mforall{}dval:C\_DVALUEp().
(C\_STOREp-welltyped(env;store)
{}\mRightarrow{} (\muparrow{}C\_Struct?(ctyp))
{}\mRightarrow{} C\_TYPE\_vs\_DVALp(env;ctyp) dval
= if DVp\_Struct?(dval)
then let r = map(\mlambda{}p.<fst(p), C\_TYPE\_vs\_DVALp(env;snd(p))>C\_Struct-fields(ctyp)) in
let lbls = DVp\_Struct-lbls(dval) in
let g = DVp\_Struct-struct(dval) in
(\mforall{}p\mmember{}r.let a,wt = p
in a \mmember{}\msubb{} lbls) \mwedge{}\msubb{} (wt (g a)))\_b
else ff
fi )
By
((D 0 THENA Auto)
THEN BLemma `C\_TYPE-induction`
THEN Reduce 0
THEN (RepUR ``let`` 0 THEN Auto)
THEN UnfoldAtAddr [2;1] 0\mcdot{}
THEN Reduce 0
THEN AutoSplit
THEN Fold `C\_TYPE\_vs\_DVALp` 0
THEN RepUR ``let`` 0
THEN Auto)
Home
Index