Fil-C on Nix

Filnix wiki

the formal campaign

rocq/theories/Sites.v

Where a name is defined, and what definitions_dominate/3 says of its uses (formal.md, Campaign 3; rocq.md, Where a name is defined).

ir.pl reads a function's definitions twice: as the list of definitions single_definitions/3 filters (Validate.v's all_defs), and as the definition sites block_sites//1 records for the strict SSA check (temp_sites). The run-level invariant needs both at once: the relation a single definition states holds wherever its site dominates the running point. This file joins the two through one list of every definition with its site, def_positions.

Decisions

DecisionWhy
positions are sites, the validator's ownsite_dominates/4 is then the order the invariant uses, with no second notion of position
def_positions is a new list, proved equal to all_defs without sitesValidate.v, the transcription the gates compare, stays as it is
a single definition is unique by countingsingle_definitions/3 keeps a name defined once in the list; two positions would be two entries
From Stdlib Require Import String ZArith List Bool Lia
From Nanofil Require Import Term Maps Syntax Cfg Validate Dominance
Import ListNotations
Open Scope Z_scope

Every definition with its site

The definitions the instructions is make in the block labelled l, the first at index j: each name an instruction defines, with its site at the instruction's index and the instruction as its definition.

32Fixpoint inst_positionsl : name j : Z is : listinst : listname × site × def ≔
match is with
[ ]
⇒
[ ]
i :: rest
⇒
mapλdk ⇒ fstdk, SAtl j, DInsti inst_temp_defsi ++ inst_positionsl j + 1 rest

Every definition the block b makes, with its site: its phis at index -1, then its instructions from index 0.

41Definition block_positionsb : block : listname × site × def ≔
map
λ ph  ⇒
match ph with
Phid _ _
⇒
d, SAtb_labelb −1, DPhiph
++

Every definition of the function f with its site: its parameters at SParam, then each block's block_positions. The one list that joins the two ways the validator reads definitions.

48Definition def_positionsf : func : listname × site × def ≔
mapλp ⇒ sndp, SParam, DParam fn_paramsf ++ flat_mapblock_positions fn_blocksf

Forgets the site of a definition, leaving the pair of a name and its definition that all_defs lists.

53Definition drop_sitet : name × site × def : name × def ≔
fstfstt, sndt

Without their sites, the definitions inst_positions lists for some instructions are those all_defs lists for them, whatever the label and first index.

58Lemma inst_positions_defs
∀ l j is
flat_mapλi ⇒ mapλdk ⇒ fstdk, DInsti inst_temp_defsi is = mapdrop_site inst_positionsl j is
Explore proof 6 tactics

Initial goal

⊢
∀l : name j : Z is : listinst, flat_mapλi : inst ⇒ mapλdk : name × class ⇒ fstdk, DInsti inst_temp_defsi is = mapdrop_site inst_positionsl j is

intros l j is

l :
j :
Z
is :
listinst
⊢
flat_mapλi : inst ⇒ mapλdk : name × class ⇒ fstdk, DInsti inst_temp_defsi is = mapdrop_site inst_positionsl j is

revert j

l :
is :
listinst
⊢
∀j : Z, flat_mapλi : inst ⇒ mapλdk : name × class ⇒ fstdk, DInsti inst_temp_defsi is = mapdrop_site inst_positionsl j is

induction is as | i rest IH ; intros j ; reflexivity |

l :
i :
rest :
listinst
IH :
∀j : Z, flat_mapλi : inst ⇒ mapλdk : name × class ⇒ fstdk, DInsti inst_temp_defsi rest = mapdrop_site inst_positionsl j rest
j :
Z
⊢
flat_mapλi0 : inst ⇒ mapλdk : name × class ⇒ fstdk, DInsti0 inst_temp_defsi0 i :: rest = mapdrop_site inst_positionsl j i :: rest

simpl

l :
i :
rest :
listinst
IH :
∀j : Z, flat_mapλi : inst ⇒ mapλdk : name × class ⇒ fstdk, DInsti inst_temp_defsi rest = mapdrop_site inst_positionsl j rest
j :
Z
⊢
mapλdk : name × class ⇒ fstdk, DInsti inst_temp_defsi ++ flat_mapλi0 : inst ⇒ mapλdk : name × class ⇒ fstdk, DInsti0 inst_temp_defsi0 rest = mapdrop_site mapλdk : name × class ⇒ fstdk, SAtl j, DInsti inst_temp_defsi ++ inst_positionsl j + 1 rest

rewrite map_app , IHj + 1 , map_map

l :
i :
rest :
listinst
IH :
∀j : Z, flat_mapλi : inst ⇒ mapλdk : name × class ⇒ fstdk, DInsti inst_temp_defsi rest = mapdrop_site inst_positionsl j rest
j :
Z
⊢
mapλdk : name × class ⇒ fstdk, DInsti inst_temp_defsi ++ mapdrop_site inst_positionsl j + 1 rest = mapλx : name × class ⇒ drop_sitefstx, SAtl j, DInsti inst_temp_defsi ++ mapdrop_site inst_positionsl j + 1 rest

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros l j is
revert j
induction is as | i rest IH ; intros j ; reflexivity |
simpl
rewrite map_app , IHj + 1 , map_map
reflexivity

all_defs, Validate.v's list of every definition that single_definitions/3 filters, is def_positions without the sites.

68Lemma all_defs_positions
Explore proof 14 tactics

Initial goal

⊢

intros f

unfold all_defs , def_positions

f :
⊢
mapλp : class × name ⇒ sndp, DParam fn_paramsf
++
flat_map
λ b : block  ⇒
map
λ ph : phi  ⇒
match ph with
Phid _ _
⇒
d, DPhiph
++
flat_mapλi : inst ⇒ mapλdk : name × class ⇒ fstdk, DInsti inst_temp_defsi b_instsb
=
mapdrop_site mapλp : class × name ⇒ sndp, SParam, DParam fn_paramsf ++ flat_mapblock_positions fn_blocksf

rewrite map_app , map_map

f :
⊢
mapλp : class × name ⇒ sndp, DParam fn_paramsf
++
flat_map
λ b : block  ⇒
map
λ ph : phi  ⇒
match ph with
Phid _ _
⇒
d, DPhiph
++
flat_mapλi : inst ⇒ mapλdk : name × class ⇒ fstdk, DInsti inst_temp_defsi b_instsb
=
mapλx : class × name ⇒ drop_sitesndx, SParam, DParam fn_paramsf ++ mapdrop_site flat_mapblock_positions fn_blocksf

f_equal

f :
⊢
flat_map
λ b : block  ⇒
map
λ ph : phi  ⇒
match ph with
Phid _ _
⇒
d, DPhiph
++
flat_mapλi : inst ⇒ mapλdk : name × class ⇒ fstdk, DInsti inst_temp_defsi b_instsb
=

induction fn_blocksf as | b bs IH ; reflexivity |

f :
bs :
listblock
IH :
flat_map
λ b : block  ⇒
map
λ ph : phi  ⇒
match ph with
Phid _ _
⇒
d, DPhiph
++
flat_mapλi : inst ⇒ mapλdk : name × class ⇒ fstdk, DInsti inst_temp_defsi b_instsb
bs
=
⊢
flat_map
λ b0 : block  ⇒
map
λ ph : phi  ⇒
match ph with
Phid _ _
⇒
d, DPhiph
++
flat_mapλi : inst ⇒ mapλdk : name × class ⇒ fstdk, DInsti inst_temp_defsi b_instsb0
b :: bs
=
mapdrop_site flat_mapblock_positions b :: bs

simpl

f :
bs :
listblock
IH :
flat_map
λ b : block  ⇒
map
λ ph : phi  ⇒
match ph with
Phid _ _
⇒
d, DPhiph
++
flat_mapλi : inst ⇒ mapλdk : name × class ⇒ fstdk, DInsti inst_temp_defsi b_instsb
bs
=
⊢
map
λ ph : phi  ⇒
match ph with
Phid _ _
⇒
d, DPhiph
++
flat_mapλi : inst ⇒ mapλdk : name × class ⇒ fstdk, DInsti inst_temp_defsi b_instsb
++
flat_map
λ b0 : block  ⇒
map
λ ph : phi  ⇒
match ph with
Phid _ _
⇒
d, DPhiph
++
flat_mapλi : inst ⇒ mapλdk : name × class ⇒ fstdk, DInsti inst_temp_defsi b_instsb0
bs
=

rewrite map_app , <- IH

f :
bs :
listblock
IH :
flat_map
λ b : block  ⇒
map
λ ph : phi  ⇒
match ph with
Phid _ _
⇒
d, DPhiph
++
flat_mapλi : inst ⇒ mapλdk : name × class ⇒ fstdk, DInsti inst_temp_defsi b_instsb
bs
=
⊢
map
λ ph : phi  ⇒
match ph with
Phid _ _
⇒
d, DPhiph
++
flat_mapλi : inst ⇒ mapλdk : name × class ⇒ fstdk, DInsti inst_temp_defsi b_instsb
++
flat_map
λ b0 : block  ⇒
map
λ ph : phi  ⇒
match ph with
Phid _ _
⇒
d, DPhiph
++
flat_mapλi : inst ⇒ mapλdk : name × class ⇒ fstdk, DInsti inst_temp_defsi b_instsb0
bs
=
++
flat_map
λ b0 : block  ⇒
map
λ ph : phi  ⇒
match ph with
Phid _ _
⇒
d, DPhiph
++
flat_mapλi : inst ⇒ mapλdk : name × class ⇒ fstdk, DInsti inst_temp_defsi b_instsb0
bs

f_equal

f :
bs :
listblock
IH :
flat_map
λ b : block  ⇒
map
λ ph : phi  ⇒
match ph with
Phid _ _
⇒
d, DPhiph
++
flat_mapλi : inst ⇒ mapλdk : name × class ⇒ fstdk, DInsti inst_temp_defsi b_instsb
bs
=
⊢
map
λ ph : phi  ⇒
match ph with
Phid _ _
⇒
d, DPhiph
++
flat_mapλi : inst ⇒ mapλdk : name × class ⇒ fstdk, DInsti inst_temp_defsi b_instsb
=

unfold block_positions

f :
bs :
listblock
IH :
flat_map
λ b : block  ⇒
map
λ ph : phi  ⇒
match ph with
Phid _ _
⇒
d, DPhiph
++
flat_mapλi : inst ⇒ mapλdk : name × class ⇒ fstdk, DInsti inst_temp_defsi b_instsb
bs
=
⊢
map
λ ph : phi  ⇒
match ph with
Phid _ _
⇒
d, DPhiph
++
flat_mapλi : inst ⇒ mapλdk : name × class ⇒ fstdk, DInsti inst_temp_defsi b_instsb
=
map
λ ph : phi  ⇒
match ph with
Phid _ _
⇒
d, SAtb_labelb −1, DPhiph
++

rewrite map_app , map_map , <- inst_positions_defsb_labelb 0

f :
bs :
listblock
IH :
flat_map
λ b : block  ⇒
map
λ ph : phi  ⇒
match ph with
Phid _ _
⇒
d, DPhiph
++
flat_mapλi : inst ⇒ mapλdk : name × class ⇒ fstdk, DInsti inst_temp_defsi b_instsb
bs
=
⊢
map
λ ph : phi  ⇒
match ph with
Phid _ _
⇒
d, DPhiph
++
flat_mapλi : inst ⇒ mapλdk : name × class ⇒ fstdk, DInsti inst_temp_defsi b_instsb
=
map
λ x : phi  ⇒
match x with
Phid _ _
⇒
d, SAtb_labelb −1, DPhix
++
flat_mapλi : inst ⇒ mapλdk : name × class ⇒ fstdk, DInsti inst_temp_defsi b_instsb

f_equal

f :
bs :
listblock
IH :
flat_map
λ b : block  ⇒
map
λ ph : phi  ⇒
match ph with
Phid _ _
⇒
d, DPhiph
++
flat_mapλi : inst ⇒ mapλdk : name × class ⇒ fstdk, DInsti inst_temp_defsi b_instsb
bs
=
⊢
map
λ ph : phi  ⇒
match ph with
Phid _ _
⇒
d, DPhiph
=
map
λ x : phi  ⇒
match x with
Phid _ _
⇒
d, SAtb_labelb −1, DPhix

apply map_ext

f :
bs :
listblock
IH :
flat_map
λ b : block  ⇒
map
λ ph : phi  ⇒
match ph with
Phid _ _
⇒
d, DPhiph
++
flat_mapλi : inst ⇒ mapλdk : name × class ⇒ fstdk, DInsti inst_temp_defsi b_instsb
bs
=
⊢
∀ a : phi  ,
match a with
Phid _ _
⇒
d, DPhia
=
match a with
Phid _ _
⇒
d, SAtb_labelb −1, DPhia

intros d k pairs

f :
bs :
listblock
IH :
flat_map
λ b : block  ⇒
map
λ ph : phi  ⇒
match ph with
Phid _ _
⇒
d, DPhiph
++
flat_mapλi : inst ⇒ mapλdk : name × class ⇒ fstdk, DInsti inst_temp_defsi b_instsb
bs
=
d :
pairs :
listname × value
⊢
d, DPhiPhid k pairs = drop_sited, SAtb_labelb −1, DPhiPhid k pairs

reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros f
rewrite map_app , map_map
f_equal
induction fn_blocksf as | b bs IH ; reflexivity |
simpl
rewrite map_app , <- IH
f_equal
rewrite map_app , map_map , <- inst_positions_defsb_labelb 0
f_equal
apply map_ext
intros d k pairs
reflexivity

The sites temp_sites records

A map m from each name to sites is sound for the function f when every site it records for a name n is a position of def_positions that defines n.

81Definition sites_okf : func m : nmaplistsite : Prop ≔
∀n ss s, nm_findn m = Somess → Ins ss → ∃d, Inn, s, d def_positionsf

Records the site s for the name n in front of n's list in m, as temp_sites does.

86Definition add_sitem : nmaplistsite n : name s : site : nmaplistsite ≔
s
::
match nm_findn m with
Somess
⇒
ss
None
⇒
[ ]
m

Recording a site s for n keeps the map sound when s is the position of some definition of n in f.

91Lemma add_site_ok
∀ f m n s d
Inn, s, d def_positionsf
Explore proof 10 tactics

Initial goal

⊢
∀f : func m : nmaplistsite n : name s : site d : def, sites_okf m → Inn, s, d def_positionsf → sites_okf add_sitem n s

intros f m n s d Hm Hd k ss s′ E Hin

f :
m :
n :
s :
d :
Hm :
Hd :
Inn, s, d def_positionsf
k :
ss :
listsite
s′ :
E :
nm_findk add_sitem n s = Somess
Hin :
Ins′ ss
⊢
∃d0 : def, Ink, s′, d0 def_positionsf

unfold add_site in E

f :
m :
n :
s :
d :
Hm :
Hd :
Inn, s, d def_positionsf
k :
ss :
listsite
s′ :
E :
s
::
match nm_findn m with
Somess
⇒
ss
None
⇒
[ ]
m
=
Somess
Hin :
Ins′ ss
⊢
∃d0 : def, Ink, s′, d0 def_positionsf

rewrite nm_find_add in E

f :
m :
n :
s :
d :
Hm :
Hd :
Inn, s, d def_positionsf
k :
ss :
listsite
s′ :
E :
→
Some
s
::
match nm_findn m with
Somess
⇒
ss
None
⇒
[ ]
else
=
Somess
Hin :
Ins′ ss
⊢
∃d0 : def, Ink, s′, d0 def_positionsf

destruct name_eqbk n eqn: Ek

2 open

f :
m :
n :
s :
d :
Hm :
Hd :
Inn, s, d def_positionsf
k :
ss :
listsite
s′ :
Ek :
name_eqbk n = true
E :
Some
s
::
match nm_findn m with
Somess
⇒
ss
None
⇒
[ ]
=
Somess
Hin :
Ins′ ss
⊢
∃d0 : def, Ink, s′, d0 def_positionsf
focused goal
f :
m :
n :
s :
d :
Hm :
Hd :
Inn, s, d def_positionsf
k :
ss :
listsite
s′ :
Ek :
name_eqbk n = false
E :
nm_findk m = Somess
Hin :
Ins′ ss
⊢
∃d0 : def, Ink, s′, d0 def_positionsf

–apply name_eqb_true in Ek

2 open

f :
m :
n :
s :
d :
Hm :
Hd :
Inn, s, d def_positionsf
k :
ss :
listsite
s′ :
Ek :
k = n
E :
Some
s
::
match nm_findn m with
Somess
⇒
ss
None
⇒
[ ]
=
Somess
Hin :
Ins′ ss
⊢
∃d0 : def, Ink, s′, d0 def_positionsf
deferred goal
f :
m :
n :
s :
d :
Hm :
Hd :
Inn, s, d def_positionsf
k :
ss :
listsite
s′ :
Ek :
name_eqbk n = false
E :
nm_findk m = Somess
Hin :
Ins′ ss
⊢
∃d0 : def, Ink, s′, d0 def_positionsf

subst k

2 open

f :
m :
n :
s :
d :
Hm :
Hd :
Inn, s, d def_positionsf
ss :
listsite
s′ :
E :
Some
s
::
match nm_findn m with
Somess
⇒
ss
None
⇒
[ ]
=
Somess
Hin :
Ins′ ss
⊢
∃d0 : def, Inn, s′, d0 def_positionsf
deferred goal
f :
m :
n :
s :
d :
Hm :
Hd :
Inn, s, d def_positionsf
k :
ss :
listsite
s′ :
Ek :
name_eqbk n = false
E :
nm_findk m = Somess
Hin :
Ins′ ss
⊢
∃d0 : def, Ink, s′, d0 def_positionsf

injection E as ←

2 open

f :
m :
n :
s :
d :
Hm :
Hd :
Inn, s, d def_positionsf
s′ :
Hin :
Ins′
s
::
match nm_findn m with
Somess
⇒
ss
None
⇒
[ ]
⊢
∃d0 : def, Inn, s′, d0 def_positionsf
deferred goal
f :
m :
n :
s :
d :
Hm :
Hd :
Inn, s, d def_positionsf
k :
ss :
listsite
s′ :
Ek :
name_eqbk n = false
E :
nm_findk m = Somess
Hin :
Ins′ ss
⊢
∃d0 : def, Ink, s′, d0 def_positionsf

destruct Hin as ← | Hin ; eauto |

2 open

f :
m :
n :
s :
d :
Hm :
Hd :
Inn, s, d def_positionsf
s′ :
Hin :
Ins′
match nm_findn m with
Somess
⇒
ss
None
⇒
[ ]
⊢
∃d0 : def, Inn, s′, d0 def_positionsf
deferred goal
f :
m :
n :
s :
d :
Hm :
Hd :
Inn, s, d def_positionsf
k :
ss :
listsite
s′ :
Ek :
name_eqbk n = false
E :
nm_findk m = Somess
Hin :
Ins′ ss
⊢
∃d0 : def, Ink, s′, d0 def_positionsf

destruct nm_findn m as ss0 | eqn: E0 ; exact Hm_ _ _ E0 Hin | destruct Hin

deferred goal
f :
m :
n :
s :
d :
Hm :
Hd :
Inn, s, d def_positionsf
k :
ss :
listsite
s′ :
Ek :
name_eqbk n = false
E :
nm_findk m = Somess
Hin :
Ins′ ss
⊢
∃d0 : def, Ink, s′, d0 def_positionsf

–exact Hm_ _ _ E Hin

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros f m n s d Hm Hd k ss s′ E Hin
unfold add_site in E
rewrite nm_find_add in E
destruct name_eqbk n eqn: Ek
–apply name_eqb_true in Ek
subst k
injection E as ←
destruct Hin as ← | Hin ; eauto |
destruct nm_findn m as ss0 | eqn: E0 ; exact Hm_ _ _ E0 Hin | destruct Hin
–exact Hm_ _ _ E Hin

Recording a list of sites, the name and site g gives each element of xs, keeps the map sound when each is the position of some definition in f.

103Lemma fold_sites_ok
∀ A : Type f g : A → name × site xs m
∀x, Inx xs → ∃d, Infstgx, sndgx, d def_positionsf
sites_okf fold_leftλm x ⇒ add_sitem fstgx sndgx xs m
Explore proof 6 tactics

Initial goal

⊢
∀A : Type f : func g : A → name × site xs : listA m : nmaplistsite, sites_okf m → ∀x : A, Inx xs → ∃d : def, Infstgx, sndgx, d def_positionsf → sites_okf fold_leftλm0 : nmaplistsite x : A ⇒ add_sitem0 fstgx sndgx xs m

intros A f g xs

A :
Type
f :
g :
A → name × site
xs :
listA
⊢
∀m : nmaplistsite, sites_okf m → ∀x : A, Inx xs → ∃d : def, Infstgx, sndgx, d def_positionsf → sites_okf fold_leftλm0 : nmaplistsite x : A ⇒ add_sitem0 fstgx sndgx xs m

induction xs as | x xs IH ; intros m Hm Hx ; exact Hm |

A :
Type
f :
g :
A → name × site
x :
A
xs :
listA
IH :
∀m : nmaplistsite, sites_okf m → ∀x : A, Inx xs → ∃d : def, Infstgx, sndgx, d def_positionsf → sites_okf fold_leftλm0 : nmaplistsite x : A ⇒ add_sitem0 fstgx sndgx xs m
m :
Hm :
Hx :
∀x0 : A, Inx0 x :: xs → ∃d : def, Infstgx0, sndgx0, d def_positionsf
⊢
sites_okf fold_leftλm0 : nmaplistsite x0 : A ⇒ add_sitem0 fstgx0 sndgx0 x :: xs m

simpl

A :
Type
f :
g :
A → name × site
x :
A
xs :
listA
IH :
∀m : nmaplistsite, sites_okf m → ∀x : A, Inx xs → ∃d : def, Infstgx, sndgx, d def_positionsf → sites_okf fold_leftλm0 : nmaplistsite x : A ⇒ add_sitem0 fstgx sndgx xs m
m :
Hm :
Hx :
∀x0 : A, Inx0 x :: xs → ∃d : def, Infstgx0, sndgx0, d def_positionsf
⊢
sites_okf fold_leftλm0 : nmaplistsite x0 : A ⇒ add_sitem0 fstgx0 sndgx0 xs add_sitem fstgx sndgx

apply IH ; | intros y Hy ; apply Hx ; right ; exact Hy

A :
Type
f :
g :
A → name × site
x :
A
xs :
listA
IH :
∀m : nmaplistsite, sites_okf m → ∀x : A, Inx xs → ∃d : def, Infstgx, sndgx, d def_positionsf → sites_okf fold_leftλm0 : nmaplistsite x : A ⇒ add_sitem0 fstgx sndgx xs m
m :
Hm :
Hx :
∀x0 : A, Inx0 x :: xs → ∃d : def, Infstgx0, sndgx0, d def_positionsf
⊢
sites_okf add_sitem fstgx sndgx

destruct Hxx or_introleq_refl as d Hd

A :
Type
f :
g :
A → name × site
x :
A
xs :
listA
IH :
∀m : nmaplistsite, sites_okf m → ∀x : A, Inx xs → ∃d : def, Infstgx, sndgx, d def_positionsf → sites_okf fold_leftλm0 : nmaplistsite x : A ⇒ add_sitem0 fstgx sndgx xs m
m :
Hm :
Hx :
∀x0 : A, Inx0 x :: xs → ∃d : def, Infstgx0, sndgx0, d def_positionsf
d :
Hd :
Infstgx, sndgx, d def_positionsf
⊢
sites_okf add_sitem fstgx sndgx

exact add_site_ok_ _ _ _ _ Hm Hd

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros A f g xs
induction xs as | x xs IH ; intros m Hm Hx ; exact Hm |
simpl
apply IH ; | intros y Hy ; apply Hx ; right ; exact Hy
destruct Hxx or_introleq_refl as d Hd
exact add_site_ok_ _ _ _ _ Hm Hd

The fold temp_sites makes over the instructions is of the block labelled l, from index j, keeps the map sound when every position inst_positions lists for them is one of f's.

115Lemma inst_fold_sites_ok
∀ f l is j m
∀t, Int inst_positionsl j is → Int def_positionsf
fst
fold_left
λ acc : nmaplistsite × Z ins  ⇒
let m, j ≔ acc in
fold_leftλm dk ⇒ add_sitem fstdk SAtl j inst_temp_defsins m, j + 1
is
m, j
Explore proof 14 tactics

Initial goal

⊢
∀ f : func l : name is : listinst j : Z m : nmaplistsite  ,
→
∀t : name × site × def, Int inst_positionsl j is → Int def_positionsf
→
fst
fold_left
λ acc : nmaplistsite × Z ins : inst  ⇒
let m0, j0 ≔ acc in
fold_leftλm1 : nmaplistsite dk : name × class ⇒ add_sitem1 fstdk SAtl j0 inst_temp_defsins m0, j0 + 1
is
m, j

intros f l is

f :
l :
is :
listinst
⊢
∀ j : Z m : nmaplistsite  ,
→
∀t : name × site × def, Int inst_positionsl j is → Int def_positionsf
→
fst
fold_left
λ acc : nmaplistsite × Z ins : inst  ⇒
let m0, j0 ≔ acc in
fold_leftλm1 : nmaplistsite dk : name × class ⇒ add_sitem1 fstdk SAtl j0 inst_temp_defsins m0, j0 + 1
is
m, j

induction is as | i rest IH ; intros j m Hm Hp ; exact Hm |

f :
l :
i :
rest :
listinst
IH :
∀ j : Z m : nmaplistsite  ,
→
∀t : name × site × def, Int inst_positionsl j rest → Int def_positionsf
→
fst
fold_left
λ acc : nmaplistsite × Z ins : inst  ⇒
let m0, j0 ≔ acc in
fold_leftλm1 : nmaplistsite dk : name × class ⇒ add_sitem1 fstdk SAtl j0 inst_temp_defsins m0, j0 + 1
rest
m, j
j :
Z
m :
Hm :
Hp :
∀t : name × site × def, Int inst_positionsl j i :: rest → Int def_positionsf
⊢
fst
fold_left
λ acc : nmaplistsite × Z ins : inst  ⇒
let m0, j0 ≔ acc in
fold_leftλm1 : nmaplistsite dk : name × class ⇒ add_sitem1 fstdk SAtl j0 inst_temp_defsins m0, j0 + 1
i :: rest
m, j

simpl

f :
l :
i :
rest :
listinst
IH :
∀ j : Z m : nmaplistsite  ,
→
∀t : name × site × def, Int inst_positionsl j rest → Int def_positionsf
→
fst
fold_left
λ acc : nmaplistsite × Z ins : inst  ⇒
let m0, j0 ≔ acc in
fold_leftλm1 : nmaplistsite dk : name × class ⇒ add_sitem1 fstdk SAtl j0 inst_temp_defsins m0, j0 + 1
rest
m, j
j :
Z
m :
Hm :
Hp :
∀t : name × site × def, Int inst_positionsl j i :: rest → Int def_positionsf
⊢
fst
fold_left
λ acc : nmaplistsite × Z ins : inst  ⇒
let m0, j0 ≔ acc in
fold_leftλm1 : nmaplistsite dk : name × class ⇒ add_sitem1 fstdk SAtl j0 inst_temp_defsins m0, j0 + 1
rest
fold_leftλm0 : nmaplistsite dk : name × class ⇒ add_sitem0 fstdk SAtl j inst_temp_defsi m, j + 1

apply IH ; | intros t Ht ; apply Hp ; simpl ; apply in_or_app ; right ; exact Ht

f :
l :
i :
rest :
listinst
IH :
∀ j : Z m : nmaplistsite  ,
→
∀t : name × site × def, Int inst_positionsl j rest → Int def_positionsf
→
fst
fold_left
λ acc : nmaplistsite × Z ins : inst  ⇒
let m0, j0 ≔ acc in
fold_leftλm1 : nmaplistsite dk : name × class ⇒ add_sitem1 fstdk SAtl j0 inst_temp_defsins m0, j0 + 1
rest
m, j
j :
Z
m :
Hm :
Hp :
∀t : name × site × def, Int inst_positionsl j i :: rest → Int def_positionsf
⊢
sites_okf fold_leftλm0 : nmaplistsite dk : name × class ⇒ add_sitem0 fstdk SAtl j inst_temp_defsi m

apply fold_sites_ok_ f λdk ⇒ fstdk, SAtl j ; exact Hm |

f :
l :
i :
rest :
listinst
IH :
∀ j : Z m : nmaplistsite  ,
→
∀t : name × site × def, Int inst_positionsl j rest → Int def_positionsf
→
fst
fold_left
λ acc : nmaplistsite × Z ins : inst  ⇒
let m0, j0 ≔ acc in
fold_leftλm1 : nmaplistsite dk : name × class ⇒ add_sitem1 fstdk SAtl j0 inst_temp_defsins m0, j0 + 1
rest
m, j
j :
Z
m :
Hm :
Hp :
∀t : name × site × def, Int inst_positionsl j i :: rest → Int def_positionsf
⊢
∀x : name × class, Inx inst_temp_defsi → ∃d : def, Infstfstx, SAtl j, sndfstx, SAtl j, d def_positionsf

intros dk Hdk

f :
l :
i :
rest :
listinst
IH :
∀ j : Z m : nmaplistsite  ,
→
∀t : name × site × def, Int inst_positionsl j rest → Int def_positionsf
→
fst
fold_left
λ acc : nmaplistsite × Z ins : inst  ⇒
let m0, j0 ≔ acc in
fold_leftλm1 : nmaplistsite dk : name × class ⇒ add_sitem1 fstdk SAtl j0 inst_temp_defsins m0, j0 + 1
rest
m, j
j :
Z
m :
Hm :
Hp :
∀t : name × site × def, Int inst_positionsl j i :: rest → Int def_positionsf
dk :
Hdk :
⊢
∃d : def, Infstfstdk, SAtl j, sndfstdk, SAtl j, d def_positionsf

exists DInsti

f :
l :
i :
rest :
listinst
IH :
∀ j : Z m : nmaplistsite  ,
→
∀t : name × site × def, Int inst_positionsl j rest → Int def_positionsf
→
fst
fold_left
λ acc : nmaplistsite × Z ins : inst  ⇒
let m0, j0 ≔ acc in
fold_leftλm1 : nmaplistsite dk : name × class ⇒ add_sitem1 fstdk SAtl j0 inst_temp_defsins m0, j0 + 1
rest
m, j
j :
Z
m :
Hm :
Hp :
∀t : name × site × def, Int inst_positionsl j i :: rest → Int def_positionsf
dk :
Hdk :
⊢
Infstfstdk, SAtl j, sndfstdk, SAtl j, DInsti def_positionsf

apply Hp

f :
l :
i :
rest :
listinst
IH :
∀ j : Z m : nmaplistsite  ,
→
∀t : name × site × def, Int inst_positionsl j rest → Int def_positionsf
→
fst
fold_left
λ acc : nmaplistsite × Z ins : inst  ⇒
let m0, j0 ≔ acc in
fold_leftλm1 : nmaplistsite dk : name × class ⇒ add_sitem1 fstdk SAtl j0 inst_temp_defsins m0, j0 + 1
rest
m, j
j :
Z
m :
Hm :
Hp :
∀t : name × site × def, Int inst_positionsl j i :: rest → Int def_positionsf
dk :
Hdk :
⊢
Infstfstdk, SAtl j, sndfstdk, SAtl j, DInsti inst_positionsl j i :: rest

simpl

f :
l :
i :
rest :
listinst
IH :
∀ j : Z m : nmaplistsite  ,
→
∀t : name × site × def, Int inst_positionsl j rest → Int def_positionsf
→
fst
fold_left
λ acc : nmaplistsite × Z ins : inst  ⇒
let m0, j0 ≔ acc in
fold_leftλm1 : nmaplistsite dk : name × class ⇒ add_sitem1 fstdk SAtl j0 inst_temp_defsins m0, j0 + 1
rest
m, j
j :
Z
m :
Hm :
Hp :
∀t : name × site × def, Int inst_positionsl j i :: rest → Int def_positionsf
dk :
Hdk :
⊢
Infstdk, SAtl j, DInsti mapλdk0 : name × class ⇒ fstdk0, SAtl j, DInsti inst_temp_defsi ++ inst_positionsl j + 1 rest

apply in_or_app

f :
l :
i :
rest :
listinst
IH :
∀ j : Z m : nmaplistsite  ,
→
∀t : name × site × def, Int inst_positionsl j rest → Int def_positionsf
→
fst
fold_left
λ acc : nmaplistsite × Z ins : inst  ⇒
let m0, j0 ≔ acc in
fold_leftλm1 : nmaplistsite dk : name × class ⇒ add_sitem1 fstdk SAtl j0 inst_temp_defsins m0, j0 + 1
rest
m, j
j :
Z
m :
Hm :
Hp :
∀t : name × site × def, Int inst_positionsl j i :: rest → Int def_positionsf
dk :
Hdk :
⊢
Infstdk, SAtl j, DInsti mapλdk0 : name × class ⇒ fstdk0, SAtl j, DInsti inst_temp_defsi ∨ Infstdk, SAtl j, DInsti inst_positionsl j + 1 rest

left

f :
l :
i :
rest :
listinst
IH :
∀ j : Z m : nmaplistsite  ,
→
∀t : name × site × def, Int inst_positionsl j rest → Int def_positionsf
→
fst
fold_left
λ acc : nmaplistsite × Z ins : inst  ⇒
let m0, j0 ≔ acc in
fold_leftλm1 : nmaplistsite dk : name × class ⇒ add_sitem1 fstdk SAtl j0 inst_temp_defsins m0, j0 + 1
rest
m, j
j :
Z
m :
Hm :
Hp :
∀t : name × site × def, Int inst_positionsl j i :: rest → Int def_positionsf
dk :
Hdk :
⊢
Infstdk, SAtl j, DInsti mapλdk0 : name × class ⇒ fstdk0, SAtl j, DInsti inst_temp_defsi

apply in_map_iff

f :
l :
i :
rest :
listinst
IH :
∀ j : Z m : nmaplistsite  ,
→
∀t : name × site × def, Int inst_positionsl j rest → Int def_positionsf
→
fst
fold_left
λ acc : nmaplistsite × Z ins : inst  ⇒
let m0, j0 ≔ acc in
fold_leftλm1 : nmaplistsite dk : name × class ⇒ add_sitem1 fstdk SAtl j0 inst_temp_defsins m0, j0 + 1
rest
m, j
j :
Z
m :
Hm :
Hp :
∀t : name × site × def, Int inst_positionsl j i :: rest → Int def_positionsf
dk :
Hdk :
⊢
∃x : name × class, fstx, SAtl j, DInsti = fstdk, SAtl j, DInsti ∧ Inx inst_temp_defsi

exists dk

f :
l :
i :
rest :
listinst
IH :
∀ j : Z m : nmaplistsite  ,
→
∀t : name × site × def, Int inst_positionsl j rest → Int def_positionsf
→
fst
fold_left
λ acc : nmaplistsite × Z ins : inst  ⇒
let m0, j0 ≔ acc in
fold_leftλm1 : nmaplistsite dk : name × class ⇒ add_sitem1 fstdk SAtl j0 inst_temp_defsins m0, j0 + 1
rest
m, j
j :
Z
m :
Hm :
Hp :
∀t : name × site × def, Int inst_positionsl j i :: rest → Int def_positionsf
dk :
Hdk :
⊢
fstdk, SAtl j, DInsti = fstdk, SAtl j, DInsti ∧ Indk inst_temp_defsi

auto

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros f l is
induction is as | i rest IH ; intros j m Hm Hp ; exact Hm |
simpl
apply IH ; | intros t Ht ; apply Hp ; simpl ; apply in_or_app ; right ; exact Ht
apply fold_sites_ok_ f λdk ⇒ fstdk, SAtl j ; exact Hm |
intros dk Hdk
exists DInsti
apply Hp
simpl
apply in_or_app
left
apply in_map_iff
exists dk
auto

Every site block_sites//1 records for a name n in temp_sites, the sites the validator's strict SSA check reads, is a position of def_positions that defines n.

132Theorem temp_sites_sound
∀ f n ss s
nm_findn temp_sitesf = Somess
Ins ss
∃d, Inn, s, d def_positionsf
Proof 46 steps Qed
intros f
unfold temp_sites
assert Hp : sites_okf fold_leftλm p ⇒ add_sitem sndp SParam fn_paramsf nm_empty
{apply fold_sites_ok_ f λp ⇒ sndp, SParam
–intros n ss s E
rewrite nm_find_empty in E
discriminate E
–intros p Hp
exists DParam
apply in_or_app
left
apply in_map_iff
exists p
auto
assert Hb : ∀bs m, sites_okf m → ∀b, Inb bs → Inb fn_blocksf → sites_okf fold_leftλm b ⇒ let m1 ≔ fold_leftλm ph ⇒ match ph with Phid _ _ ⇒ add_sitem d SAtb_labelb −1 end b_phisb m in fstfold_leftλacc : nmaplistsite × Z ins ⇒ let m, j ≔ acc in fold_leftλm dk ⇒ add_sitem fstdk SAtb_labelb j inst_temp_defsins m, j + 1 b_instsb m1, 0 bs m
{intros bs
induction bs as | b bs IH ; intros m Hm Hin ; exact Hm |
simpl
apply IH ; | intros b′ Hb′ ; apply Hin ; right ; exact Hb'
assert Hpos : ∀t, Int block_positionsb → Int def_positionsf
{intros t Ht
apply in_or_app
right
apply in_flat_map
exists b
split ; apply Hin ; left ; reflexivity | exact Ht
apply inst_fold_sites_ok ; | intros t Ht ; apply Hpos ; unfold block_positions ; apply in_or_app ; right ; exact Ht
assert Hph : ∀xs m0, sites_okf m0 → ∀ph, Inph xs → Inph b_phisb → sites_okf fold_leftλm ph ⇒ match ph with Phid _ _ ⇒ add_sitem d SAtb_labelb −1 end xs m0
{intros xs
induction xs as | d k pairs xs IHx ; intros m0 Hm0 Hx ; exact Hm0 |
simpl
apply IHx ; | intros ph Hph ; apply Hx ; right ; exact Hph
apply add_site_ok_ _ _ _ DPhiPhid k pairs Hm0
apply Hpos
apply in_or_app
left
apply in_map_iff
exists Phid k pairs
split ; reflexivity | apply Hx ; left ; reflexivity
exact Hph_ _ Hm λph H ⇒ H
intros n ss s E Hin
exact Hb_ _ Hp λb H ⇒ H n ss s E Hin

A single definition has one position

Filtering a mapped list keeps as many elements as filtering the list by the test composed with the map.

171Lemma filter_map_length
∀ A B : Type p : B → bool g : A → B l
lengthfilterp mapg l = lengthfilterλx ⇒ pgx l
Explore proof 3 tactics

Initial goal

⊢
∀A B : Type p : B → bool g : A → B l : listA, Datatypes.lengthfilterp mapg l = Datatypes.lengthfilterλx : A ⇒ pgx l

intros A B p g l

A :
Type
B :
Type
p :
B → bool
g :
A → B
l :
listA
⊢
Datatypes.lengthfilterp mapg l = Datatypes.lengthfilterλx : A ⇒ pgx l

induction l as | x l IH ; simpl ; reflexivity |

A :
Type
B :
Type
p :
B → bool
g :
A → B
x :
A
l :
listA
IH :
Datatypes.lengthfilterp mapg l = Datatypes.lengthfilterλx : A ⇒ pgx l
⊢
Datatypes.length
pgx
→
gx :: filterp mapg l
else
filterp mapg l
=
Datatypes.length
pgx
→
x :: filterλx0 : A ⇒ pgx0 l
else
filterλx0 : A ⇒ pgx0 l

destruct pgx ; simpl ; auto

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros A B p g l
induction l as | x l IH ; simpl ; reflexivity |
destruct pgx ; simpl ; auto

A name n that single_definitions/3 keeps, with its definition d, has exactly one position in def_positions, and that position holds d.

177Theorem once_position
∀ f n d
∃s, Inn, s, d def_positionsf ∧ ∀s′ d′, Inn, s′, d′ def_positionsf → s′ = s ∧ d′ = d
Explore proof 32 tactics

Initial goal

⊢
∀f : func n : name d : def, lookupn single_definitionsf = Somed → ∃s : site, Inn, s, d def_positionsf ∧ ∀s′ : site d′ : def, Inn, s′, d′ def_positionsf → s′ = s ∧ d′ = d

intros f n d H

f :
n :
d :
⊢
∃s : site, Inn, s, d def_positionsf ∧ ∀s′ : site d′ : def, Inn, s′, d′ def_positionsf → s′ = s ∧ d′ = d

destruct lookup_some_in_ _ _ _ H as n′ & En & Hin

f :
n :
d :
n′ :
En :
name_eqbn n′ = true
Hin :
⊢
∃s : site, Inn, s, d def_positionsf ∧ ∀s′ : site d′ : def, Inn, s′, d′ def_positionsf → s′ = s ∧ d′ = d

apply name_eqb_true in En

f :
n :
d :
n′ :
En :
n = n′
Hin :
⊢
∃s : site, Inn, s, d def_positionsf ∧ ∀s′ : site d′ : def, Inn, s′, d′ def_positionsf → s′ = s ∧ d′ = d

subst n′

f :
n :
d :
Hin :
⊢
∃s : site, Inn, s, d def_positionsf ∧ ∀s′ : site d′ : def, Inn, s′, d′ def_positionsf → s′ = s ∧ d′ = d

unfold single_definitions in Hin

f :
n :
d :
Hin :
Inn, d filterλd : name × def ⇒ Datatypes.lengthfilterλd′ : name × def ⇒ name_eqbfstd fstd′ all_defsf =? 1%nat all_defsf
⊢
∃s : site, Inn, s, d def_positionsf ∧ ∀s′ : site d′ : def, Inn, s′, d′ def_positionsf → s′ = s ∧ d′ = d

apply filter_In in Hin as Hall Hcount

f :
n :
d :
Hall :
Inn, d all_defsf
Hcount :
Datatypes.lengthfilterλd′ : name × def ⇒ name_eqbfstn, d fstd′ all_defsf =? 1%nat = true
⊢
∃s : site, Inn, s, d def_positionsf ∧ ∀s′ : site d′ : def, Inn, s′, d′ def_positionsf → s′ = s ∧ d′ = d

apply Nat.eqb_eq in Hcount

f :
n :
d :
Hall :
Inn, d all_defsf
Hcount :
Datatypes.lengthfilterλd′ : name × def ⇒ name_eqbfstn, d fstd′ all_defsf = 1%nat
⊢
∃s : site, Inn, s, d def_positionsf ∧ ∀s′ : site d′ : def, Inn, s′, d′ def_positionsf → s′ = s ∧ d′ = d

simpl in Hcount

f :
n :
d :
Hall :
Inn, d all_defsf
Hcount :
Datatypes.lengthfilterλd′ : name × def ⇒ name_eqbn fstd′ all_defsf = 1%nat
⊢
∃s : site, Inn, s, d def_positionsf ∧ ∀s′ : site d′ : def, Inn, s′, d′ def_positionsf → s′ = s ∧ d′ = d

rewrite all_defs_positions in Hall , Hcount

f :
n :
d :
Hall :
Hcount :
Datatypes.lengthfilterλd′ : name × def ⇒ name_eqbn fstd′ mapdrop_site def_positionsf = 1%nat
⊢
∃s : site, Inn, s, d def_positionsf ∧ ∀s′ : site d′ : def, Inn, s′, d′ def_positionsf → s′ = s ∧ d′ = d

rewrite filter_map_length in Hcount

f :
n :
d :
Hall :
Hcount :
Datatypes.lengthfilterλx : name × site × def ⇒ name_eqbn fstdrop_sitex def_positionsf = 1%nat
⊢
∃s : site, Inn, s, d def_positionsf ∧ ∀s′ : site d′ : def, Inn, s′, d′ def_positionsf → s′ = s ∧ d′ = d

apply in_map_iff in Hall as n0 s d0 & Ed & Hs

f :
n :
d :
n0 :
s :
d0 :
Ed :
drop_siten0, s, d0 = n, d
Hs :
Inn0, s, d0 def_positionsf
Hcount :
Datatypes.lengthfilterλx : name × site × def ⇒ name_eqbn fstdrop_sitex def_positionsf = 1%nat
⊢
∃s0 : site, Inn, s0, d def_positionsf ∧ ∀s′ : site d′ : def, Inn, s′, d′ def_positionsf → s′ = s0 ∧ d′ = d

unfold drop_site in Ed

f :
n :
d :
n0 :
s :
d0 :
Ed :
fstfstn0, s, d0, sndn0, s, d0 = n, d
Hs :
Inn0, s, d0 def_positionsf
Hcount :
Datatypes.lengthfilterλx : name × site × def ⇒ name_eqbn fstdrop_sitex def_positionsf = 1%nat
⊢
∃s0 : site, Inn, s0, d def_positionsf ∧ ∀s′ : site d′ : def, Inn, s′, d′ def_positionsf → s′ = s0 ∧ d′ = d

simpl in Ed

f :
n :
d :
n0 :
s :
d0 :
Ed :
n0, d0 = n, d
Hs :
Inn0, s, d0 def_positionsf
Hcount :
Datatypes.lengthfilterλx : name × site × def ⇒ name_eqbn fstdrop_sitex def_positionsf = 1%nat
⊢
∃s0 : site, Inn, s0, d def_positionsf ∧ ∀s′ : site d′ : def, Inn, s′, d′ def_positionsf → s′ = s0 ∧ d′ = d

injection Ed as → →

f :
n :
d :
s :
Hs :
Inn, s, d def_positionsf
Hcount :
Datatypes.lengthfilterλx : name × site × def ⇒ name_eqbn fstdrop_sitex def_positionsf = 1%nat
⊢
∃s0 : site, Inn, s0, d def_positionsf ∧ ∀s′ : site d′ : def, Inn, s′, d′ def_positionsf → s′ = s0 ∧ d′ = d

set L := filterλt ⇒ name_eqbn fstdrop_sitet def_positionsf in Hcount

f :
n :
d :
s :
Hs :
Inn, s, d def_positionsf
L :=
filterλt : name × site × def ⇒ name_eqbn fstdrop_sitet def_positionsf : listname × site × def
Hcount :
Datatypes.lengthL = 1%nat
⊢
∃s0 : site, Inn, s0, d def_positionsf ∧ ∀s′ : site d′ : def, Inn, s′, d′ def_positionsf → s′ = s0 ∧ d′ = d

assert HL : ∀s′ d′, Inn, s′, d′ def_positionsf → Inn, s′, d′ L

2 open

f :
n :
d :
s :
Hs :
Inn, s, d def_positionsf
L :=
filterλt : name × site × def ⇒ name_eqbn fstdrop_sitet def_positionsf : listname × site × def
Hcount :
Datatypes.lengthL = 1%nat
⊢
∀s′ : site d′ : def, Inn, s′, d′ def_positionsf → Inn, s′, d′ L
focused goal
f :
n :
d :
s :
Hs :
Inn, s, d def_positionsf
L :=
filterλt : name × site × def ⇒ name_eqbn fstdrop_sitet def_positionsf : listname × site × def
Hcount :
Datatypes.lengthL = 1%nat
HL :
∀s′ : site d′ : def, Inn, s′, d′ def_positionsf → Inn, s′, d′ L
⊢
∃s0 : site, Inn, s0, d def_positionsf ∧ ∀s′ : site d′ : def, Inn, s′, d′ def_positionsf → s′ = s0 ∧ d′ = d

{intros s′ d′ Hs′

2 open

f :
n :
d :
s :
Hs :
Inn, s, d def_positionsf
L :=
filterλt : name × site × def ⇒ name_eqbn fstdrop_sitet def_positionsf : listname × site × def
Hcount :
Datatypes.lengthL = 1%nat
s′ :
d′ :
Hs′ :
Inn, s′, d′ def_positionsf
⊢
Inn, s′, d′ L
deferred goal
f :
n :
d :
s :
Hs :
Inn, s, d def_positionsf
L :=
filterλt : name × site × def ⇒ name_eqbn fstdrop_sitet def_positionsf : listname × site × def
Hcount :
Datatypes.lengthL = 1%nat
HL :
∀s′ : site d′ : def, Inn, s′, d′ def_positionsf → Inn, s′, d′ L
⊢
∃s0 : site, Inn, s0, d def_positionsf ∧ ∀s′ : site d′ : def, Inn, s′, d′ def_positionsf → s′ = s0 ∧ d′ = d

apply filter_In

2 open

f :
n :
d :
s :
Hs :
Inn, s, d def_positionsf
L :=
filterλt : name × site × def ⇒ name_eqbn fstdrop_sitet def_positionsf : listname × site × def
Hcount :
Datatypes.lengthL = 1%nat
s′ :
d′ :
Hs′ :
Inn, s′, d′ def_positionsf
⊢
Inn, s′, d′ def_positionsf ∧ name_eqbn fstdrop_siten, s′, d′ = true
deferred goal
f :
n :
d :
s :
Hs :
Inn, s, d def_positionsf
L :=
filterλt : name × site × def ⇒ name_eqbn fstdrop_sitet def_positionsf : listname × site × def
Hcount :
Datatypes.lengthL = 1%nat
HL :
∀s′ : site d′ : def, Inn, s′, d′ def_positionsf → Inn, s′, d′ L
⊢
∃s0 : site, Inn, s0, d def_positionsf ∧ ∀s′ : site d′ : def, Inn, s′, d′ def_positionsf → s′ = s0 ∧ d′ = d

split ; exact Hs′ |

2 open

f :
n :
d :
s :
Hs :
Inn, s, d def_positionsf
L :=
filterλt : name × site × def ⇒ name_eqbn fstdrop_sitet def_positionsf : listname × site × def
Hcount :
Datatypes.lengthL = 1%nat
s′ :
d′ :
Hs′ :
Inn, s′, d′ def_positionsf
⊢
name_eqbn fstdrop_siten, s′, d′ = true
deferred goal
f :
n :
d :
s :
Hs :
Inn, s, d def_positionsf
L :=
filterλt : name × site × def ⇒ name_eqbn fstdrop_sitet def_positionsf : listname × site × def
Hcount :
Datatypes.lengthL = 1%nat
HL :
∀s′ : site d′ : def, Inn, s′, d′ def_positionsf → Inn, s′, d′ L
⊢
∃s0 : site, Inn, s0, d def_positionsf ∧ ∀s′ : site d′ : def, Inn, s′, d′ def_positionsf → s′ = s0 ∧ d′ = d

apply name_eqb_true

2 open

f :
n :
d :
s :
Hs :
Inn, s, d def_positionsf
L :=
filterλt : name × site × def ⇒ name_eqbn fstdrop_sitet def_positionsf : listname × site × def
Hcount :
Datatypes.lengthL = 1%nat
s′ :
d′ :
Hs′ :
Inn, s′, d′ def_positionsf
⊢
n = fstdrop_siten, s′, d′
deferred goal
f :
n :
d :
s :
Hs :
Inn, s, d def_positionsf
L :=
filterλt : name × site × def ⇒ name_eqbn fstdrop_sitet def_positionsf : listname × site × def
Hcount :
Datatypes.lengthL = 1%nat
HL :
∀s′ : site d′ : def, Inn, s′, d′ def_positionsf → Inn, s′, d′ L
⊢
∃s0 : site, Inn, s0, d def_positionsf ∧ ∀s′ : site d′ : def, Inn, s′, d′ def_positionsf → s′ = s0 ∧ d′ = d

reflexivity

deferred goal
f :
n :
d :
s :
Hs :
Inn, s, d def_positionsf
L :=
filterλt : name × site × def ⇒ name_eqbn fstdrop_sitet def_positionsf : listname × site × def
Hcount :
Datatypes.lengthL = 1%nat
HL :
∀s′ : site d′ : def, Inn, s′, d′ def_positionsf → Inn, s′, d′ L
⊢
∃s0 : site, Inn, s0, d def_positionsf ∧ ∀s′ : site d′ : def, Inn, s′, d′ def_positionsf → s′ = s0 ∧ d′ = d

exists s

f :
n :
d :
s :
Hs :
Inn, s, d def_positionsf
L :=
filterλt : name × site × def ⇒ name_eqbn fstdrop_sitet def_positionsf : listname × site × def
Hcount :
Datatypes.lengthL = 1%nat
HL :
∀s′ : site d′ : def, Inn, s′, d′ def_positionsf → Inn, s′, d′ L
⊢
Inn, s, d def_positionsf ∧ ∀s′ : site d′ : def, Inn, s′, d′ def_positionsf → s′ = s ∧ d′ = d

split ; exact Hs |

f :
n :
d :
s :
Hs :
Inn, s, d def_positionsf
L :=
filterλt : name × site × def ⇒ name_eqbn fstdrop_sitet def_positionsf : listname × site × def
Hcount :
Datatypes.lengthL = 1%nat
HL :
∀s′ : site d′ : def, Inn, s′, d′ def_positionsf → Inn, s′, d′ L
⊢
∀s′ : site d′ : def, Inn, s′, d′ def_positionsf → s′ = s ∧ d′ = d

intros s′ d′ Hs′

f :
n :
d :
s :
Hs :
Inn, s, d def_positionsf
L :=
filterλt : name × site × def ⇒ name_eqbn fstdrop_sitet def_positionsf : listname × site × def
Hcount :
Datatypes.lengthL = 1%nat
HL :
∀s′ : site d′ : def, Inn, s′, d′ def_positionsf → Inn, s′, d′ L
s′ :
d′ :
Hs′ :
Inn, s′, d′ def_positionsf
⊢
s′ = s ∧ d′ = d

pose proof HL_ _ Hs as H1

f :
n :
d :
s :
Hs :
Inn, s, d def_positionsf
L :=
filterλt : name × site × def ⇒ name_eqbn fstdrop_sitet def_positionsf : listname × site × def
Hcount :
Datatypes.lengthL = 1%nat
HL :
∀s′ : site d′ : def, Inn, s′, d′ def_positionsf → Inn, s′, d′ L
s′ :
d′ :
Hs′ :
Inn, s′, d′ def_positionsf
H1 :
Inn, s, d L
⊢
s′ = s ∧ d′ = d

pose proof HL_ _ Hs′ as H2

f :
n :
d :
s :
Hs :
Inn, s, d def_positionsf
L :=
filterλt : name × site × def ⇒ name_eqbn fstdrop_sitet def_positionsf : listname × site × def
Hcount :
Datatypes.lengthL = 1%nat
HL :
∀s′ : site d′ : def, Inn, s′, d′ def_positionsf → Inn, s′, d′ L
s′ :
d′ :
Hs′ :
Inn, s′, d′ def_positionsf
H1 :
Inn, s, d L
H2 :
Inn, s′, d′ L
⊢
s′ = s ∧ d′ = d

destruct L as | t | t′ L′ ; simpl in Hcount ; try discriminate Hcount

f :
n :
d :
s :
Hs :
Inn, s, d def_positionsf
t :
name × site × def
Hcount :
1%nat = 1%nat
HL :
∀s′ : site d′ : def, Inn, s′, d′ def_positionsf → Inn, s′, d′ t
s′ :
d′ :
Hs′ :
Inn, s′, d′ def_positionsf
H1 :
Inn, s, d t
H2 :
Inn, s′, d′ t
⊢
s′ = s ∧ d′ = d

destruct H1 as E1 |

f :
n :
d :
s :
Hs :
Inn, s, d def_positionsf
t :
name × site × def
Hcount :
1%nat = 1%nat
HL :
∀s′ : site d′ : def, Inn, s′, d′ def_positionsf → Inn, s′, d′ t
s′ :
d′ :
Hs′ :
Inn, s′, d′ def_positionsf
E1 :
t = n, s, d
H2 :
Inn, s′, d′ t
⊢
s′ = s ∧ d′ = d

destruct H2 as E2 |

f :
n :
d :
s :
Hs :
Inn, s, d def_positionsf
t :
name × site × def
Hcount :
1%nat = 1%nat
HL :
∀s′ : site d′ : def, Inn, s′, d′ def_positionsf → Inn, s′, d′ t
s′ :
d′ :
Hs′ :
Inn, s′, d′ def_positionsf
E1 :
t = n, s, d
E2 :
t = n, s′, d′
⊢
s′ = s ∧ d′ = d

rewrite E1 in E2

f :
n :
d :
s :
Hs :
Inn, s, d def_positionsf
t :
name × site × def
Hcount :
1%nat = 1%nat
HL :
∀s′ : site d′ : def, Inn, s′, d′ def_positionsf → Inn, s′, d′ t
s′ :
d′ :
Hs′ :
Inn, s′, d′ def_positionsf
E1 :
t = n, s, d
E2 :
n, s, d = n, s′, d′
⊢
s′ = s ∧ d′ = d

injection E2 as E3 E4

f :
n :
d :
s :
Hs :
Inn, s, d def_positionsf
t :
name × site × def
Hcount :
1%nat = 1%nat
HL :
∀s′ : site d′ : def, Inn, s′, d′ def_positionsf → Inn, s′, d′ t
s′ :
d′ :
Hs′ :
Inn, s′, d′ def_positionsf
E1 :
t = n, s, d
E3 :
s = s′
E4 :
d = d′
⊢
s′ = s ∧ d′ = d

auto

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros f n d H
destruct lookup_some_in_ _ _ _ H as n′ & En & Hin
apply name_eqb_true in En
subst n′
unfold single_definitions in Hin
apply filter_In in Hin as Hall Hcount
apply Nat.eqb_eq in Hcount
simpl in Hcount
rewrite all_defs_positions in Hall , Hcount
rewrite filter_map_length in Hcount
apply in_map_iff in Hall as n0 s d0 & Ed & Hs
unfold drop_site in Ed
simpl in Ed
injection Ed as → →
set L := filterλt ⇒ name_eqbn fstdrop_sitet def_positionsf in Hcount
assert HL : ∀s′ d′, Inn, s′, d′ def_positionsf → Inn, s′, d′ L
{intros s′ d′ Hs′
apply filter_In
split ; exact Hs′ |
reflexivity
exists s
split ; exact Hs |
intros s′ d′ Hs′
pose proof HL_ _ Hs as H1
pose proof HL_ _ Hs′ as H2
destruct L as | t | t′ L′ ; simpl in Hcount ; try discriminate Hcount
destruct H1 as E1 |
destruct H2 as E2 |
rewrite E1 in E2
injection E2 as E3 E4
auto

A use is dominated by its single definition

In a function f whose definitions dominate their uses (definitions_dominate), a name o with a single definition d that the instruction at place k of a reachable block b uses is defined at a site that dominates that place (site_dominates).

203Theorem use_dominated
∀ f doms b k ins o d
definitions_dominatef doms = true
is_reachabledoms b_labelb = true
nth_errorb_instsb k = Someins
Ino inst_usesins
∃s, Ino, s, d def_positionsf ∧ site_dominatesdoms b_labelb Z.of_natk s = true
Proof 30 steps Qed
intros f doms b k ins o d H Hb Hr Hk Hu Ho
rewrite forallb_forall in H
specialize Hb Hb
rewrite Hr in H
simpl in H
apply andb_true_iff in H as Hi _
assert Hdu : dominated_usetemp_sitesf doms b_labelb Z.of_natk o = true
{match type of Hi with?Fb_instsb 0 = true⇒assert G : ∀is i k ins, Fis i = true → nth_erroris k = Someins → Ino inst_usesins → dominated_usetemp_sitesf doms b_labelb i + Z.of_natk o = trueend
{intros is
induction is as | ins0 rest IH ; intros i k0 ins1 Hf Hn Hin ; destruct k0 ; discriminate Hn |
cbn in Hf
apply andb_true_iff in Hf as Hf1 Hf2
destruct k0 as | k0 ; simpl in Hn
–injection Hn as ←
rewrite forallb_forall in Hf1
rewrite Z.add_0_r
exact Hf1_ Hin
–rewrite Nat2Z.inj_succ
replace i + Z.succZ.of_natk0 with i + 1 + Z.of_natk0 by lia
exact IH_ _ _ Hf2 Hn Hin
exact G_ _ _ _ Hi Hk Hu
unfold dominated_use in Hdu
destruct nm_findo temp_sitesf as ss | eqn: Es ; | discriminate Hdu
apply existsb_exists in Hdu as s & Hin & Hd
destruct temp_sites_sound_ _ _ _ Es Hin as d′ Hd′
destruct once_position_ _ _ Ho as s0 & Hs0 & Huniq
destruct Huniq_ _ Hd' as → →
exists s0
auto

Positions and instructions

name_eqb is symmetric.

233Lemma name_eqb_sym_d
∀ a b
Explore proof 10 tactics

Initial goal

⊢
∀a b : name, name_eqba b = name_eqbb a

intros a b

a, b :
⊢

destruct name_eqba b eqn: E ; symmetry

2 open

a, b :
E :
name_eqba b = true
⊢
name_eqbb a = true
focused goal
a, b :
E :
name_eqba b = false
⊢
name_eqbb a = false

–apply name_eqb_true in E

2 open

a, b :
E :
a = b
⊢
name_eqbb a = true
deferred goal
a, b :
E :
name_eqba b = false
⊢
name_eqbb a = false

subst

2 open

b :
⊢
name_eqbb b = true
deferred goal
a, b :
E :
name_eqba b = false
⊢
name_eqbb a = false

apply name_eqb_true

2 open

b :
⊢
b = b
deferred goal
a, b :
E :
name_eqba b = false
⊢
name_eqbb a = false

reflexivity

deferred goal
a, b :
E :
name_eqba b = false
⊢
name_eqbb a = false

–apply name_eqb_false

a, b :
E :
name_eqba b = false
⊢
b ≠ a

intros →

a :
E :
name_eqba a = false
⊢
False

apply name_eqb_false in E

a :
E :
a ≠ a
⊢
False

exact Eeq_refl

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros a b
destruct name_eqba b eqn: E ; symmetry
–apply name_eqb_true in E
subst
reflexivity
intros →
apply name_eqb_false in E
exact Eeq_refl

A position that inst_positions lists for the instructions is of the block labelled l, from index j, is that of some instruction i at place k of is, at index j + k, and names a temporary i defines.

243Lemma inst_positions_in
∀ l j is n s d
Inn, s, d inst_positionsl j is
∃k i, nth_erroris k = Somei ∧ s = SAtl j + Z.of_natk ∧ d = DInsti ∧ Inn mapfst inst_temp_defsi
Explore proof 18 tactics

Initial goal

⊢
∀l : name j : Z is : listinst n : name s : site d : def, Inn, s, d inst_positionsl j is → ∃k : nat i : inst, nth_erroris k = Somei ∧ s = SAtl j + Z.of_natk ∧ d = DInsti ∧ Inn mapfst inst_temp_defsi

intros l j is

l :
j :
Z
is :
listinst
⊢
∀n : name s : site d : def, Inn, s, d inst_positionsl j is → ∃k : nat i : inst, nth_erroris k = Somei ∧ s = SAtl j + Z.of_natk ∧ d = DInsti ∧ Inn mapfst inst_temp_defsi

revert j

l :
is :
listinst
⊢
∀j : Z n : name s : site d : def, Inn, s, d inst_positionsl j is → ∃k : nat i : inst, nth_erroris k = Somei ∧ s = SAtl j + Z.of_natk ∧ d = DInsti ∧ Inn mapfst inst_temp_defsi

induction is as | i rest IH ; intros j n s d H ; destruct H |

l :
i :
rest :
listinst
IH :
∀j : Z n : name s : site d : def, Inn, s, d inst_positionsl j rest → ∃k : nat i : inst, nth_errorrest k = Somei ∧ s = SAtl j + Z.of_natk ∧ d = DInsti ∧ Inn mapfst inst_temp_defsi
j :
Z
n :
s :
d :
H :
Inn, s, d inst_positionsl j i :: rest
⊢
∃k : nat i0 : inst, nth_errori :: rest k = Somei0 ∧ s = SAtl j + Z.of_natk ∧ d = DInsti0 ∧ Inn mapfst inst_temp_defsi0

simpl in H

l :
i :
rest :
listinst
IH :
∀j : Z n : name s : site d : def, Inn, s, d inst_positionsl j rest → ∃k : nat i : inst, nth_errorrest k = Somei ∧ s = SAtl j + Z.of_natk ∧ d = DInsti ∧ Inn mapfst inst_temp_defsi
j :
Z
n :
s :
d :
H :
Inn, s, d mapλdk : name × class ⇒ fstdk, SAtl j, DInsti inst_temp_defsi ++ inst_positionsl j + 1 rest
⊢
∃k : nat i0 : inst, nth_errori :: rest k = Somei0 ∧ s = SAtl j + Z.of_natk ∧ d = DInsti0 ∧ Inn mapfst inst_temp_defsi0

apply in_app_or in H as H | H

2 open

l :
i :
rest :
listinst
IH :
∀j : Z n : name s : site d : def, Inn, s, d inst_positionsl j rest → ∃k : nat i : inst, nth_errorrest k = Somei ∧ s = SAtl j + Z.of_natk ∧ d = DInsti ∧ Inn mapfst inst_temp_defsi
j :
Z
n :
s :
d :
H :
Inn, s, d mapλdk : name × class ⇒ fstdk, SAtl j, DInsti inst_temp_defsi
⊢
∃k : nat i0 : inst, nth_errori :: rest k = Somei0 ∧ s = SAtl j + Z.of_natk ∧ d = DInsti0 ∧ Inn mapfst inst_temp_defsi0
focused goal
l :
i :
rest :
listinst
IH :
∀j : Z n : name s : site d : def, Inn, s, d inst_positionsl j rest → ∃k : nat i : inst, nth_errorrest k = Somei ∧ s = SAtl j + Z.of_natk ∧ d = DInsti ∧ Inn mapfst inst_temp_defsi
j :
Z
n :
s :
d :
H :
Inn, s, d inst_positionsl j + 1 rest
⊢
∃k : nat i0 : inst, nth_errori :: rest k = Somei0 ∧ s = SAtl j + Z.of_natk ∧ d = DInsti0 ∧ Inn mapfst inst_temp_defsi0

–apply in_map_iff in H as dk & E & Hdk

2 open

l :
i :
rest :
listinst
IH :
∀j : Z n : name s : site d : def, Inn, s, d inst_positionsl j rest → ∃k : nat i : inst, nth_errorrest k = Somei ∧ s = SAtl j + Z.of_natk ∧ d = DInsti ∧ Inn mapfst inst_temp_defsi
j :
Z
n :
s :
d :
dk :
E :
fstdk, SAtl j, DInsti = n, s, d
Hdk :
⊢
∃k : nat i0 : inst, nth_errori :: rest k = Somei0 ∧ s = SAtl j + Z.of_natk ∧ d = DInsti0 ∧ Inn mapfst inst_temp_defsi0
deferred goal
l :
i :
rest :
listinst
IH :
∀j : Z n : name s : site d : def, Inn, s, d inst_positionsl j rest → ∃k : nat i : inst, nth_errorrest k = Somei ∧ s = SAtl j + Z.of_natk ∧ d = DInsti ∧ Inn mapfst inst_temp_defsi
j :
Z
n :
s :
d :
H :
Inn, s, d inst_positionsl j + 1 rest
⊢
∃k : nat i0 : inst, nth_errori :: rest k = Somei0 ∧ s = SAtl j + Z.of_natk ∧ d = DInsti0 ∧ Inn mapfst inst_temp_defsi0

injection E as ← ← ←

2 open

l :
i :
rest :
listinst
IH :
∀j : Z n : name s : site d : def, Inn, s, d inst_positionsl j rest → ∃k : nat i : inst, nth_errorrest k = Somei ∧ s = SAtl j + Z.of_natk ∧ d = DInsti ∧ Inn mapfst inst_temp_defsi
j :
Z
dk :
Hdk :
⊢
∃k : nat i0 : inst, nth_errori :: rest k = Somei0 ∧ SAtl j = SAtl j + Z.of_natk ∧ DInsti = DInsti0 ∧ Infstdk mapfst inst_temp_defsi0
deferred goal
l :
i :
rest :
listinst
IH :
∀j : Z n : name s : site d : def, Inn, s, d inst_positionsl j rest → ∃k : nat i : inst, nth_errorrest k = Somei ∧ s = SAtl j + Z.of_natk ∧ d = DInsti ∧ Inn mapfst inst_temp_defsi
j :
Z
n :
s :
d :
H :
Inn, s, d inst_positionsl j + 1 rest
⊢
∃k : nat i0 : inst, nth_errori :: rest k = Somei0 ∧ s = SAtl j + Z.of_natk ∧ d = DInsti0 ∧ Inn mapfst inst_temp_defsi0

exists O, i

2 open

l :
i :
rest :
listinst
IH :
∀j : Z n : name s : site d : def, Inn, s, d inst_positionsl j rest → ∃k : nat i : inst, nth_errorrest k = Somei ∧ s = SAtl j + Z.of_natk ∧ d = DInsti ∧ Inn mapfst inst_temp_defsi
j :
Z
dk :
Hdk :
⊢
nth_errori :: rest 0 = Somei ∧ SAtl j = SAtl j + Z.of_nat0 ∧ DInsti = DInsti ∧ Infstdk mapfst inst_temp_defsi
deferred goal
l :
i :
rest :
listinst
IH :
∀j : Z n : name s : site d : def, Inn, s, d inst_positionsl j rest → ∃k : nat i : inst, nth_errorrest k = Somei ∧ s = SAtl j + Z.of_natk ∧ d = DInsti ∧ Inn mapfst inst_temp_defsi
j :
Z
n :
s :
d :
H :
Inn, s, d inst_positionsl j + 1 rest
⊢
∃k : nat i0 : inst, nth_errori :: rest k = Somei0 ∧ s = SAtl j + Z.of_natk ∧ d = DInsti0 ∧ Inn mapfst inst_temp_defsi0

split ; reflexivity |

2 open

l :
i :
rest :
listinst
IH :
∀j : Z n : name s : site d : def, Inn, s, d inst_positionsl j rest → ∃k : nat i : inst, nth_errorrest k = Somei ∧ s = SAtl j + Z.of_natk ∧ d = DInsti ∧ Inn mapfst inst_temp_defsi
j :
Z
dk :
Hdk :
⊢
SAtl j = SAtl j + Z.of_nat0 ∧ DInsti = DInsti ∧ Infstdk mapfst inst_temp_defsi
deferred goal
l :
i :
rest :
listinst
IH :
∀j : Z n : name s : site d : def, Inn, s, d inst_positionsl j rest → ∃k : nat i : inst, nth_errorrest k = Somei ∧ s = SAtl j + Z.of_natk ∧ d = DInsti ∧ Inn mapfst inst_temp_defsi
j :
Z
n :
s :
d :
H :
Inn, s, d inst_positionsl j + 1 rest
⊢
∃k : nat i0 : inst, nth_errori :: rest k = Somei0 ∧ s = SAtl j + Z.of_natk ∧ d = DInsti0 ∧ Inn mapfst inst_temp_defsi0

split ; replace j + Z.of_nat0 with j by lia ; reflexivity |

2 open

l :
i :
rest :
listinst
IH :
∀j : Z n : name s : site d : def, Inn, s, d inst_positionsl j rest → ∃k : nat i : inst, nth_errorrest k = Somei ∧ s = SAtl j + Z.of_natk ∧ d = DInsti ∧ Inn mapfst inst_temp_defsi
j :
Z
dk :
Hdk :
⊢
DInsti = DInsti ∧ Infstdk mapfst inst_temp_defsi
deferred goal
l :
i :
rest :
listinst
IH :
∀j : Z n : name s : site d : def, Inn, s, d inst_positionsl j rest → ∃k : nat i : inst, nth_errorrest k = Somei ∧ s = SAtl j + Z.of_natk ∧ d = DInsti ∧ Inn mapfst inst_temp_defsi
j :
Z
n :
s :
d :
H :
Inn, s, d inst_positionsl j + 1 rest
⊢
∃k : nat i0 : inst, nth_errori :: rest k = Somei0 ∧ s = SAtl j + Z.of_natk ∧ d = DInsti0 ∧ Inn mapfst inst_temp_defsi0

split ; reflexivity |

2 open

l :
i :
rest :
listinst
IH :
∀j : Z n : name s : site d : def, Inn, s, d inst_positionsl j rest → ∃k : nat i : inst, nth_errorrest k = Somei ∧ s = SAtl j + Z.of_natk ∧ d = DInsti ∧ Inn mapfst inst_temp_defsi
j :
Z
dk :
Hdk :
⊢
Infstdk mapfst inst_temp_defsi
deferred goal
l :
i :
rest :
listinst
IH :
∀j : Z n : name s : site d : def, Inn, s, d inst_positionsl j rest → ∃k : nat i : inst, nth_errorrest k = Somei ∧ s = SAtl j + Z.of_natk ∧ d = DInsti ∧ Inn mapfst inst_temp_defsi
j :
Z
n :
s :
d :
H :
Inn, s, d inst_positionsl j + 1 rest
⊢
∃k : nat i0 : inst, nth_errori :: rest k = Somei0 ∧ s = SAtl j + Z.of_natk ∧ d = DInsti0 ∧ Inn mapfst inst_temp_defsi0

apply in_map

2 open

l :
i :
rest :
listinst
IH :
∀j : Z n : name s : site d : def, Inn, s, d inst_positionsl j rest → ∃k : nat i : inst, nth_errorrest k = Somei ∧ s = SAtl j + Z.of_natk ∧ d = DInsti ∧ Inn mapfst inst_temp_defsi
j :
Z
dk :
Hdk :
deferred goal
l :
i :
rest :
listinst
IH :
∀j : Z n : name s : site d : def, Inn, s, d inst_positionsl j rest → ∃k : nat i : inst, nth_errorrest k = Somei ∧ s = SAtl j + Z.of_natk ∧ d = DInsti ∧ Inn mapfst inst_temp_defsi
j :
Z
n :
s :
d :
H :
Inn, s, d inst_positionsl j + 1 rest
⊢
∃k : nat i0 : inst, nth_errori :: rest k = Somei0 ∧ s = SAtl j + Z.of_natk ∧ d = DInsti0 ∧ Inn mapfst inst_temp_defsi0

exact Hdk

deferred goal
l :
i :
rest :
listinst
IH :
∀j : Z n : name s : site d : def, Inn, s, d inst_positionsl j rest → ∃k : nat i : inst, nth_errorrest k = Somei ∧ s = SAtl j + Z.of_natk ∧ d = DInsti ∧ Inn mapfst inst_temp_defsi
j :
Z
n :
s :
d :
H :
Inn, s, d inst_positionsl j + 1 rest
⊢
∃k : nat i0 : inst, nth_errori :: rest k = Somei0 ∧ s = SAtl j + Z.of_natk ∧ d = DInsti0 ∧ Inn mapfst inst_temp_defsi0

–destruct IH_ _ _ _ H as k & i′ & Hk & → & → & Hn

l :
i :
rest :
listinst
IH :
∀j : Z n : name s : site d : def, Inn, s, d inst_positionsl j rest → ∃k : nat i : inst, nth_errorrest k = Somei ∧ s = SAtl j + Z.of_natk ∧ d = DInsti ∧ Inn mapfst inst_temp_defsi
j :
Z
n :
k :
nat
i′ :
H :
Inn, SAtl j + 1 + Z.of_natk, DInsti′ inst_positionsl j + 1 rest
Hk :
nth_errorrest k = Somei′
Hn :
Inn mapfst inst_temp_defsi′
⊢
∃k0 : nat i0 : inst, nth_errori :: rest k0 = Somei0 ∧ SAtl j + 1 + Z.of_natk = SAtl j + Z.of_natk0 ∧ DInsti′ = DInsti0 ∧ Inn mapfst inst_temp_defsi0

exists Sk, i′

l :
i :
rest :
listinst
IH :
∀j : Z n : name s : site d : def, Inn, s, d inst_positionsl j rest → ∃k : nat i : inst, nth_errorrest k = Somei ∧ s = SAtl j + Z.of_natk ∧ d = DInsti ∧ Inn mapfst inst_temp_defsi
j :
Z
n :
k :
nat
i′ :
H :
Inn, SAtl j + 1 + Z.of_natk, DInsti′ inst_positionsl j + 1 rest
Hk :
nth_errorrest k = Somei′
Hn :
Inn mapfst inst_temp_defsi′
⊢
nth_errori :: rest Sk = Somei′ ∧ SAtl j + 1 + Z.of_natk = SAtl j + Z.of_natSk ∧ DInsti′ = DInsti′ ∧ Inn mapfst inst_temp_defsi′

split ; exact Hk |

l :
i :
rest :
listinst
IH :
∀j : Z n : name s : site d : def, Inn, s, d inst_positionsl j rest → ∃k : nat i : inst, nth_errorrest k = Somei ∧ s = SAtl j + Z.of_natk ∧ d = DInsti ∧ Inn mapfst inst_temp_defsi
j :
Z
n :
k :
nat
i′ :
H :
Inn, SAtl j + 1 + Z.of_natk, DInsti′ inst_positionsl j + 1 rest
Hk :
nth_errorrest k = Somei′
Hn :
Inn mapfst inst_temp_defsi′
⊢
SAtl j + 1 + Z.of_natk = SAtl j + Z.of_natSk ∧ DInsti′ = DInsti′ ∧ Inn mapfst inst_temp_defsi′

split ; replace j + Z.of_natSk with j + 1 + Z.of_natk by lia ; reflexivity |

l :
i :
rest :
listinst
IH :
∀j : Z n : name s : site d : def, Inn, s, d inst_positionsl j rest → ∃k : nat i : inst, nth_errorrest k = Somei ∧ s = SAtl j + Z.of_natk ∧ d = DInsti ∧ Inn mapfst inst_temp_defsi
j :
Z
n :
k :
nat
i′ :
H :
Inn, SAtl j + 1 + Z.of_natk, DInsti′ inst_positionsl j + 1 rest
Hk :
nth_errorrest k = Somei′
Hn :
Inn mapfst inst_temp_defsi′
⊢
DInsti′ = DInsti′ ∧ Inn mapfst inst_temp_defsi′

auto

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros l j is
revert j
induction is as | i rest IH ; intros j n s d H ; destruct H |
simpl in H
apply in_app_or in H as H | H
–apply in_map_iff in H as dk & E & Hdk
injection E as ← ← ←
exists O, i
split ; reflexivity |
split ; replace j + Z.of_nat0 with j by lia ; reflexivity |
split ; reflexivity |
apply in_map
exact Hdk
–destruct IH_ _ _ _ H as k & i′ & Hk & → & → & Hn
exists Sk, i′
split ; exact Hk |
split ; replace j + Z.of_natSk with j + 1 + Z.of_natk by lia ; reflexivity |
auto

Conversely, inst_positions lists each temporary dk that the instruction i at place k of is defines, at index j + k.

261Lemma inst_positions_nth
∀ l j is k i dk
nth_erroris k = Somei
Infstdk, SAtl j + Z.of_natk, DInsti inst_positionsl j is
Explore proof 16 tactics

Initial goal

⊢
∀l : name j : Z is : listinst k : nat i : inst dk : name × class, nth_erroris k = Somei → Indk inst_temp_defsi → Infstdk, SAtl j + Z.of_natk, DInsti inst_positionsl j is

intros l j is

l :
j :
Z
is :
listinst
⊢
∀k : nat i : inst dk : name × class, nth_erroris k = Somei → Indk inst_temp_defsi → Infstdk, SAtl j + Z.of_natk, DInsti inst_positionsl j is

revert j

l :
is :
listinst
⊢
∀j : Z k : nat i : inst dk : name × class, nth_erroris k = Somei → Indk inst_temp_defsi → Infstdk, SAtl j + Z.of_natk, DInsti inst_positionsl j is

induction is as | i0 rest IH ; intros j k i dk Hk Hdk ; destruct k ; discriminate Hk |

l :
i0 :
rest :
listinst
IH :
∀j : Z k : nat i : inst dk : name × class, nth_errorrest k = Somei → Indk inst_temp_defsi → Infstdk, SAtl j + Z.of_natk, DInsti inst_positionsl j rest
j :
Z
k :
nat
i :
dk :
Hk :
nth_errori0 :: rest k = Somei
Hdk :
⊢
Infstdk, SAtl j + Z.of_natk, DInsti inst_positionsl j i0 :: rest

simpl

l :
i0 :
rest :
listinst
IH :
∀j : Z k : nat i : inst dk : name × class, nth_errorrest k = Somei → Indk inst_temp_defsi → Infstdk, SAtl j + Z.of_natk, DInsti inst_positionsl j rest
j :
Z
k :
nat
i :
dk :
Hk :
nth_errori0 :: rest k = Somei
Hdk :
⊢
Infstdk, SAtl j + Z.of_natk, DInsti mapλdk0 : name × class ⇒ fstdk0, SAtl j, DInsti0 inst_temp_defsi0 ++ inst_positionsl j + 1 rest

apply in_or_app

l :
i0 :
rest :
listinst
IH :
∀j : Z k : nat i : inst dk : name × class, nth_errorrest k = Somei → Indk inst_temp_defsi → Infstdk, SAtl j + Z.of_natk, DInsti inst_positionsl j rest
j :
Z
k :
nat
i :
dk :
Hk :
nth_errori0 :: rest k = Somei
Hdk :
⊢
Infstdk, SAtl j + Z.of_natk, DInsti mapλdk0 : name × class ⇒ fstdk0, SAtl j, DInsti0 inst_temp_defsi0 ∨ Infstdk, SAtl j + Z.of_natk, DInsti inst_positionsl j + 1 rest

destruct k as | k ; simpl in Hk

2 open

l :
i0 :
rest :
listinst
IH :
∀j : Z k : nat i : inst dk : name × class, nth_errorrest k = Somei → Indk inst_temp_defsi → Infstdk, SAtl j + Z.of_natk, DInsti inst_positionsl j rest
j :
Z
i :
dk :
Hk :
Somei0 = Somei
Hdk :
⊢
Infstdk, SAtl j + Z.of_nat0, DInsti mapλdk0 : name × class ⇒ fstdk0, SAtl j, DInsti0 inst_temp_defsi0 ∨ Infstdk, SAtl j + Z.of_nat0, DInsti inst_positionsl j + 1 rest
focused goal
l :
i0 :
rest :
listinst
IH :
∀j : Z k : nat i : inst dk : name × class, nth_errorrest k = Somei → Indk inst_temp_defsi → Infstdk, SAtl j + Z.of_natk, DInsti inst_positionsl j rest
j :
Z
k :
nat
i :
dk :
Hk :
nth_errorrest k = Somei
Hdk :
⊢
Infstdk, SAtl j + Z.of_natSk, DInsti mapλdk0 : name × class ⇒ fstdk0, SAtl j, DInsti0 inst_temp_defsi0 ∨ Infstdk, SAtl j + Z.of_natSk, DInsti inst_positionsl j + 1 rest

–injection Hk as ←

2 open

l :
i0 :
rest :
listinst
IH :
∀j : Z k : nat i : inst dk : name × class, nth_errorrest k = Somei → Indk inst_temp_defsi → Infstdk, SAtl j + Z.of_natk, DInsti inst_positionsl j rest
j :
Z
dk :
Hdk :
⊢
Infstdk, SAtl j + Z.of_nat0, DInsti0 mapλdk0 : name × class ⇒ fstdk0, SAtl j, DInsti0 inst_temp_defsi0 ∨ Infstdk, SAtl j + Z.of_nat0, DInsti0 inst_positionsl j + 1 rest
deferred goal
l :
i0 :
rest :
listinst
IH :
∀j : Z k : nat i : inst dk : name × class, nth_errorrest k = Somei → Indk inst_temp_defsi → Infstdk, SAtl j + Z.of_natk, DInsti inst_positionsl j rest
j :
Z
k :
nat
i :
dk :
Hk :
nth_errorrest k = Somei
Hdk :
⊢
Infstdk, SAtl j + Z.of_natSk, DInsti mapλdk0 : name × class ⇒ fstdk0, SAtl j, DInsti0 inst_temp_defsi0 ∨ Infstdk, SAtl j + Z.of_natSk, DInsti inst_positionsl j + 1 rest

left

2 open

l :
i0 :
rest :
listinst
IH :
∀j : Z k : nat i : inst dk : name × class, nth_errorrest k = Somei → Indk inst_temp_defsi → Infstdk, SAtl j + Z.of_natk, DInsti inst_positionsl j rest
j :
Z
dk :
Hdk :
⊢
Infstdk, SAtl j + Z.of_nat0, DInsti0 mapλdk0 : name × class ⇒ fstdk0, SAtl j, DInsti0 inst_temp_defsi0
deferred goal
l :
i0 :
rest :
listinst
IH :
∀j : Z k : nat i : inst dk : name × class, nth_errorrest k = Somei → Indk inst_temp_defsi → Infstdk, SAtl j + Z.of_natk, DInsti inst_positionsl j rest
j :
Z
k :
nat
i :
dk :
Hk :
nth_errorrest k = Somei
Hdk :
⊢
Infstdk, SAtl j + Z.of_natSk, DInsti mapλdk0 : name × class ⇒ fstdk0, SAtl j, DInsti0 inst_temp_defsi0 ∨ Infstdk, SAtl j + Z.of_natSk, DInsti inst_positionsl j + 1 rest

apply in_map_iff

2 open

l :
i0 :
rest :
listinst
IH :
∀j : Z k : nat i : inst dk : name × class, nth_errorrest k = Somei → Indk inst_temp_defsi → Infstdk, SAtl j + Z.of_natk, DInsti inst_positionsl j rest
j :
Z
dk :
Hdk :
⊢
∃x : name × class, fstx, SAtl j, DInsti0 = fstdk, SAtl j + Z.of_nat0, DInsti0 ∧ Inx inst_temp_defsi0
deferred goal
l :
i0 :
rest :
listinst
IH :
∀j : Z k : nat i : inst dk : name × class, nth_errorrest k = Somei → Indk inst_temp_defsi → Infstdk, SAtl j + Z.of_natk, DInsti inst_positionsl j rest
j :
Z
k :
nat
i :
dk :
Hk :
nth_errorrest k = Somei
Hdk :
⊢
Infstdk, SAtl j + Z.of_natSk, DInsti mapλdk0 : name × class ⇒ fstdk0, SAtl j, DInsti0 inst_temp_defsi0 ∨ Infstdk, SAtl j + Z.of_natSk, DInsti inst_positionsl j + 1 rest

exists dk

2 open

l :
i0 :
rest :
listinst
IH :
∀j : Z k : nat i : inst dk : name × class, nth_errorrest k = Somei → Indk inst_temp_defsi → Infstdk, SAtl j + Z.of_natk, DInsti inst_positionsl j rest
j :
Z
dk :
Hdk :
⊢
fstdk, SAtl j, DInsti0 = fstdk, SAtl j + Z.of_nat0, DInsti0 ∧ Indk inst_temp_defsi0
deferred goal
l :
i0 :
rest :
listinst
IH :
∀j : Z k : nat i : inst dk : name × class, nth_errorrest k = Somei → Indk inst_temp_defsi → Infstdk, SAtl j + Z.of_natk, DInsti inst_positionsl j rest
j :
Z
k :
nat
i :
dk :
Hk :
nth_errorrest k = Somei
Hdk :
⊢
Infstdk, SAtl j + Z.of_natSk, DInsti mapλdk0 : name × class ⇒ fstdk0, SAtl j, DInsti0 inst_temp_defsi0 ∨ Infstdk, SAtl j + Z.of_natSk, DInsti inst_positionsl j + 1 rest

split ; | exact Hdk

2 open

l :
i0 :
rest :
listinst
IH :
∀j : Z k : nat i : inst dk : name × class, nth_errorrest k = Somei → Indk inst_temp_defsi → Infstdk, SAtl j + Z.of_natk, DInsti inst_positionsl j rest
j :
Z
dk :
Hdk :
⊢
fstdk, SAtl j, DInsti0 = fstdk, SAtl j + Z.of_nat0, DInsti0
deferred goal
l :
i0 :
rest :
listinst
IH :
∀j : Z k : nat i : inst dk : name × class, nth_errorrest k = Somei → Indk inst_temp_defsi → Infstdk, SAtl j + Z.of_natk, DInsti inst_positionsl j rest
j :
Z
k :
nat
i :
dk :
Hk :
nth_errorrest k = Somei
Hdk :
⊢
Infstdk, SAtl j + Z.of_natSk, DInsti mapλdk0 : name × class ⇒ fstdk0, SAtl j, DInsti0 inst_temp_defsi0 ∨ Infstdk, SAtl j + Z.of_natSk, DInsti inst_positionsl j + 1 rest

replace j + Z.of_nat0 with j by lia

2 open

l :
i0 :
rest :
listinst
IH :
∀j : Z k : nat i : inst dk : name × class, nth_errorrest k = Somei → Indk inst_temp_defsi → Infstdk, SAtl j + Z.of_natk, DInsti inst_positionsl j rest
j :
Z
dk :
Hdk :
⊢
fstdk, SAtl j, DInsti0 = fstdk, SAtl j, DInsti0
deferred goal
l :
i0 :
rest :
listinst
IH :
∀j : Z k : nat i : inst dk : name × class, nth_errorrest k = Somei → Indk inst_temp_defsi → Infstdk, SAtl j + Z.of_natk, DInsti inst_positionsl j rest
j :
Z
k :
nat
i :
dk :
Hk :
nth_errorrest k = Somei
Hdk :
⊢
Infstdk, SAtl j + Z.of_natSk, DInsti mapλdk0 : name × class ⇒ fstdk0, SAtl j, DInsti0 inst_temp_defsi0 ∨ Infstdk, SAtl j + Z.of_natSk, DInsti inst_positionsl j + 1 rest

reflexivity

deferred goal
l :
i0 :
rest :
listinst
IH :
∀j : Z k : nat i : inst dk : name × class, nth_errorrest k = Somei → Indk inst_temp_defsi → Infstdk, SAtl j + Z.of_natk, DInsti inst_positionsl j rest
j :
Z
k :
nat
i :
dk :
Hk :
nth_errorrest k = Somei
Hdk :
⊢
Infstdk, SAtl j + Z.of_natSk, DInsti mapλdk0 : name × class ⇒ fstdk0, SAtl j, DInsti0 inst_temp_defsi0 ∨ Infstdk, SAtl j + Z.of_natSk, DInsti inst_positionsl j + 1 rest

–right

l :
i0 :
rest :
listinst
IH :
∀j : Z k : nat i : inst dk : name × class, nth_errorrest k = Somei → Indk inst_temp_defsi → Infstdk, SAtl j + Z.of_natk, DInsti inst_positionsl j rest
j :
Z
k :
nat
i :
dk :
Hk :
nth_errorrest k = Somei
Hdk :
⊢
Infstdk, SAtl j + Z.of_natSk, DInsti inst_positionsl j + 1 rest

replace j + Z.of_natSk with j + 1 + Z.of_natk by lia

l :
i0 :
rest :
listinst
IH :
∀j : Z k : nat i : inst dk : name × class, nth_errorrest k = Somei → Indk inst_temp_defsi → Infstdk, SAtl j + Z.of_natk, DInsti inst_positionsl j rest
j :
Z
k :
nat
i :
dk :
Hk :
nth_errorrest k = Somei
Hdk :
⊢
Infstdk, SAtl j + 1 + Z.of_natk, DInsti inst_positionsl j + 1 rest

exact IH_ _ _ _ Hk Hdk

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros l j is
revert j
induction is as | i0 rest IH ; intros j k i dk Hk Hdk ; destruct k ; discriminate Hk |
simpl
apply in_or_app
destruct k as | k ; simpl in Hk
–injection Hk as ←
left
apply in_map_iff
exists dk
split ; | exact Hdk
replace j + Z.of_nat0 with j by lia
reflexivity
–right
replace j + Z.of_natSk with j + 1 + Z.of_natk by lia
exact IH_ _ _ _ Hk Hdk

A position of f at index j of the block labelled d, holding the instruction i, comes from a block of f labelled d whose instruction at place j is i, and i defines the name.

275Lemma position_inst
∀ f n d j i
∃b k, Inb fn_blocksf ∧ b_labelb = d ∧ nth_errorb_instsb k = Somei ∧ j = Z.of_natk ∧ Inn mapfst inst_temp_defsi
Explore proof 18 tactics

Initial goal

⊢
∀f : func n d : name j : Z i : inst, Inn, SAtd j, DInsti def_positionsf → ∃b : block k : nat, Inb fn_blocksf ∧ b_labelb = d ∧ nth_errorb_instsb k = Somei ∧ j = Z.of_natk ∧ Inn mapfst inst_temp_defsi

intros f n d j i H

f :
n, d :
j :
Z
i :
H :
⊢
∃b : block k : nat, Inb fn_blocksf ∧ b_labelb = d ∧ nth_errorb_instsb k = Somei ∧ j = Z.of_natk ∧ Inn mapfst inst_temp_defsi

unfold def_positions in H

f :
n, d :
j :
Z
i :
H :
Inn, SAtd j, DInsti mapλp : class × name ⇒ sndp, SParam, DParam fn_paramsf ++ flat_mapblock_positions fn_blocksf
⊢
∃b : block k : nat, Inb fn_blocksf ∧ b_labelb = d ∧ nth_errorb_instsb k = Somei ∧ j = Z.of_natk ∧ Inn mapfst inst_temp_defsi

apply in_app_or in H as H | H

2 open

f :
n, d :
j :
Z
i :
H :
Inn, SAtd j, DInsti mapλp : class × name ⇒ sndp, SParam, DParam fn_paramsf
⊢
∃b : block k : nat, Inb fn_blocksf ∧ b_labelb = d ∧ nth_errorb_instsb k = Somei ∧ j = Z.of_natk ∧ Inn mapfst inst_temp_defsi
focused goal
f :
n, d :
j :
Z
i :
H :
Inn, SAtd j, DInsti flat_mapblock_positions fn_blocksf
⊢
∃b : block k : nat, Inb fn_blocksf ∧ b_labelb = d ∧ nth_errorb_instsb k = Somei ∧ j = Z.of_natk ∧ Inn mapfst inst_temp_defsi

–apply in_map_iff in H as p & E & _

2 open

f :
n, d :
j :
Z
i :
p :
E :
sndp, SParam, DParam = n, SAtd j, DInsti
⊢
∃b : block k : nat, Inb fn_blocksf ∧ b_labelb = d ∧ nth_errorb_instsb k = Somei ∧ j = Z.of_natk ∧ Inn mapfst inst_temp_defsi
deferred goal
f :
n, d :
j :
Z
i :
H :
Inn, SAtd j, DInsti flat_mapblock_positions fn_blocksf
⊢
∃b : block k : nat, Inb fn_blocksf ∧ b_labelb = d ∧ nth_errorb_instsb k = Somei ∧ j = Z.of_natk ∧ Inn mapfst inst_temp_defsi

discriminate E

deferred goal
f :
n, d :
j :
Z
i :
H :
Inn, SAtd j, DInsti flat_mapblock_positions fn_blocksf
⊢
∃b : block k : nat, Inb fn_blocksf ∧ b_labelb = d ∧ nth_errorb_instsb k = Somei ∧ j = Z.of_natk ∧ Inn mapfst inst_temp_defsi

–apply in_flat_map in H as b & Hb & H

f :
n, d :
j :
Z
i :
Hb :
H :
⊢
∃b0 : block k : nat, Inb0 fn_blocksf ∧ b_labelb0 = d ∧ nth_errorb_instsb0 k = Somei ∧ j = Z.of_natk ∧ Inn mapfst inst_temp_defsi

unfold block_positions in H

f :
n, d :
j :
Z
i :
Hb :
H :
Inn, SAtd j, DInsti
map
λ ph : phi  ⇒
match ph with
Phid _ _
⇒
d, SAtb_labelb −1, DPhiph
++
⊢
∃b0 : block k : nat, Inb0 fn_blocksf ∧ b_labelb0 = d ∧ nth_errorb_instsb0 k = Somei ∧ j = Z.of_natk ∧ Inn mapfst inst_temp_defsi

apply in_app_or in H as H | H

2 open

f :
n, d :
j :
Z
i :
Hb :
H :
Inn, SAtd j, DInsti
map
λ ph : phi  ⇒
match ph with
Phid _ _
⇒
d, SAtb_labelb −1, DPhiph
⊢
∃b0 : block k : nat, Inb0 fn_blocksf ∧ b_labelb0 = d ∧ nth_errorb_instsb0 k = Somei ∧ j = Z.of_natk ∧ Inn mapfst inst_temp_defsi
focused goal
f :
n, d :
j :
Z
i :
Hb :
⊢
∃b0 : block k : nat, Inb0 fn_blocksf ∧ b_labelb0 = d ∧ nth_errorb_instsb0 k = Somei ∧ j = Z.of_natk ∧ Inn mapfst inst_temp_defsi

+apply in_map_iff in H as d′ k′ pairs & E & _

2 open

f :
n, d :
j :
Z
i :
Hb :
d′ :
k′ :
pairs :
listname × value
E :
d′, SAtb_labelb −1, DPhiPhid′ k′ pairs = n, SAtd j, DInsti
⊢
∃b0 : block k : nat, Inb0 fn_blocksf ∧ b_labelb0 = d ∧ nth_errorb_instsb0 k = Somei ∧ j = Z.of_natk ∧ Inn mapfst inst_temp_defsi
deferred goal
f :
n, d :
j :
Z
i :
Hb :
⊢
∃b0 : block k : nat, Inb0 fn_blocksf ∧ b_labelb0 = d ∧ nth_errorb_instsb0 k = Somei ∧ j = Z.of_natk ∧ Inn mapfst inst_temp_defsi

discriminate E

deferred goal
f :
n, d :
j :
Z
i :
Hb :
⊢
∃b0 : block k : nat, Inb0 fn_blocksf ∧ b_labelb0 = d ∧ nth_errorb_instsb0 k = Somei ∧ j = Z.of_natk ∧ Inn mapfst inst_temp_defsi

+destruct inst_positions_in_ _ _ _ _ _ H as k & i′ & Hk & Es & Ed & Hn

f :
n, d :
j :
Z
i :
Hb :
k :
nat
i′ :
Hk :
nth_errorb_instsb k = Somei′
Es :
SAtd j = SAtb_labelb 0 + Z.of_natk
Ed :
DInsti = DInsti′
Hn :
Inn mapfst inst_temp_defsi′
⊢
∃b0 : block k0 : nat, Inb0 fn_blocksf ∧ b_labelb0 = d ∧ nth_errorb_instsb0 k0 = Somei ∧ j = Z.of_natk0 ∧ Inn mapfst inst_temp_defsi

injection Es as Ed′ Ej

f :
n, d :
j :
Z
i :
Hb :
k :
nat
i′ :
Hk :
nth_errorb_instsb k = Somei′
Ed′ :
d = b_labelb
Ej :
j = Z.of_natk
Ed :
DInsti = DInsti′
Hn :
Inn mapfst inst_temp_defsi′
⊢
∃b0 : block k0 : nat, Inb0 fn_blocksf ∧ b_labelb0 = d ∧ nth_errorb_instsb0 k0 = Somei ∧ j = Z.of_natk0 ∧ Inn mapfst inst_temp_defsi

injection Ed as ←

f :
n, d :
j :
Z
i :
Hb :
k :
nat
Hk :
nth_errorb_instsb k = Somei
Ed′ :
d = b_labelb
Ej :
j = Z.of_natk
Hn :
Inn mapfst inst_temp_defsi
⊢
∃b0 : block k0 : nat, Inb0 fn_blocksf ∧ b_labelb0 = d ∧ nth_errorb_instsb0 k0 = Somei ∧ j = Z.of_natk0 ∧ Inn mapfst inst_temp_defsi

exists b, k

f :
n, d :
j :
Z
i :
Hb :
k :
nat
Hk :
nth_errorb_instsb k = Somei
Ed′ :
d = b_labelb
Ej :
j = Z.of_natk
Hn :
Inn mapfst inst_temp_defsi
⊢
Inb fn_blocksf ∧ b_labelb = d ∧ nth_errorb_instsb k = Somei ∧ j = Z.of_natk ∧ Inn mapfst inst_temp_defsi

split ; exact Hb |

f :
n, d :
j :
Z
i :
Hb :
k :
nat
Hk :
nth_errorb_instsb k = Somei
Ed′ :
d = b_labelb
Ej :
j = Z.of_natk
Hn :
Inn mapfst inst_temp_defsi
⊢
b_labelb = d ∧ nth_errorb_instsb k = Somei ∧ j = Z.of_natk ∧ Inn mapfst inst_temp_defsi

split ; exact eq_symEd′ |

f :
n, d :
j :
Z
i :
Hb :
k :
nat
Hk :
nth_errorb_instsb k = Somei
Ed′ :
d = b_labelb
Ej :
j = Z.of_natk
Hn :
Inn mapfst inst_temp_defsi
⊢
nth_errorb_instsb k = Somei ∧ j = Z.of_natk ∧ Inn mapfst inst_temp_defsi

split ; exact Hk |

f :
n, d :
j :
Z
i :
Hb :
k :
nat
Hk :
nth_errorb_instsb k = Somei
Ed′ :
d = b_labelb
Ej :
j = Z.of_natk
Hn :
Inn mapfst inst_temp_defsi
⊢
j = Z.of_natk ∧ Inn mapfst inst_temp_defsi

split ; lia | exact Hn

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros f n d j i H
unfold def_positions in H
apply in_app_or in H as H | H
–apply in_map_iff in H as p & E & _
discriminate E
–apply in_flat_map in H as b & Hb & H
unfold block_positions in H
apply in_app_or in H as H | H
+apply in_map_iff in H as d′ k′ pairs & E & _
discriminate E
+destruct inst_positions_in_ _ _ _ _ _ H as k & i′ & Hk & Es & Ed & Hn
injection Es as Ed′ Ej
injection Ed as ←
exists b, k
split ; exact Hb |
split ; exact eq_symEd′ |
split ; exact Hk |
split ; lia | exact Hn

The instruction i at place k of a block b of f defines each of its temporaries dk at index k of b.

292Lemma inst_position
∀ f b k i dk
nth_errorb_instsb k = Somei
Infstdk, SAtb_labelb Z.of_natk, DInsti def_positionsf
Explore proof 11 tactics

Initial goal

⊢
∀f : func b : block k : nat i : inst dk : name × class, Inb fn_blocksf → nth_errorb_instsb k = Somei → Indk inst_temp_defsi → Infstdk, SAtb_labelb Z.of_natk, DInsti def_positionsf

intros f b k i dk Hb Hk Hdk

f :
k :
nat
i :
dk :
Hb :
Hk :
nth_errorb_instsb k = Somei
Hdk :
⊢
Infstdk, SAtb_labelb Z.of_natk, DInsti def_positionsf

unfold def_positions

f :
k :
nat
i :
dk :
Hb :
Hk :
nth_errorb_instsb k = Somei
Hdk :
⊢
Infstdk, SAtb_labelb Z.of_natk, DInsti mapλp : class × name ⇒ sndp, SParam, DParam fn_paramsf ++ flat_mapblock_positions fn_blocksf

apply in_or_app

f :
k :
nat
i :
dk :
Hb :
Hk :
nth_errorb_instsb k = Somei
Hdk :
⊢
Infstdk, SAtb_labelb Z.of_natk, DInsti mapλp : class × name ⇒ sndp, SParam, DParam fn_paramsf ∨ Infstdk, SAtb_labelb Z.of_natk, DInsti flat_mapblock_positions fn_blocksf

right

f :
k :
nat
i :
dk :
Hb :
Hk :
nth_errorb_instsb k = Somei
Hdk :
⊢
Infstdk, SAtb_labelb Z.of_natk, DInsti flat_mapblock_positions fn_blocksf

apply in_flat_map

f :
k :
nat
i :
dk :
Hb :
Hk :
nth_errorb_instsb k = Somei
Hdk :
⊢
∃x : block, Inx fn_blocksf ∧ Infstdk, SAtb_labelb Z.of_natk, DInsti block_positionsx

exists b

f :
k :
nat
i :
dk :
Hb :
Hk :
nth_errorb_instsb k = Somei
Hdk :
⊢
Inb fn_blocksf ∧ Infstdk, SAtb_labelb Z.of_natk, DInsti block_positionsb

split ; exact Hb |

f :
k :
nat
i :
dk :
Hb :
Hk :
nth_errorb_instsb k = Somei
Hdk :
⊢
Infstdk, SAtb_labelb Z.of_natk, DInsti block_positionsb

unfold block_positions

f :
k :
nat
i :
dk :
Hb :
Hk :
nth_errorb_instsb k = Somei
Hdk :
⊢
Infstdk, SAtb_labelb Z.of_natk, DInsti
map
λ ph : phi  ⇒
match ph with
Phid _ _
⇒
d, SAtb_labelb −1, DPhiph
++

apply in_or_app

f :
k :
nat
i :
dk :
Hb :
Hk :
nth_errorb_instsb k = Somei
Hdk :
⊢
Infstdk, SAtb_labelb Z.of_natk, DInsti
map
λ ph : phi  ⇒
match ph with
Phid _ _
⇒
d, SAtb_labelb −1, DPhiph
∨
Infstdk, SAtb_labelb Z.of_natk, DInsti inst_positionsb_labelb 0 b_instsb

right

f :
k :
nat
i :
dk :
Hb :
Hk :
nth_errorb_instsb k = Somei
Hdk :
⊢
Infstdk, SAtb_labelb Z.of_natk, DInsti inst_positionsb_labelb 0 b_instsb

exact inst_positions_nth_ 0 _ _ _ _ Hk Hdk

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros f b k i dk Hb Hk Hdk
apply in_or_app
right
apply in_flat_map
exists b
split ; exact Hb |
apply in_or_app
right
exact inst_positions_nth_ 0 _ _ _ _ Hk Hdk

A phi of a block b of f defines its name d at index -1 of b.

302Lemma phi_position
∀ f b d k pairs
InPhid k pairs b_phisb
Ind, SAtb_labelb −1, DPhiPhid k pairs def_positionsf
Explore proof 13 tactics

Initial goal

⊢
∀f : func b : block d : name k : class pairs : listname × value, Inb fn_blocksf → InPhid k pairs b_phisb → Ind, SAtb_labelb −1, DPhiPhid k pairs def_positionsf

intros f b d k pairs Hb Hp

f :
d :
pairs :
listname × value
Hb :
Hp :
InPhid k pairs b_phisb
⊢
Ind, SAtb_labelb −1, DPhiPhid k pairs def_positionsf

unfold def_positions

f :
d :
pairs :
listname × value
Hb :
Hp :
InPhid k pairs b_phisb
⊢
Ind, SAtb_labelb −1, DPhiPhid k pairs mapλp : class × name ⇒ sndp, SParam, DParam fn_paramsf ++ flat_mapblock_positions fn_blocksf

apply in_or_app

f :
d :
pairs :
listname × value
Hb :
Hp :
InPhid k pairs b_phisb
⊢
Ind, SAtb_labelb −1, DPhiPhid k pairs mapλp : class × name ⇒ sndp, SParam, DParam fn_paramsf ∨ Ind, SAtb_labelb −1, DPhiPhid k pairs flat_mapblock_positions fn_blocksf

right

f :
d :
pairs :
listname × value
Hb :
Hp :
InPhid k pairs b_phisb
⊢
Ind, SAtb_labelb −1, DPhiPhid k pairs flat_mapblock_positions fn_blocksf

apply in_flat_map

f :
d :
pairs :
listname × value
Hb :
Hp :
InPhid k pairs b_phisb
⊢
∃x : block, Inx fn_blocksf ∧ Ind, SAtb_labelb −1, DPhiPhid k pairs block_positionsx

exists b

f :
d :
pairs :
listname × value
Hb :
Hp :
InPhid k pairs b_phisb
⊢
Inb fn_blocksf ∧ Ind, SAtb_labelb −1, DPhiPhid k pairs block_positionsb

split ; exact Hb |

f :
d :
pairs :
listname × value
Hb :
Hp :
InPhid k pairs b_phisb
⊢
Ind, SAtb_labelb −1, DPhiPhid k pairs block_positionsb

unfold block_positions

f :
d :
pairs :
listname × value
Hb :
Hp :
InPhid k pairs b_phisb
⊢
Ind, SAtb_labelb −1, DPhiPhid k pairs
map
λ ph : phi  ⇒
match ph with
Phid0 _ _
⇒
d0, SAtb_labelb −1, DPhiph
++

apply in_or_app

f :
d :
pairs :
listname × value
Hb :
Hp :
InPhid k pairs b_phisb
⊢
Ind, SAtb_labelb −1, DPhiPhid k pairs
map
λ ph : phi  ⇒
match ph with
Phid0 _ _
⇒
d0, SAtb_labelb −1, DPhiph
∨

left

f :
d :
pairs :
listname × value
Hb :
Hp :
InPhid k pairs b_phisb
⊢
Ind, SAtb_labelb −1, DPhiPhid k pairs
map
λ ph : phi  ⇒
match ph with
Phid0 _ _
⇒
d0, SAtb_labelb −1, DPhiph

apply in_map_iff

f :
d :
pairs :
listname × value
Hb :
Hp :
InPhid k pairs b_phisb
⊢
∃ x : phi  ,
match x with
Phid0 _ _
⇒
d0, SAtb_labelb −1, DPhix
=
d, SAtb_labelb −1, DPhiPhid k pairs
∧
Inx b_phisb

exists Phid k pairs

f :
d :
pairs :
listname × value
Hb :
Hp :
InPhid k pairs b_phisb
⊢
d, SAtb_labelb −1, DPhiPhid k pairs = d, SAtb_labelb −1, DPhiPhid k pairs ∧ InPhid k pairs b_phisb

auto

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros f b d k pairs Hb Hp
apply in_or_app
right
apply in_flat_map
exists b
split ; exact Hb |
apply in_or_app
left
apply in_map_iff
exists Phid k pairs
auto

A single definition's operands are not redefined under it

Where dominance between blocks is antisymmetric, as dom_antisym gives, a site s that dominates index j of the block labelled d, where d at j dominates index k of the block labelled l, is not index k of l itself.

316Lemma site_strict
∀ doms d j l k s
∀a b, dominatesdoms a b = true → dominatesdoms b a = true → a = b
site_dominatesdoms d j s = true
site_dominatesdoms l k SAtd j = true
s ≠ SAtl k
Explore proof 9 tactics

Initial goal

⊢
∀doms : nmapZ × Z, ∀a b : name, dominatesdoms a b = true → dominatesdoms b a = true → a = b → ∀d : name j : Z l : name k : Z s : site, site_dominatesdoms d j s = true → site_dominatesdoms l k SAtd j = true → s ≠ SAtl k

intros doms Hanti d j l k s H1 H2 →

doms :
nmapZ × Z
Hanti :
∀a b : name, dominatesdoms a b = true → dominatesdoms b a = true → a = b
d :
j :
Z
l :
k :
Z
H1 :
site_dominatesdoms d j SAtl k = true
H2 :
site_dominatesdoms l k SAtd j = true
⊢
False

unfold site_dominates in H1 , H2

doms :
nmapZ × Z
Hanti :
∀a b : name, dominatesdoms a b = true → dominatesdoms b a = true → a = b
d :
j :
Z
l :
k :
Z
H1 :
→
k <? j
else
dominatesdoms l d
=
true
H2 :
→
j <? k
else
dominatesdoms d l
=
true
⊢
False

rewrite name_eqb_sym_dl d in H1

doms :
nmapZ × Z
Hanti :
∀a b : name, dominatesdoms a b = true → dominatesdoms b a = true → a = b
d :
j :
Z
l :
k :
Z
H1 :
→
k <? j
else
dominatesdoms l d
=
true
H2 :
→
j <? k
else
dominatesdoms d l
=
true
⊢
False

destruct name_eqbd l eqn: E

2 open

doms :
nmapZ × Z
Hanti :
∀a b : name, dominatesdoms a b = true → dominatesdoms b a = true → a = b
d :
j :
Z
l :
k :
Z
E :
name_eqbd l = true
H1 :
k <? j = true
H2 :
j <? k = true
⊢
False
focused goal
doms :
nmapZ × Z
Hanti :
∀a b : name, dominatesdoms a b = true → dominatesdoms b a = true → a = b
d :
j :
Z
l :
k :
Z
E :
name_eqbd l = false
H1 :
dominatesdoms l d = true
H2 :
dominatesdoms d l = true
⊢
False

–apply Z.ltb_lt in H1

2 open

doms :
nmapZ × Z
Hanti :
∀a b : name, dominatesdoms a b = true → dominatesdoms b a = true → a = b
d :
j :
Z
l :
k :
Z
E :
name_eqbd l = true
H1 :
k < j
H2 :
j <? k = true
⊢
False
deferred goal
doms :
nmapZ × Z
Hanti :
∀a b : name, dominatesdoms a b = true → dominatesdoms b a = true → a = b
d :
j :
Z
l :
k :
Z
E :
name_eqbd l = false
H1 :
dominatesdoms l d = true
H2 :
dominatesdoms d l = true
⊢
False

apply Z.ltb_lt in H2

2 open

doms :
nmapZ × Z
Hanti :
∀a b : name, dominatesdoms a b = true → dominatesdoms b a = true → a = b
d :
j :
Z
l :
k :
Z
E :
name_eqbd l = true
H1 :
k < j
H2 :
j < k
⊢
False
deferred goal
doms :
nmapZ × Z
Hanti :
∀a b : name, dominatesdoms a b = true → dominatesdoms b a = true → a = b
d :
j :
Z
l :
k :
Z
E :
name_eqbd l = false
H1 :
dominatesdoms l d = true
H2 :
dominatesdoms d l = true
⊢
False

lia

deferred goal
doms :
nmapZ × Z
Hanti :
∀a b : name, dominatesdoms a b = true → dominatesdoms b a = true → a = b
d :
j :
Z
l :
k :
Z
E :
name_eqbd l = false
H1 :
dominatesdoms l d = true
H2 :
dominatesdoms d l = true
⊢
False

–apply name_eqb_false in E

doms :
nmapZ × Z
Hanti :
∀a b : name, dominatesdoms a b = true → dominatesdoms b a = true → a = b
d :
j :
Z
l :
k :
Z
E :
d ≠ l
H1 :
dominatesdoms l d = true
H2 :
dominatesdoms d l = true
⊢
False

exact Eeq_symHanti_ _ H1 H2

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros doms Hanti d j l k s H1 H2 →
unfold site_dominates in H1 , H2
rewrite name_eqb_sym_dl d in H1
destruct name_eqbd l eqn: E
–apply Z.ltb_lt in H1
apply Z.ltb_lt in H2
lia
–apply name_eqb_false in E
exact Eeq_symHanti_ _ H1 H2

In a function f whose definitions dominate their uses, where the single definition of n by the instruction i, at index j of block d, dominates index k of a reachable block l, no operand x of i that has a single definition is defined at that index. So defining a name at a point leaves every relation in scope there between a definition and its operands' values as it was.

334Theorem no_use_redefined
∀ f b0 rest doms n d j i x l k D
fn_blocksf = b0 :: rest
block_intervalsb0 :: rest = Somedoms
definitions_dominatef doms = true
is_reachabledoms l = true
site_dominatesdoms l k SAtd j = true
Inx, SAtl k, D def_positionsf
False
Explore proof 17 tactics

Initial goal

⊢
∀f : func b0 : block rest : listblock doms : nmapZ × Z n d : name j : Z i : inst x l : name k : Z D : def, fn_blocksf = b0 :: rest → block_intervalsb0 :: rest = Somedoms → definitions_dominatef doms = true → lookupn single_definitionsf = SomeDInsti → Inn, SAtd j, DInsti def_positionsf → is_reachabledoms l = true → site_dominatesdoms l k SAtd j = true → Inx, SAtl k, D def_positionsf → once_hassingle_definitionsf x = true → Inx inst_usesi → False

intros f b0 rest doms n d j i x l k D Hf Hdoms Hdd Hn Hpos Hr Hsd Hx Honce Hu

f :
b0 :
rest :
listblock
doms :
nmapZ × Z
n, d :
j :
Z
i :
x, l :
k :
Z
D :
Hf :
fn_blocksf = b0 :: rest
Hdoms :
block_intervalsb0 :: rest = Somedoms
Hdd :
definitions_dominatef doms = true
Hpos :
Hr :
is_reachabledoms l = true
Hsd :
site_dominatesdoms l k SAtd j = true
Hx :
Inx, SAtl k, D def_positionsf
Honce :
Hu :
⊢
False

destruct position_inst_ _ _ _ _ Hpos as b & kk & Hb & Hl & Hkk & → & _

f :
b0 :
rest :
listblock
doms :
nmapZ × Z
n, d :
i :
x, l :
k :
Z
D :
Hf :
fn_blocksf = b0 :: rest
Hdoms :
block_intervalsb0 :: rest = Somedoms
Hdd :
definitions_dominatef doms = true
kk :
nat
Hpos :
Inn, SAtd Z.of_natkk, DInsti def_positionsf
Hr :
is_reachabledoms l = true
Hsd :
site_dominatesdoms l k SAtd Z.of_natkk = true
Hx :
Inx, SAtl k, D def_positionsf
Honce :
Hu :
Hb :
Hl :
b_labelb = d
Hkk :
nth_errorb_instsb kk = Somei
⊢
False

assert Hrd : is_reachabledoms d = true

2 open

f :
b0 :
rest :
listblock
doms :
nmapZ × Z
n, d :
i :
x, l :
k :
Z
D :
Hf :
fn_blocksf = b0 :: rest
Hdoms :
block_intervalsb0 :: rest = Somedoms
Hdd :
definitions_dominatef doms = true
kk :
nat
Hpos :
Inn, SAtd Z.of_natkk, DInsti def_positionsf
Hr :
is_reachabledoms l = true
Hsd :
site_dominatesdoms l k SAtd Z.of_natkk = true
Hx :
Inx, SAtl k, D def_positionsf
Honce :
Hu :
Hb :
Hl :
b_labelb = d
Hkk :
nth_errorb_instsb kk = Somei
⊢
is_reachabledoms d = true
focused goal
f :
b0 :
rest :
listblock
doms :
nmapZ × Z
n, d :
i :
x, l :
k :
Z
D :
Hf :
fn_blocksf = b0 :: rest
Hdoms :
block_intervalsb0 :: rest = Somedoms
Hdd :
definitions_dominatef doms = true
kk :
nat
Hpos :
Inn, SAtd Z.of_natkk, DInsti def_positionsf
Hr :
is_reachabledoms l = true
Hsd :
site_dominatesdoms l k SAtd Z.of_natkk = true
Hx :
Inx, SAtl k, D def_positionsf
Honce :
Hu :
Hb :
Hl :
b_labelb = d
Hkk :
nth_errorb_instsb kk = Somei
Hrd :
is_reachabledoms d = true
⊢
False

{unfold site_dominates in Hsd

2 open

f :
b0 :
rest :
listblock
doms :
nmapZ × Z
n, d :
i :
x, l :
k :
Z
D :
Hf :
fn_blocksf = b0 :: rest
Hdoms :
block_intervalsb0 :: rest = Somedoms
Hdd :
definitions_dominatef doms = true
kk :
nat
Hpos :
Inn, SAtd Z.of_natkk, DInsti def_positionsf
Hr :
is_reachabledoms l = true
Hsd :
→
Z.of_natkk <? k
else
dominatesdoms d l
=
true
Hx :
Inx, SAtl k, D def_positionsf
Honce :
Hu :
Hb :
Hl :
b_labelb = d
Hkk :
nth_errorb_instsb kk = Somei
⊢
is_reachabledoms d = true
deferred goal
f :
b0 :
rest :
listblock
doms :
nmapZ × Z
n, d :
i :
x, l :
k :
Z
D :
Hf :
fn_blocksf = b0 :: rest
Hdoms :
block_intervalsb0 :: rest = Somedoms
Hdd :
definitions_dominatef doms = true
kk :
nat
Hpos :
Inn, SAtd Z.of_natkk, DInsti def_positionsf
Hr :
is_reachabledoms l = true
Hsd :
site_dominatesdoms l k SAtd Z.of_natkk = true
Hx :
Inx, SAtl k, D def_positionsf
Honce :
Hu :
Hb :
Hl :
b_labelb = d
Hkk :
nth_errorb_instsb kk = Somei
Hrd :
is_reachabledoms d = true
⊢
False

destruct name_eqbd l eqn: E

3 open

f :
b0 :
rest :
listblock
doms :
nmapZ × Z
n, d :
i :
x, l :
k :
Z
D :
Hf :
fn_blocksf = b0 :: rest
Hdoms :
block_intervalsb0 :: rest = Somedoms
Hdd :
definitions_dominatef doms = true
kk :
nat
Hpos :
Inn, SAtd Z.of_natkk, DInsti def_positionsf
Hr :
is_reachabledoms l = true
E :
name_eqbd l = true
Hsd :
Z.of_natkk <? k = true
Hx :
Inx, SAtl k, D def_positionsf
Honce :
Hu :
Hb :
Hl :
b_labelb = d
Hkk :
nth_errorb_instsb kk = Somei
⊢
is_reachabledoms d = true
focused goal
f :
b0 :
rest :
listblock
doms :
nmapZ × Z
n, d :
i :
x, l :
k :
Z
D :
Hf :
fn_blocksf = b0 :: rest
Hdoms :
block_intervalsb0 :: rest = Somedoms
Hdd :
definitions_dominatef doms = true
kk :
nat
Hpos :
Inn, SAtd Z.of_natkk, DInsti def_positionsf
Hr :
is_reachabledoms l = true
E :
name_eqbd l = false
Hsd :
dominatesdoms d l = true
Hx :
Inx, SAtl k, D def_positionsf
Honce :
Hu :
Hb :
Hl :
b_labelb = d
Hkk :
nth_errorb_instsb kk = Somei
⊢
is_reachabledoms d = true
deferred goal
f :
b0 :
rest :
listblock
doms :
nmapZ × Z
n, d :
i :
x, l :
k :
Z
D :
Hf :
fn_blocksf = b0 :: rest
Hdoms :
block_intervalsb0 :: rest = Somedoms
Hdd :
definitions_dominatef doms = true
kk :
nat
Hpos :
Inn, SAtd Z.of_natkk, DInsti def_positionsf
Hr :
is_reachabledoms l = true
Hsd :
site_dominatesdoms l k SAtd Z.of_natkk = true
Hx :
Inx, SAtl k, D def_positionsf
Honce :
Hu :
Hb :
Hl :
b_labelb = d
Hkk :
nth_errorb_instsb kk = Somei
Hrd :
is_reachabledoms d = true
⊢
False

–apply name_eqb_true in E

3 open

f :
b0 :
rest :
listblock
doms :
nmapZ × Z
n, d :
i :
x, l :
k :
Z
D :
Hf :
fn_blocksf = b0 :: rest
Hdoms :
block_intervalsb0 :: rest = Somedoms
Hdd :
definitions_dominatef doms = true
kk :
nat
Hpos :
Inn, SAtd Z.of_natkk, DInsti def_positionsf
Hr :
is_reachabledoms l = true
E :
d = l
Hsd :
Z.of_natkk <? k = true
Hx :
Inx, SAtl k, D def_positionsf
Honce :
Hu :
Hb :
Hl :
b_labelb = d
Hkk :
nth_errorb_instsb kk = Somei
⊢
is_reachabledoms d = true
deferred goal
f :
b0 :
rest :
listblock
doms :
nmapZ × Z
n, d :
i :
x, l :
k :
Z
D :
Hf :
fn_blocksf = b0 :: rest
Hdoms :
block_intervalsb0 :: rest = Somedoms
Hdd :
definitions_dominatef doms = true
kk :
nat
Hpos :
Inn, SAtd Z.of_natkk, DInsti def_positionsf
Hr :
is_reachabledoms l = true
E :
name_eqbd l = false
Hsd :
dominatesdoms d l = true
Hx :
Inx, SAtl k, D def_positionsf
Honce :
Hu :
Hb :
Hl :
b_labelb = d
Hkk :
nth_errorb_instsb kk = Somei
⊢
is_reachabledoms d = true
deferred goal
f :
b0 :
rest :
listblock
doms :
nmapZ × Z
n, d :
i :
x, l :
k :
Z
D :
Hf :
fn_blocksf = b0 :: rest
Hdoms :
block_intervalsb0 :: rest = Somedoms
Hdd :
definitions_dominatef doms = true
kk :
nat
Hpos :
Inn, SAtd Z.of_natkk, DInsti def_positionsf
Hr :
is_reachabledoms l = true
Hsd :
site_dominatesdoms l k SAtd Z.of_natkk = true
Hx :
Inx, SAtl k, D def_positionsf
Honce :
Hu :
Hb :
Hl :
b_labelb = d
Hkk :
nth_errorb_instsb kk = Somei
Hrd :
is_reachabledoms d = true
⊢
False

subst

3 open

f :
b0 :
rest :
listblock
doms :
nmapZ × Z
n :
i :
x :
k :
Z
D :
Hf :
fn_blocksf = b0 :: rest
Hdoms :
block_intervalsb0 :: rest = Somedoms
Hdd :
definitions_dominatef doms = true
kk :
nat
Hr :
is_reachabledoms b_labelb = true
Hpos :
Inn, SAtb_labelb Z.of_natkk, DInsti def_positionsf
Hsd :
Z.of_natkk <? k = true
Hx :
Honce :
Hu :
Hb :
Hkk :
nth_errorb_instsb kk = Somei
⊢
is_reachabledoms b_labelb = true
deferred goal
f :
b0 :
rest :
listblock
doms :
nmapZ × Z
n, d :
i :
x, l :
k :
Z
D :
Hf :
fn_blocksf = b0 :: rest
Hdoms :
block_intervalsb0 :: rest = Somedoms
Hdd :
definitions_dominatef doms = true
kk :
nat
Hpos :
Inn, SAtd Z.of_natkk, DInsti def_positionsf
Hr :
is_reachabledoms l = true
E :
name_eqbd l = false
Hsd :
dominatesdoms d l = true
Hx :
Inx, SAtl k, D def_positionsf
Honce :
Hu :
Hb :
Hl :
b_labelb = d
Hkk :
nth_errorb_instsb kk = Somei
⊢
is_reachabledoms d = true
deferred goal
f :
b0 :
rest :
listblock
doms :
nmapZ × Z
n, d :
i :
x, l :
k :
Z
D :
Hf :
fn_blocksf = b0 :: rest
Hdoms :
block_intervalsb0 :: rest = Somedoms
Hdd :
definitions_dominatef doms = true
kk :
nat
Hpos :
Inn, SAtd Z.of_natkk, DInsti def_positionsf
Hr :
is_reachabledoms l = true
Hsd :
site_dominatesdoms l k SAtd Z.of_natkk = true
Hx :
Inx, SAtl k, D def_positionsf
Honce :
Hu :
Hb :
Hl :
b_labelb = d
Hkk :
nth_errorb_instsb kk = Somei
Hrd :
is_reachabledoms d = true
⊢
False

exact Hr

2 open

deferred goal
f :
b0 :
rest :
listblock
doms :
nmapZ × Z
n, d :
i :
x, l :
k :
Z
D :
Hf :
fn_blocksf = b0 :: rest
Hdoms :
block_intervalsb0 :: rest = Somedoms
Hdd :
definitions_dominatef doms = true
kk :
nat
Hpos :
Inn, SAtd Z.of_natkk, DInsti def_positionsf
Hr :
is_reachabledoms l = true
E :
name_eqbd l = false
Hsd :
dominatesdoms d l = true
Hx :
Inx, SAtl k, D def_positionsf
Honce :
Hu :
Hb :
Hl :
b_labelb = d
Hkk :
nth_errorb_instsb kk = Somei
⊢
is_reachabledoms d = true
deferred goal
f :
b0 :
rest :
listblock
doms :
nmapZ × Z
n, d :
i :
x, l :
k :
Z
D :
Hf :
fn_blocksf = b0 :: rest
Hdoms :
block_intervalsb0 :: rest = Somedoms
Hdd :
definitions_dominatef doms = true
kk :
nat
Hpos :
Inn, SAtd Z.of_natkk, DInsti def_positionsf
Hr :
is_reachabledoms l = true
Hsd :
site_dominatesdoms l k SAtd Z.of_natkk = true
Hx :
Inx, SAtl k, D def_positionsf
Honce :
Hu :
Hb :
Hl :
b_labelb = d
Hkk :
nth_errorb_instsb kk = Somei
Hrd :
is_reachabledoms d = true
⊢
False

–exact proj1dominates_reachable_ _ _ Hdoms _ _ Hsd

deferred goal
f :
b0 :
rest :
listblock
doms :
nmapZ × Z
n, d :
i :
x, l :
k :
Z
D :
Hf :
fn_blocksf = b0 :: rest
Hdoms :
block_intervalsb0 :: rest = Somedoms
Hdd :
definitions_dominatef doms = true
kk :
nat
Hpos :
Inn, SAtd Z.of_natkk, DInsti def_positionsf
Hr :
is_reachabledoms l = true
Hsd :
site_dominatesdoms l k SAtd Z.of_natkk = true
Hx :
Inx, SAtl k, D def_positionsf
Honce :
Hu :
Hb :
Hl :
b_labelb = d
Hkk :
nth_errorb_instsb kk = Somei
Hrd :
is_reachabledoms d = true
⊢
False

unfold once_has in Honce

f :
b0 :
rest :
listblock
doms :
nmapZ × Z
n, d :
i :
x, l :
k :
Z
D :
Hf :
fn_blocksf = b0 :: rest
Hdoms :
block_intervalsb0 :: rest = Somedoms
Hdd :
definitions_dominatef doms = true
kk :
nat
Hpos :
Inn, SAtd Z.of_natkk, DInsti def_positionsf
Hr :
is_reachabledoms l = true
Hsd :
site_dominatesdoms l k SAtd Z.of_natkk = true
Hx :
Inx, SAtl k, D def_positionsf
Honce :
Some_
⇒
true
None
⇒
false
=
true
Hu :
Hb :
Hl :
b_labelb = d
Hkk :
nth_errorb_instsb kk = Somei
Hrd :
is_reachabledoms d = true
⊢
False

destruct lookupx single_definitionsf as dx | eqn: Ex ; | discriminate Honce

f :
b0 :
rest :
listblock
doms :
nmapZ × Z
n, d :
i :
x, l :
k :
Z
D :
Hf :
fn_blocksf = b0 :: rest
Hdoms :
block_intervalsb0 :: rest = Somedoms
Hdd :
definitions_dominatef doms = true
kk :
nat
Hpos :
Inn, SAtd Z.of_natkk, DInsti def_positionsf
Hr :
is_reachabledoms l = true
Hsd :
site_dominatesdoms l k SAtd Z.of_natkk = true
Hx :
Inx, SAtl k, D def_positionsf
dx :
Ex :
Honce :
true = true
Hu :
Hb :
Hl :
b_labelb = d
Hkk :
nth_errorb_instsb kk = Somei
Hrd :
is_reachabledoms d = true
⊢
False

subst d

f :
b0 :
rest :
listblock
doms :
nmapZ × Z
n :
i :
x, l :
k :
Z
D :
Hf :
fn_blocksf = b0 :: rest
Hdoms :
block_intervalsb0 :: rest = Somedoms
Hdd :
definitions_dominatef doms = true
kk :
nat
Hpos :
Inn, SAtb_labelb Z.of_natkk, DInsti def_positionsf
Hr :
is_reachabledoms l = true
Hsd :
site_dominatesdoms l k SAtb_labelb Z.of_natkk = true
Hx :
Inx, SAtl k, D def_positionsf
dx :
Ex :
Honce :
true = true
Hu :
Hb :
Hkk :
nth_errorb_instsb kk = Somei
Hrd :
is_reachabledoms b_labelb = true
⊢
False

destruct use_dominated_ _ _ _ _ _ _ Hdd Hb Hrd Hkk Hu Ex as s & Hs & Hsdom

f :
b0 :
rest :
listblock
doms :
nmapZ × Z
n :
i :
x, l :
k :
Z
D :
Hf :
fn_blocksf = b0 :: rest
Hdoms :
block_intervalsb0 :: rest = Somedoms
Hdd :
definitions_dominatef doms = true
kk :
nat
Hpos :
Inn, SAtb_labelb Z.of_natkk, DInsti def_positionsf
Hr :
is_reachabledoms l = true
Hsd :
site_dominatesdoms l k SAtb_labelb Z.of_natkk = true
Hx :
Inx, SAtl k, D def_positionsf
dx :
Ex :
Honce :
true = true
Hu :
Hb :
Hkk :
nth_errorb_instsb kk = Somei
Hrd :
is_reachabledoms b_labelb = true
s :
Hs :
Inx, s, dx def_positionsf
Hsdom :
site_dominatesdoms b_labelb Z.of_natkk s = true
⊢
False

destruct once_position_ _ _ Ex as s0 & Hs0 & Huniq

f :
b0 :
rest :
listblock
doms :
nmapZ × Z
n :
i :
x, l :
k :
Z
D :
Hf :
fn_blocksf = b0 :: rest
Hdoms :
block_intervalsb0 :: rest = Somedoms
Hdd :
definitions_dominatef doms = true
kk :
nat
Hpos :
Inn, SAtb_labelb Z.of_natkk, DInsti def_positionsf
Hr :
is_reachabledoms l = true
Hsd :
site_dominatesdoms l k SAtb_labelb Z.of_natkk = true
Hx :
Inx, SAtl k, D def_positionsf
dx :
Ex :
Honce :
true = true
Hu :
Hb :
Hkk :
nth_errorb_instsb kk = Somei
Hrd :
is_reachabledoms b_labelb = true
s :
Hs :
Inx, s, dx def_positionsf
Hsdom :
site_dominatesdoms b_labelb Z.of_natkk s = true
s0 :
Hs0 :
Inx, s0, dx def_positionsf
Huniq :
∀s′ : site d′ : def, Inx, s′, d′ def_positionsf → s′ = s0 ∧ d′ = dx
⊢
False

destruct Huniq_ _ Hs as → _

f :
b0 :
rest :
listblock
doms :
nmapZ × Z
n :
i :
x, l :
k :
Z
D :
Hf :
fn_blocksf = b0 :: rest
Hdoms :
block_intervalsb0 :: rest = Somedoms
Hdd :
definitions_dominatef doms = true
kk :
nat
Hpos :
Inn, SAtb_labelb Z.of_natkk, DInsti def_positionsf
Hr :
is_reachabledoms l = true
Hsd :
site_dominatesdoms l k SAtb_labelb Z.of_natkk = true
Hx :
Inx, SAtl k, D def_positionsf
dx :
Ex :
Honce :
true = true
Hu :
Hb :
Hkk :
nth_errorb_instsb kk = Somei
Hrd :
is_reachabledoms b_labelb = true
s0 :
Hsdom :
site_dominatesdoms b_labelb Z.of_natkk s0 = true
Hs, Hs0 :
Inx, s0, dx def_positionsf
Huniq :
∀s′ : site d′ : def, Inx, s′, d′ def_positionsf → s′ = s0 ∧ d′ = dx
⊢
False

destruct Huniq_ _ Hx as Esite _

f :
b0 :
rest :
listblock
doms :
nmapZ × Z
n :
i :
x, l :
k :
Z
D :
Hf :
fn_blocksf = b0 :: rest
Hdoms :
block_intervalsb0 :: rest = Somedoms
Hdd :
definitions_dominatef doms = true
kk :
nat
Hpos :
Inn, SAtb_labelb Z.of_natkk, DInsti def_positionsf
Hr :
is_reachabledoms l = true
Hsd :
site_dominatesdoms l k SAtb_labelb Z.of_natkk = true
Hx :
Inx, SAtl k, D def_positionsf
dx :
Ex :
Honce :
true = true
Hu :
Hb :
Hkk :
nth_errorb_instsb kk = Somei
Hrd :
is_reachabledoms b_labelb = true
s0 :
Hsdom :
site_dominatesdoms b_labelb Z.of_natkk s0 = true
Hs, Hs0 :
Inx, s0, dx def_positionsf
Huniq :
∀s′ : site d′ : def, Inx, s′, d′ def_positionsf → s′ = s0 ∧ d′ = dx
Esite :
SAtl k = s0
⊢
False

exact site_strictdoms dom_antisym_ _ _ Hdoms _ _ _ _ _ Hsdom Hsd eq_symEsite

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros f b0 rest doms n d j i x l k D Hf Hdoms Hdd Hn Hpos Hr Hsd Hx Honce Hu
destruct position_inst_ _ _ _ _ Hpos as b & kk & Hb & Hl & Hkk & → & _
assert Hrd : is_reachabledoms d = true
{unfold site_dominates in Hsd
destruct name_eqbd l eqn: E
–apply name_eqb_true in E
subst
exact Hr
–exact proj1dominates_reachable_ _ _ Hdoms _ _ Hsd
unfold once_has in Honce
destruct lookupx single_definitionsf as dx | eqn: Ex ; | discriminate Honce
subst d
destruct use_dominated_ _ _ _ _ _ _ Hdd Hb Hrd Hkk Hu Ex as s & Hs & Hsdom
destruct once_position_ _ _ Ex as s0 & Hs0 & Huniq
destruct Huniq_ _ Hs as → _
destruct Huniq_ _ Hx as Esite _
exact site_strictdoms dom_antisym_ _ _ Hdoms _ _ _ _ _ Hsdom Hsd eq_symEsite

Definitions that dominate a point

The dominator intervals of the function f as the validator computed them (block_intervals), or the empty map where it computed none.

361Definition fn_domsf : func : nmapZ × Z ≔
Somedoms
⇒
doms
None
⇒

The single definition of n in f is at a site that dominates index k of the block labelled l, by the validator's intervals fn_doms.

366Definition dominatingf : func l : name k : Z n : name : Prop ≔
∃s D, lookupn single_definitionsf = SomeD ∧ Inn, s, D def_positionsf ∧ site_dominatesfn_domsf l k s = true