[2019] | 1 | |
---|
| 2 | include "Clight/Csyntax.ma". |
---|
| 3 | |
---|
| 4 | (* We define a special induction principle for Clight expressions that matches |
---|
| 5 | their execution. *) |
---|
| 6 | |
---|
| 7 | definition is_not_lvalue: expr_descr → Prop ≝ |
---|
| 8 | λe. match e with [ Evar _ ⇒ False | Ederef _ ⇒ False | Efield _ _ ⇒ False | _ ⇒ True ]. |
---|
| 9 | |
---|
| 10 | definition Plvalue ≝ λP:(expr → Prop).λe,ty. |
---|
| 11 | match e return λ_.Prop with [ Evar _ ⇒ P (Expr e ty) | Ederef _ ⇒ P (Expr e ty) | Efield _ _ ⇒ P (Expr e ty) | _ ⇒ True ]. |
---|
| 12 | |
---|
| 13 | let rec expr_lvalue_ind |
---|
| 14 | (P:expr → Prop) |
---|
| 15 | (Q:expr_descr → type → Prop) |
---|
| 16 | (ci:∀sz,ty,i.P (Expr (Econst_int sz i) ty)) |
---|
| 17 | (cf:∀ty,f.P (Expr (Econst_float f) ty)) |
---|
| 18 | (lv:∀e,ty. Q e ty → Plvalue P e ty) |
---|
| 19 | (vr:∀v,ty.Q (Evar v) ty) |
---|
| 20 | (dr:∀e,ty.P e → Q (Ederef e) ty) |
---|
| 21 | (ao:∀ty,e,ty'.Q e ty' → P (Expr (Eaddrof (Expr e ty')) ty)) |
---|
| 22 | (uo:∀ty,op,e.P e → P (Expr (Eunop op e) ty)) |
---|
| 23 | (bo:∀ty,op,e1,e2.P e1 → P e2 → P (Expr (Ebinop op e1 e2) ty)) |
---|
| 24 | (ca:∀ty,ty',e.P e → P (Expr (Ecast ty' e) ty)) |
---|
| 25 | (cd:∀ty,e1,e2,e3.P e1 → P e2 → P e3 → P (Expr (Econdition e1 e2 e3) ty)) |
---|
| 26 | (ab:∀ty,e1,e2.P e1 → P e2 → P (Expr (Eandbool e1 e2) ty)) |
---|
| 27 | (ob:∀ty,e1,e2.P e1 → P e2 → P (Expr (Eorbool e1 e2) ty)) |
---|
| 28 | (sz:∀ty,ty'. P (Expr (Esizeof ty') ty)) |
---|
| 29 | (fl:∀ty,e,ty',i. Q e ty' → Q (Efield (Expr e ty') i) ty) |
---|
| 30 | (co:∀ty,l,e. P e → P (Expr (Ecost l e) ty)) |
---|
| 31 | (xx:∀e,ty. is_not_lvalue e → Q e ty) |
---|
| 32 | (e:expr) on e : P e ≝ |
---|
| 33 | match e with |
---|
| 34 | [ Expr e' ty ⇒ |
---|
| 35 | match e' with |
---|
| 36 | [ Econst_int sz i ⇒ ci sz ty i |
---|
| 37 | | Econst_float f ⇒ cf ty f |
---|
| 38 | | Evar v ⇒ lv (Evar v) ty (vr v ty) |
---|
| 39 | | Ederef e'' ⇒ lv (Ederef e'') ty (dr e'' ty (expr_lvalue_ind P Q ci cf lv vr dr ao uo bo ca cd ab ob sz fl co xx e'')) |
---|
| 40 | | Eaddrof e'' ⇒ match e'' with [ Expr e0 ty0 ⇒ ao ty e0 ty0 (lvalue_expr_ind P Q ci cf lv vr dr ao uo bo ca cd ab ob sz fl co xx e0 ty0) ] |
---|
| 41 | | Eunop op e'' ⇒ uo ty op e'' (expr_lvalue_ind P Q ci cf lv vr dr ao uo bo ca cd ab ob sz fl co xx e'') |
---|
| 42 | | Ebinop op e1 e2 ⇒ bo ty op e1 e2 (expr_lvalue_ind P Q ci cf lv vr dr ao uo bo ca cd ab ob sz fl co xx e1) (expr_lvalue_ind P Q ci cf lv vr dr ao uo bo ca cd ab ob sz fl co xx e2) |
---|
| 43 | | Ecast ty' e'' ⇒ ca ty ty' e'' (expr_lvalue_ind P Q ci cf lv vr dr ao uo bo ca cd ab ob sz fl co xx e'') |
---|
| 44 | | Econdition e1 e2 e3 ⇒ cd ty e1 e2 e3 (expr_lvalue_ind P Q ci cf lv vr dr ao uo bo ca cd ab ob sz fl co xx e1) (expr_lvalue_ind P Q ci cf lv vr dr ao uo bo ca cd ab ob sz fl co xx e2) (expr_lvalue_ind P Q ci cf lv vr dr ao uo bo ca cd ab ob sz fl co xx e3) |
---|
| 45 | | Eandbool e1 e2 ⇒ ab ty e1 e2 (expr_lvalue_ind P Q ci cf lv vr dr ao uo bo ca cd ab ob sz fl co xx e1) (expr_lvalue_ind P Q ci cf lv vr dr ao uo bo ca cd ab ob sz fl co xx e2) |
---|
| 46 | | Eorbool e1 e2 ⇒ ob ty e1 e2 (expr_lvalue_ind P Q ci cf lv vr dr ao uo bo ca cd ab ob sz fl co xx e1) (expr_lvalue_ind P Q ci cf lv vr dr ao uo bo ca cd ab ob sz fl co xx e2) |
---|
| 47 | | Esizeof ty' ⇒ sz ty ty' |
---|
| 48 | | Efield e'' i ⇒ match e'' with [ Expr ef tyf ⇒ lv (Efield (Expr ef tyf) i) ty (fl ty ef tyf i (lvalue_expr_ind P Q ci cf lv vr dr ao uo bo ca cd ab ob sz fl co xx ef tyf)) ] |
---|
| 49 | | Ecost l e'' ⇒ co ty l e'' (expr_lvalue_ind P Q ci cf lv vr dr ao uo bo ca cd ab ob sz fl co xx e'') |
---|
| 50 | ] |
---|
| 51 | ] |
---|
| 52 | and lvalue_expr_ind |
---|
| 53 | (P:expr → Prop) |
---|
| 54 | (Q:expr_descr → type → Prop) |
---|
| 55 | (ci:∀sz,ty,i.P (Expr (Econst_int sz i) ty)) |
---|
| 56 | (cf:∀ty,f.P (Expr (Econst_float f) ty)) |
---|
| 57 | (lv:∀e,ty. Q e ty → Plvalue P e ty) |
---|
| 58 | (vr:∀v,ty.Q (Evar v) ty) |
---|
| 59 | (dr:∀e,ty.P e → Q (Ederef e) ty) |
---|
| 60 | (ao:∀ty,e,ty'.Q e ty' → P (Expr (Eaddrof (Expr e ty')) ty)) |
---|
| 61 | (uo:∀ty,op,e.P e → P (Expr (Eunop op e) ty)) |
---|
| 62 | (bo:∀ty,op,e1,e2.P e1 → P e2 → P (Expr (Ebinop op e1 e2) ty)) |
---|
| 63 | (ca:∀ty,ty',e.P e → P (Expr (Ecast ty' e) ty)) |
---|
| 64 | (cd:∀ty,e1,e2,e3.P e1 → P e2 → P e3 → P (Expr (Econdition e1 e2 e3) ty)) |
---|
| 65 | (ab:∀ty,e1,e2.P e1 → P e2 → P (Expr (Eandbool e1 e2) ty)) |
---|
| 66 | (ob:∀ty,e1,e2.P e1 → P e2 → P (Expr (Eorbool e1 e2) ty)) |
---|
| 67 | (sz:∀ty,ty'. P (Expr (Esizeof ty') ty)) |
---|
| 68 | (fl:∀ty,e,ty',i. Q e ty' → Q (Efield (Expr e ty') i) ty) |
---|
| 69 | (co:∀ty,l,e. P e → P (Expr (Ecost l e) ty)) |
---|
| 70 | (xx:∀e,ty. is_not_lvalue e → Q e ty) |
---|
| 71 | (e:expr_descr) (ty:type) on e : Q e ty ≝ |
---|
| 72 | match e return λe0. Q e0 ty with |
---|
| 73 | [ Evar v ⇒ vr v ty |
---|
| 74 | | Ederef e'' ⇒ dr e'' ty (expr_lvalue_ind P Q ci cf lv vr dr ao uo bo ca cd ab ob sz fl co xx e'') |
---|
| 75 | | Efield e' i ⇒ match e' return λe1.Q (Efield e1 i) ty with [ Expr e'' ty'' ⇒ fl ty e'' ty'' i (lvalue_expr_ind P Q ci cf lv vr dr ao uo bo ca cd ab ob sz fl co xx e'' ty'') ] |
---|
| 76 | | _ ⇒ xx ? ty ? |
---|
| 77 | ]. whd; @I qed. |
---|
| 78 | |
---|
| 79 | definition expr_lvalue_ind_combined ≝ |
---|
| 80 | λP,Q,ci,cf,lv,vr,dr,ao,uo,bo,ca,cd,ab,ob,sz,fl,co,xx. |
---|
| 81 | conj ?? |
---|
| 82 | (expr_lvalue_ind P Q ci cf lv vr dr ao uo bo ca cd ab ob sz fl co xx) |
---|
| 83 | (lvalue_expr_ind P Q ci cf lv vr dr ao uo bo ca cd ab ob sz fl co xx). |
---|