Fil-C on Nix

Filnix wiki

the formal campaign

rocq/theories/HiLogic.v

tests/c/prog/hi.c through the program logic of Logic.v, with puts called through Campaign 4's contract (puts_contract).

Hi.v proves hi's body safe by hand: an invariant over the labelled machine's states with a case for each of main's four points, and a lemma for each kind of labelled step at each. This file proves the same body in Iris, by one rule per instruction and StringLogic.v's triple for puts (wp_puts):

  • the program owns its literal str.10 as a string: its life and its six bytes (lit_ps);
  • the world interpretation is stdio_wi: puts's rep and stdio_ready, and the world's writable roots apart from the program's live objects; a safepoint keeps it under Hi.v's premise that it keeps rep and readiness;
  • main enters, copies the literal, calls puts and returns 0 (main_spec), and Iris adequacy for the labelled machine (heap_labelled_safe) makes that hi_logic_safe.

The theorem's premises beyond Hi.v's hi_before_call are the logic's own: the runtime ready, the live objects apart, and the world's roots apart from the literal (literal_apart). Its conclusion is the logic's: no run stops with a failure_ending, and main returns 0; Hi.v's hi_ending lists the stops that remain by name. docs/logic.md compares the two proofs.

From iris.proofmode Require Import proofmode
From iris.base_logic.lib Require Import gen_heap
From iris.program_logic Require Import language weakestpre
From Stdlib Require Import ZArith Lia
From Stdlib Require String
From Nanofil Require Import Term Syntax Values Memory Runtime Ops Semantics Run Machine Panics ExternalCalls ExternalMachine Pieces Heap ContractFrame Language Logic StringLogic Hi
Open Scope Z_scope
Open Scope list_scope

The literal

The literal's object, str.10's region in the module's layout.

40Definition lit_reg: region ≔

The literal's bytes: hello and its NUL.

43Definition lit_bytes: listZ ≔

The pieces of the literal the program owns, as a string: its life and its six bytes.

47Definition lit_ps: listpiece × pval ≔

The literal is a string in its object.

Explore proof 5 tactics

Initial goal

unfold string_ok

⊢
ptr_caphi_literal = Obj65552 ∨ ptr_caphi_literal = Ro65552 ∧ 0 < 65552 ∧ 65552 ≤ ptr_addrhi_literal ∧ ptr_addrhi_literal + lengthhello_bytes + 1 ≤ r_endlit_reg ∧ r_endlit_reg ≤ 2 ^ 48 ∧ Forallλx : Z ⇒ 0 < x < 256 hello_bytes

cbn

⊢
Ro65552 = Obj65552 ∨ Ro65552 = Ro65552 ∧ 0 < 65552 ∧ 65552 ≤ 65552 ∧ 65552 + 5%nat + 1 ≤ 65560 ∧ 65560 ≤ 2 ^ 48 ∧ Forallλx : Z ⇒ 0 < x < 256 hello_bytes

split ; right ; reflexivity |

⊢
0 < 65552 ∧ 65552 ≤ 65552 ∧ 65552 + 5%nat + 1 ≤ 65560 ∧ 65560 ≤ 2 ^ 48 ∧ Forallλx : Z ⇒ 0 < x < 256 hello_bytes

repeat split ; try lia

⊢
Forallλx : Z ⇒ 0 < x < 256 hello_bytes

repeat constructor ; lia

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
unfold string_ok
cbn
split ; right ; reflexivity |
repeat split ; try lia
repeat constructor ; lia

The six byte pieces, one by one.

54Lemma lit_ps_cases
∀ l v
l, v ∈ lit_ps
l, v = PLive65552, VLivelit_reg ∨ ∃i, 0 ≤ i < 6 ∧ l = PByte65552 i ∧ v = VBytenthZ.to_nati lit_bytes 0
Explore proof 4 tactics

Initial goal

v :
⊢
l, v ∈ lit_ps → l, v = PLive65552, VLivelit_reg ∨ ∃i : Z, 0 ≤ i < 6 ∧ l = PByte65552 i ∧ v = VBytenthZ.to_nati lit_bytes 0

cbn

v :
⊢
l, v ∈ lit_ps
→
l, v = PLive65552, VLivelit_reg
∨
∃ i : Z  ,
0 ≤ i < 6
∧
l = PByte65552 i
∧
v
=
match Z.to_nati with
0%nat
⇒
104
1%nat
⇒
101
2%nat | 3%nat
⇒
108
4%nat
⇒
111
_
⇒
0

rewrite ! elem_of_cons elem_of_nil

v :
⊢
l, v = PLive65552, VLivelit_reg ∨ l, v = PByte65552 0%nat + ptr_addrhi_literal − 65552, VByte104 ∨ l, v = PByte65552 1%nat + ptr_addrhi_literal − 65552, VByte101 ∨ l, v = PByte65552 2%nat + ptr_addrhi_literal − 65552, VByte108 ∨ l, v = PByte65552 3%nat + ptr_addrhi_literal − 65552, VByte108 ∨ l, v = PByte65552 4%nat + ptr_addrhi_literal − 65552, VByte111 ∨ l, v = PByte65552 5%nat + ptr_addrhi_literal − 65552, VByte0 ∨ False
→
l, v = PLive65552, VLivelit_reg
∨
∃ i : Z  ,
0 ≤ i < 6
∧
l = PByte65552 i
∧
v
=
match Z.to_nati with
0%nat
⇒
104
1%nat
⇒
101
2%nat | 3%nat
⇒
108
4%nat
⇒
111
_
⇒
0

intros Hp | Hp ; left ; exact Hp | right

v :
Hp :
l, v = PByte65552 0%nat + ptr_addrhi_literal − 65552, VByte104 ∨ l, v = PByte65552 1%nat + ptr_addrhi_literal − 65552, VByte101 ∨ l, v = PByte65552 2%nat + ptr_addrhi_literal − 65552, VByte108 ∨ l, v = PByte65552 3%nat + ptr_addrhi_literal − 65552, VByte108 ∨ l, v = PByte65552 4%nat + ptr_addrhi_literal − 65552, VByte111 ∨ l, v = PByte65552 5%nat + ptr_addrhi_literal − 65552, VByte0 ∨ False
⊢
∃ i : Z  ,
0 ≤ i < 6
∧
l = PByte65552 i
∧
v
=
match Z.to_nati with
0%nat
⇒
104
1%nat
⇒
101
2%nat | 3%nat
⇒
108
4%nat
⇒
111
_
⇒
0

repeat destruct Hp as Hp | Hp ; try contradiction ; injection Hp as → → ; eexists ; split ; | split ; reflexivity ; lia

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
cbn
rewrite ! elem_of_cons elem_of_nil
intros Hp | Hp ; left ; exact Hp | right
repeat destruct Hp as Hp | Hp ; try contradiction ; injection Hp as → → ; eexists ; split ; | split ; reflexivity ; lia

No writable root of the world w reaches into the literal's object.

66Definition literal_apartw : stdio_world : Prop ≔
∀sp a, Insp stdio_rootsw → span_containssp a → ¬65552 ≤ a < 65560

hi over any runtime R.

70Module HiLogic R : Runtime
71Module SL ≔ StringLogic R
72Module LG ≔ SL.LG
73Module L ≔ LG.L
74Module HB ≔ Hi R
Import L LG SL

Where the literal is valid (Hi.v's hi_literal_valid: its region and its string), every piece of the literal agrees.

79Lemma lit_valid_agrees
∀ m l v
Explore proof 13 tactics

Initial goal

m :
⊢
HB.hi_literal_validm → ∀l : piece v : pval, l, v ∈ lit_ps → agree_piecem l v

intros Hreg Hs l v Hin

m :
Hreg :
object_region65552 m_regionsm = Somer_base ≔ 65552; r_end ≔ 65560; r_kind ≔ GlobalData; r_life ≔ Live
v :
Hin :
l, v ∈ lit_ps
⊢

destruct lit_ps_casesl v Hin as Hp | i & Hi & → & →

2 open

m :
Hreg :
object_region65552 m_regionsm = Somer_base ≔ 65552; r_end ≔ 65560; r_kind ≔ GlobalData; r_life ≔ Live
v :
Hin :
l, v ∈ lit_ps
Hp :
l, v = PLive65552, VLivelit_reg
⊢
focused goal
m :
Hreg :
object_region65552 m_regionsm = Somer_base ≔ 65552; r_end ≔ 65560; r_kind ≔ GlobalData; r_life ≔ Live
i :
Z
Hin :
PByte65552 i, VBytenthZ.to_nati lit_bytes 0 ∈ lit_ps
Hi :
0 ≤ i < 6
⊢
agree_piecem PByte65552 i VBytenthZ.to_nati lit_bytes 0

–injection Hp as → →

2 open

m :
Hreg :
object_region65552 m_regionsm = Somer_base ≔ 65552; r_end ≔ 65560; r_kind ≔ GlobalData; r_life ≔ Live
Hin :
deferred goal
m :
Hreg :
object_region65552 m_regionsm = Somer_base ≔ 65552; r_end ≔ 65560; r_kind ≔ GlobalData; r_life ≔ Live
i :
Z
Hin :
PByte65552 i, VBytenthZ.to_nati lit_bytes 0 ∈ lit_ps
Hi :
0 ≤ i < 6
⊢
agree_piecem PByte65552 i VBytenthZ.to_nati lit_bytes 0

split ; exact Hreg | reflexivity

deferred goal
m :
Hreg :
object_region65552 m_regionsm = Somer_base ≔ 65552; r_end ≔ 65560; r_kind ≔ GlobalData; r_life ≔ Live
i :
Z
Hin :
PByte65552 i, VBytenthZ.to_nati lit_bytes 0 ∈ lit_ps
Hi :
0 ≤ i < 6
⊢
agree_piecem PByte65552 i VBytenthZ.to_nati lit_bytes 0

–cbn in Hs

m :
Hreg :
object_region65552 m_regionsm = Somer_base ≔ 65552; r_end ≔ 65560; r_kind ≔ GlobalData; r_life ≔ Live
Hs :
0 < 104 < 256 ∧ m_bytesm 65552 = 104 ∧ 0 < 101 < 256 ∧ m_bytesm 65552 + 1 = 101 ∧ 0 < 108 < 256 ∧ m_bytesm 65552 + 1 + 1 = 108 ∧ 0 < 108 < 256 ∧ m_bytesm 65552 + 1 + 1 + 1 = 108 ∧ 0 < 111 < 256 ∧ m_bytesm 65552 + 1 + 1 + 1 + 1 = 111 ∧ m_bytesm 65552 + 1 + 1 + 1 + 1 + 1 = 0
i :
Z
Hin :
PByte65552 i, VBytenthZ.to_nati lit_bytes 0 ∈ lit_ps
Hi :
0 ≤ i < 6
⊢
agree_piecem PByte65552 i VBytenthZ.to_nati lit_bytes 0

split ; unfold registered ; rewrite Hreg ; discriminate |

m :
Hreg :
object_region65552 m_regionsm = Somer_base ≔ 65552; r_end ≔ 65560; r_kind ≔ GlobalData; r_life ≔ Live
Hs :
0 < 104 < 256 ∧ m_bytesm 65552 = 104 ∧ 0 < 101 < 256 ∧ m_bytesm 65552 + 1 = 101 ∧ 0 < 108 < 256 ∧ m_bytesm 65552 + 1 + 1 = 108 ∧ 0 < 108 < 256 ∧ m_bytesm 65552 + 1 + 1 + 1 = 108 ∧ 0 < 111 < 256 ∧ m_bytesm 65552 + 1 + 1 + 1 + 1 = 111 ∧ m_bytesm 65552 + 1 + 1 + 1 + 1 + 1 = 0
i :
Z
Hin :
PByte65552 i, VBytenthZ.to_nati lit_bytes 0 ∈ lit_ps
Hi :
0 ≤ i < 6
⊢
in_livem 65552 i m_bytesm 65552 + i = nthZ.to_nati lit_bytes 0

intros reg E _

m :
Hreg :
object_region65552 m_regionsm = Somer_base ≔ 65552; r_end ≔ 65560; r_kind ≔ GlobalData; r_life ≔ Live
Hs :
0 < 104 < 256 ∧ m_bytesm 65552 = 104 ∧ 0 < 101 < 256 ∧ m_bytesm 65552 + 1 = 101 ∧ 0 < 108 < 256 ∧ m_bytesm 65552 + 1 + 1 = 108 ∧ 0 < 108 < 256 ∧ m_bytesm 65552 + 1 + 1 + 1 = 108 ∧ 0 < 111 < 256 ∧ m_bytesm 65552 + 1 + 1 + 1 + 1 = 111 ∧ m_bytesm 65552 + 1 + 1 + 1 + 1 + 1 = 0
i :
Z
Hin :
PByte65552 i, VBytenthZ.to_nati lit_bytes 0 ∈ lit_ps
Hi :
0 ≤ i < 6
reg :
E :
object_region65552 m_regionsm = Somereg
⊢
0 ≤ i ∧ 65552 + i < r_endreg ∧ m_bytesm 65552 + i = nthZ.to_nati lit_bytes 0

rewrite Hreg in E

m :
Hreg :
object_region65552 m_regionsm = Somer_base ≔ 65552; r_end ≔ 65560; r_kind ≔ GlobalData; r_life ≔ Live
Hs :
0 < 104 < 256 ∧ m_bytesm 65552 = 104 ∧ 0 < 101 < 256 ∧ m_bytesm 65552 + 1 = 101 ∧ 0 < 108 < 256 ∧ m_bytesm 65552 + 1 + 1 = 108 ∧ 0 < 108 < 256 ∧ m_bytesm 65552 + 1 + 1 + 1 = 108 ∧ 0 < 111 < 256 ∧ m_bytesm 65552 + 1 + 1 + 1 + 1 = 111 ∧ m_bytesm 65552 + 1 + 1 + 1 + 1 + 1 = 0
i :
Z
Hin :
PByte65552 i, VBytenthZ.to_nati lit_bytes 0 ∈ lit_ps
Hi :
0 ≤ i < 6
reg :
E :
Somer_base ≔ 65552; r_end ≔ 65560; r_kind ≔ GlobalData; r_life ≔ Live = Somereg
⊢
0 ≤ i ∧ 65552 + i < r_endreg ∧ m_bytesm 65552 + i = nthZ.to_nati lit_bytes 0

injection E as ←

m :
Hreg :
object_region65552 m_regionsm = Somer_base ≔ 65552; r_end ≔ 65560; r_kind ≔ GlobalData; r_life ≔ Live
Hs :
0 < 104 < 256 ∧ m_bytesm 65552 = 104 ∧ 0 < 101 < 256 ∧ m_bytesm 65552 + 1 = 101 ∧ 0 < 108 < 256 ∧ m_bytesm 65552 + 1 + 1 = 108 ∧ 0 < 108 < 256 ∧ m_bytesm 65552 + 1 + 1 + 1 = 108 ∧ 0 < 111 < 256 ∧ m_bytesm 65552 + 1 + 1 + 1 + 1 = 111 ∧ m_bytesm 65552 + 1 + 1 + 1 + 1 + 1 = 0
i :
Z
Hin :
PByte65552 i, VBytenthZ.to_nati lit_bytes 0 ∈ lit_ps
Hi :
0 ≤ i < 6
⊢
0 ≤ i ∧ 65552 + i < r_endr_base ≔ 65552; r_end ≔ 65560; r_kind ≔ GlobalData; r_life ≔ Live ∧ m_bytesm 65552 + i = nthZ.to_nati lit_bytes 0

cbn

m :
Hreg :
object_region65552 m_regionsm = Somer_base ≔ 65552; r_end ≔ 65560; r_kind ≔ GlobalData; r_life ≔ Live
Hs :
0 < 104 < 256 ∧ m_bytesm 65552 = 104 ∧ 0 < 101 < 256 ∧ m_bytesm 65552 + 1 = 101 ∧ 0 < 108 < 256 ∧ m_bytesm 65552 + 1 + 1 = 108 ∧ 0 < 108 < 256 ∧ m_bytesm 65552 + 1 + 1 + 1 = 108 ∧ 0 < 111 < 256 ∧ m_bytesm 65552 + 1 + 1 + 1 + 1 = 111 ∧ m_bytesm 65552 + 1 + 1 + 1 + 1 + 1 = 0
i :
Z
Hin :
PByte65552 i, VBytenthZ.to_nati lit_bytes 0 ∈ lit_ps
Hi :
0 ≤ i < 6
⊢
0 ≤ i
∧
65552 + i < 65560
∧
m_bytesm 65552 + i
=
match Z.to_nati with
0%nat
⇒
104
1%nat
⇒
101
2%nat | 3%nat
⇒
108
4%nat
⇒
111
_
⇒
0

split ; lia |

m :
Hreg :
object_region65552 m_regionsm = Somer_base ≔ 65552; r_end ≔ 65560; r_kind ≔ GlobalData; r_life ≔ Live
Hs :
0 < 104 < 256 ∧ m_bytesm 65552 = 104 ∧ 0 < 101 < 256 ∧ m_bytesm 65552 + 1 = 101 ∧ 0 < 108 < 256 ∧ m_bytesm 65552 + 1 + 1 = 108 ∧ 0 < 108 < 256 ∧ m_bytesm 65552 + 1 + 1 + 1 = 108 ∧ 0 < 111 < 256 ∧ m_bytesm 65552 + 1 + 1 + 1 + 1 = 111 ∧ m_bytesm 65552 + 1 + 1 + 1 + 1 + 1 = 0
i :
Z
Hin :
PByte65552 i, VBytenthZ.to_nati lit_bytes 0 ∈ lit_ps
Hi :
0 ≤ i < 6
⊢
65552 + i < 65560
∧
m_bytesm 65552 + i
=
match Z.to_nati with
0%nat
⇒
104
1%nat
⇒
101
2%nat | 3%nat
⇒
108
4%nat
⇒
111
_
⇒
0

split ; lia |

m :
Hreg :
object_region65552 m_regionsm = Somer_base ≔ 65552; r_end ≔ 65560; r_kind ≔ GlobalData; r_life ≔ Live
Hs :
0 < 104 < 256 ∧ m_bytesm 65552 = 104 ∧ 0 < 101 < 256 ∧ m_bytesm 65552 + 1 = 101 ∧ 0 < 108 < 256 ∧ m_bytesm 65552 + 1 + 1 = 108 ∧ 0 < 108 < 256 ∧ m_bytesm 65552 + 1 + 1 + 1 = 108 ∧ 0 < 111 < 256 ∧ m_bytesm 65552 + 1 + 1 + 1 + 1 = 111 ∧ m_bytesm 65552 + 1 + 1 + 1 + 1 + 1 = 0
i :
Z
Hin :
PByte65552 i, VBytenthZ.to_nati lit_bytes 0 ∈ lit_ps
Hi :
0 ≤ i < 6
⊢
m_bytesm 65552 + i
=
match Z.to_nati with
0%nat
⇒
104
1%nat
⇒
101
2%nat | 3%nat
⇒
108
4%nat
⇒
111
_
⇒
0

assert i = 0 ∨ i = 1 ∨ i = 2 ∨ i = 3 ∨ i = 4 ∨ i = 5 as → | → | → | → | → | → by lia ; cbn ; tauto

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros Hreg Hs l v Hin
destruct lit_ps_casesl v Hin as Hp | i & Hi & → & →
–injection Hp as → →
split ; exact Hreg | reflexivity
–cbn in Hs
split ; unfold registered ; rewrite Hreg ; discriminate |
intros reg E _
rewrite Hreg in E
injection E as ←
cbn
split ; lia |
split ; lia |
assert i = 0 ∨ i = 1 ∨ i = 2 ∨ i = 3 ∨ i = 4 ∨ i = 5 as → | → | → | → | → | → by lia ; cbn ; tauto
89Section proof

puts's trusted stream representation and allocation requests.

91Variable rep : mem → stdio_world → Prop
92Variable requests : listword → mem → stdio_world → Z → Z → Prop

Hi.v's premise: a safepoint keeps rep and readiness.

95Hypothesis stdio_stable
∀ s m s′ m′ w
R.safepoints m s′ m′
repm w
repm′ w ∧ stdio_readym′ w

stdio_wi survives safepoints, by stdio_stable.

main's frame at its entry.

102Definition hi_main: frame ≔
mkFramehi_function [ ] [ ] None EnterTAtom"start" None
104Section wp
105Context `{!invGS_genhlc Σ, !gen_heapGSpiece pval Σ}

The Iris instance of hi: puts's contract and stdio_wi.

108Instance hi_irisGS: irisGS_genhlc nanofil_langHB.hi_registryrep requests HB.hi_genv Σ ≔

The expressions of hi's language.

112Notation hexpr ≔ language.exprnanofil_langHB.hi_registryrep requests HB.hi_genv

main, owning the literal, is safe and returns 0: it enters its block, copies the literal's pointer, calls puts and returns 0, whatever puts returned.

117Lemma main_spec
stringhi_literal 65552 lit_reg hello_bytes −∗ WPERunhi_main : hexpr {o. ⌜o = RetWInt0⌝}
Explore proof 12 tactics

Initial goal

rep :
mem → stdio_world → Prop
requests :
listword → mem → stdio_world → Z → Z → Prop
stdio_stable :
∀s : R.state m : mem s′ : R.state m′ : mem w : stdio_world, R.safepoints m s′ m′ → repm w → stdio_readym w → repm′ w ∧ stdio_readym′ w
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
⊢
stringhi_literal 65552 lit_reg hello_bytes −∗ WPERunhi_main : hexpr {o. ⌜o = RetWInt0⌝}

iIntros Hs

rep :
mem → stdio_world → Prop
requests :
listword → mem → stdio_world → Z → Z → Prop
stdio_stable :
∀s : R.state m : mem s′ : R.state m′ : mem w : stdio_world, R.safepoints m s′ m′ → repm w → stdio_readym w → repm′ w ∧ stdio_readym′ w
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
∗
WPERunhi_main {o. ⌜o = RetWInt0⌝}

iApply wp_enter ; reflexivity | reflexivity |

rep :
mem → stdio_world → Prop
requests :
listword → mem → stdio_world → Z → Z → Prop
stdio_stable :
∀s : R.state m : mem s′ : R.state m′ : mem w : stdio_world, R.safepoints m s′ m′ → repm w → stdio_readym w → repm′ w ∧ stdio_readym′ w
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
∗
▷WPHiLogic.LG.L.ERunfr_fn ≔ hi_function; fr_env ≔ [ ]; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"start" b_instsb_label ≔ TAtom"start"; b_phis ≔ [ ]; b_insts ≔ hi_instructions; b_jump ≔ JRetConst0 b_jumpb_label ≔ TAtom"start"; b_phis ≔ [ ]; b_insts ≔ hi_instructions; b_jump ≔ JRetConst0 {o. ⌜o = RetWInt0⌝}

iNext

rep :
mem → stdio_world → Prop
requests :
listword → mem → stdio_world → Z → Z → Prop
stdio_stable :
∀s : R.state m : mem s′ : R.state m′ : mem w : stdio_world, R.safepoints m s′ m′ → repm w → stdio_readym w → repm′ w ∧ stdio_readym′ w
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
∗
WPHiLogic.LG.L.ERunfr_fn ≔ hi_function; fr_env ≔ [ ]; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"start" b_instsb_label ≔ TAtom"start"; b_phis ≔ [ ]; b_insts ≔ hi_instructions; b_jump ≔ JRetConst0 b_jumpb_label ≔ TAtom"start"; b_phis ≔ [ ]; b_insts ≔ hi_instructions; b_jump ≔ JRetConst0 {o. ⌜o = RetWInt0⌝}

cbn [ b_insts b_jump ]

rep :
mem → stdio_world → Prop
requests :
listword → mem → stdio_world → Z → Z → Prop
stdio_stable :
∀s : R.state m : mem s′ : R.state m′ : mem w : stdio_world, R.safepoints m s′ m′ → repm w → stdio_readym w → repm′ w ∧ stdio_readym′ w
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
∗
WPHiLogic.LG.L.ERunfr_fn ≔ hi_function; fr_env ≔ [ ]; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"start" hi_instructions JRetConst0 {o. ⌜o = RetWInt0⌝}

iApply wp_let ; reflexivity | reflexivity | reflexivity | intros m ; reflexivity |

rep :
mem → stdio_world → Prop
requests :
listword → mem → stdio_world → Z → Z → Prop
stdio_stable :
∀s : R.state m : mem s′ : R.state m′ : mem w : stdio_world, R.safepoints m s′ m′ → repm w → stdio_readym w → repm′ w ∧ stdio_readym′ w
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
∗

iNext

rep :
mem → stdio_world → Prop
requests :
listword → mem → stdio_world → Z → Z → Prop
stdio_stable :
∀s : R.state m : mem s′ : R.state m′ : mem w : stdio_world, R.safepoints m s′ m′ → repm w → stdio_readym w → repm′ w ∧ stdio_readym′ w
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
∗

iApply wp_puts with Hs ; reflexivity | reflexivity | reflexivity | reflexivity |

rep :
mem → stdio_world → Prop
requests :
listword → mem → stdio_world → Z → Z → Prop
stdio_stable :
∀s : R.state m : mem s′ : R.state m′ : mem w : stdio_world, R.safepoints m s′ m′ → repm w → stdio_readym w → repm′ w ∧ stdio_readym′ w
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
∗
▷∀n : Z, stringhi_literal 65552 lit_reg hello_bytes −∗ WPL.ERunfr_fn ≔ hi_function; fr_env ≔ putTAtom"v1" WIntn mod 2 ^ 32 putTAtom"v0" WPtrhi_literal [ ]; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"start" [ ] JRetConst0 {o. ⌜o = RetWInt0⌝}

iNext

rep :
mem → stdio_world → Prop
requests :
listword → mem → stdio_world → Z → Z → Prop
stdio_stable :
∀s : R.state m : mem s′ : R.state m′ : mem w : stdio_world, R.safepoints m s′ m′ → repm w → stdio_readym w → repm′ w ∧ stdio_readym′ w
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
∗
∀n : Z, stringhi_literal 65552 lit_reg hello_bytes −∗ WPL.ERunfr_fn ≔ hi_function; fr_env ≔ putTAtom"v1" WIntn mod 2 ^ 32 putTAtom"v0" WPtrhi_literal [ ]; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"start" [ ] JRetConst0 {o. ⌜o = RetWInt0⌝}

iIntros n _

rep :
mem → stdio_world → Prop
requests :
listword → mem → stdio_world → Z → Z → Prop
stdio_stable :
∀s : R.state m : mem s′ : R.state m′ : mem w : stdio_world, R.safepoints m s′ m′ → repm w → stdio_readym w → repm′ w ∧ stdio_readym′ w
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n :
Z
∗
WPL.ERunfr_fn ≔ hi_function; fr_env ≔ putTAtom"v1" WIntn mod 2 ^ 32 putTAtom"v0" WPtrhi_literal [ ]; fr_locals ≔ [ ]; fr_doomed ≔ None; fr_at ≔ ExecTAtom"start" [ ] JRetConst0 {o. ⌜o = RetWInt0⌝}

iApply wp_ret ; reflexivity | reflexivity |

rep :
mem → stdio_world → Prop
requests :
listword → mem → stdio_world → Z → Z → Prop
stdio_stable :
∀s : R.state m : mem s′ : R.state m′ : mem w : stdio_world, R.safepoints m s′ m′ → repm w → stdio_readym w → repm′ w ∧ stdio_readym′ w
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n :
Z
∗
▷⌜RetWInt0 mod 2 ^ 32 = RetWInt0⌝

iNext

rep :
mem → stdio_world → Prop
requests :
listword → mem → stdio_world → Z → Z → Prop
stdio_stable :
∀s : R.state m : mem s′ : R.state m′ : mem w : stdio_world, R.safepoints m s′ m′ → repm w → stdio_readym w → repm′ w ∧ stdio_readym′ w
hlc :
has_lc
Σ :
gFunctors
invGS_gen0 :
invGS_genhlc Σ
gen_heapGS0 :
gen_heapGSpiece pval Σ
n :
Z
∗
⌜RetWInt0 mod 2 ^ 32 = RetWInt0⌝

done

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
iIntros Hs
iApply wp_enter ; reflexivity | reflexivity |
iNext
cbn [ b_insts b_jump ]
iApply wp_let ; reflexivity | reflexivity | reflexivity | intros m ; reflexivity |
iNext
iApply wp_puts with Hs ; reflexivity | reflexivity | reflexivity | reflexivity |
iNext
iIntros n _
iApply wp_ret ; reflexivity | reflexivity |
iNext
done

hi's body is safe: from a ready runtime, live objects apart, Hi.v's hi_before_call and the world's roots apart from the literal, with any fuel, no labelled run stops with a failure_ending, and a run that returns returns 0. By heap_labelled_safe from main_spec, the ghost heap starting with the literal's pieces.

133Theorem hi_logic_safe
∀ Σ HinvP : invGpreSΣ HheapP : gen_heapGpreSpiece pval Σ m s w fuel
Explore proof 19 tactics

Initial goal

rep :
mem → stdio_world → Prop
requests :
listword → mem → stdio_world → Z → Z → Prop
stdio_stable :
∀s : R.state m : mem s′ : R.state m′ : mem w : stdio_world, R.safepoints m s′ m′ → repm w → stdio_readym w → repm′ w ∧ stdio_readym′ w
Σ :
gFunctors
HinvP :
invGpreSΣ
HheapP :
gen_heapGpreSpiece pval Σ
m :
s :
R.state
fuel :
Z
⊢
R.readys m → live_disjointm → HB.hi_before_callrep m w → literal_apartw → labelled_safeHB.hi_registryrep requests HB.hi_genv hi_main m s w fuel λo : outcome ⇒ o = RetWInt0

intros Hr Hd Hrep & Hw & Hv Hapart

rep :
mem → stdio_world → Prop
requests :
listword → mem → stdio_world → Z → Z → Prop
stdio_stable :
∀s : R.state m : mem s′ : R.state m′ : mem w : stdio_world, R.safepoints m s′ m′ → repm w → stdio_readym w → repm′ w ∧ stdio_readym′ w
Σ :
gFunctors
HinvP :
invGpreSΣ
HheapP :
gen_heapGpreSpiece pval Σ
m :
s :
R.state
fuel :
Z
Hr :
R.readys m
Hrep :
repm w
Hapart :
⊢
labelled_safeHB.hi_registryrep requests HB.hi_genv hi_main m s w fuel λo : outcome ⇒ o = RetWInt0

apply heap_labelled_safeΣ HB.hi_registryrep requests stdio_wirep HB.hi_genv hi_main m s w list_to_maplit_ps

5 open

rep :
mem → stdio_world → Prop
requests :
listword → mem → stdio_world → Z → Z → Prop
stdio_stable :
∀s : R.state m : mem s′ : R.state m′ : mem w : stdio_world, R.safepoints m s′ m′ → repm w → stdio_readym w → repm′ w ∧ stdio_readym′ w
Σ :
gFunctors
HinvP :
invGpreSΣ
HheapP :
gen_heapGpreSpiece pval Σ
m :
s :
R.state
fuel :
Z
Hr :
R.readys m
Hrep :
repm w
Hapart :
⊢
R.readys m
focused goal
rep :
mem → stdio_world → Prop
requests :
listword → mem → stdio_world → Z → Z → Prop
stdio_stable :
∀s : R.state m : mem s′ : R.state m′ : mem w : stdio_world, R.safepoints m s′ m′ → repm w → stdio_readym w → repm′ w ∧ stdio_readym′ w
Σ :
gFunctors
HinvP :
invGpreSΣ
HheapP :
gen_heapGpreSpiece pval Σ
m :
s :
R.state
fuel :
Z
Hr :
R.readys m
Hrep :
repm w
Hapart :
focused goal
rep :
mem → stdio_world → Prop
requests :
listword → mem → stdio_world → Z → Z → Prop
stdio_stable :
∀s : R.state m : mem s′ : R.state m′ : mem w : stdio_world, R.safepoints m s′ m′ → repm w → stdio_readym w → repm′ w ∧ stdio_readym′ w
Σ :
gFunctors
HinvP :
invGpreSΣ
HheapP :
gen_heapGpreSpiece pval Σ
m :
s :
R.state
fuel :
Z
Hr :
R.readys m
Hrep :
repm w
Hapart :
⊢
agreesm list_to_maplit_ps
focused goal
rep :
mem → stdio_world → Prop
requests :
listword → mem → stdio_world → Z → Z → Prop
stdio_stable :
∀s : R.state m : mem s′ : R.state m′ : mem w : stdio_world, R.safepoints m s′ m′ → repm w → stdio_readym w → repm′ w ∧ stdio_readym′ w
Σ :
gFunctors
HinvP :
invGpreSΣ
HheapP :
gen_heapGpreSpiece pval Σ
m :
s :
R.state
fuel :
Z
Hr :
R.readys m
Hrep :
repm w
Hapart :
⊢
stdio_wirep m w list_to_maplit_ps
focused goal
rep :
mem → stdio_world → Prop
requests :
listword → mem → stdio_world → Z → Z → Prop
stdio_stable :
∀s : R.state m : mem s′ : R.state m′ : mem w : stdio_world, R.safepoints m s′ m′ → repm w → stdio_readym w → repm′ w ∧ stdio_readym′ w
Σ :
gFunctors
HinvP :
invGpreSΣ
HheapP :
gen_heapGpreSpiece pval Σ
m :
s :
R.state
fuel :
Z
Hr :
R.readys m
Hrep :
repm w
Hapart :
⊢
∀ HinvG : invGS_genHasNoLc Σ HheapG : gen_heapGSpiece pval Σ  ,
∗l↦v∈list_to_maplit_pspointstol DfracOwn1 v
⊢
let H ≔ nanofil_irisGSHB.hi_registryrep requests stdio_wirep HB.hi_genv in

–exact Hr

4 open

deferred goal
rep :
mem → stdio_world → Prop
requests :
listword → mem → stdio_world → Z → Z → Prop
stdio_stable :
∀s : R.state m : mem s′ : R.state m′ : mem w : stdio_world, R.safepoints m s′ m′ → repm w → stdio_readym w → repm′ w ∧ stdio_readym′ w
Σ :
gFunctors
HinvP :
invGpreSΣ
HheapP :
gen_heapGpreSpiece pval Σ
m :
s :
R.state
fuel :
Z
Hr :
R.readys m
Hrep :
repm w
Hapart :
deferred goal
rep :
mem → stdio_world → Prop
requests :
listword → mem → stdio_world → Z → Z → Prop
stdio_stable :
∀s : R.state m : mem s′ : R.state m′ : mem w : stdio_world, R.safepoints m s′ m′ → repm w → stdio_readym w → repm′ w ∧ stdio_readym′ w
Σ :
gFunctors
HinvP :
invGpreSΣ
HheapP :
gen_heapGpreSpiece pval Σ
m :
s :
R.state
fuel :
Z
Hr :
R.readys m
Hrep :
repm w
Hapart :
⊢
agreesm list_to_maplit_ps
deferred goal
rep :
mem → stdio_world → Prop
requests :
listword → mem → stdio_world → Z → Z → Prop
stdio_stable :
∀s : R.state m : mem s′ : R.state m′ : mem w : stdio_world, R.safepoints m s′ m′ → repm w → stdio_readym w → repm′ w ∧ stdio_readym′ w
Σ :
gFunctors
HinvP :
invGpreSΣ
HheapP :
gen_heapGpreSpiece pval Σ
m :
s :
R.state
fuel :
Z
Hr :
R.readys m
Hrep :
repm w
Hapart :
⊢
stdio_wirep m w list_to_maplit_ps
deferred goal
rep :
mem → stdio_world → Prop
requests :
listword → mem → stdio_world → Z → Z → Prop
stdio_stable :
∀s : R.state m : mem s′ : R.state m′ : mem w : stdio_world, R.safepoints m s′ m′ → repm w → stdio_readym w → repm′ w ∧ stdio_readym′ w
Σ :
gFunctors
HinvP :
invGpreSΣ
HheapP :
gen_heapGpreSpiece pval Σ
m :
s :
R.state
fuel :
Z
Hr :
R.readys m
Hrep :
repm w
Hapart :
⊢
∀ HinvG : invGS_genHasNoLc Σ HheapG : gen_heapGSpiece pval Σ  ,
∗l↦v∈list_to_maplit_pspointstol DfracOwn1 v
⊢
let H ≔ nanofil_irisGSHB.hi_registryrep requests stdio_wirep HB.hi_genv in

–exact Hd

3 open

deferred goal
rep :
mem → stdio_world → Prop
requests :
listword → mem → stdio_world → Z → Z → Prop
stdio_stable :
∀s : R.state m : mem s′ : R.state m′ : mem w : stdio_world, R.safepoints m s′ m′ → repm w → stdio_readym w → repm′ w ∧ stdio_readym′ w
Σ :
gFunctors
HinvP :
invGpreSΣ
HheapP :
gen_heapGpreSpiece pval Σ
m :
s :
R.state
fuel :
Z
Hr :
R.readys m
Hrep :
repm w
Hapart :
⊢
agreesm list_to_maplit_ps
deferred goal
rep :
mem → stdio_world → Prop
requests :
listword → mem → stdio_world → Z → Z → Prop
stdio_stable :
∀s : R.state m : mem s′ : R.state m′ : mem w : stdio_world, R.safepoints m s′ m′ → repm w → stdio_readym w → repm′ w ∧ stdio_readym′ w
Σ :
gFunctors
HinvP :
invGpreSΣ
HheapP :
gen_heapGpreSpiece pval Σ
m :
s :
R.state
fuel :
Z
Hr :
R.readys m
Hrep :
repm w
Hapart :
⊢
stdio_wirep m w list_to_maplit_ps
deferred goal
rep :
mem → stdio_world → Prop
requests :
listword → mem → stdio_world → Z → Z → Prop
stdio_stable :
∀s : R.state m : mem s′ : R.state m′ : mem w : stdio_world, R.safepoints m s′ m′ → repm w → stdio_readym w → repm′ w ∧ stdio_readym′ w
Σ :
gFunctors
HinvP :
invGpreSΣ
HheapP :
gen_heapGpreSpiece pval Σ
m :
s :
R.state
fuel :
Z
Hr :
R.readys m
Hrep :
repm w
Hapart :
⊢
∀ HinvG : invGS_genHasNoLc Σ HheapG : gen_heapGSpiece pval Σ  ,
∗l↦v∈list_to_maplit_pspointstol DfracOwn1 v
⊢
let H ≔ nanofil_irisGSHB.hi_registryrep requests stdio_wirep HB.hi_genv in

–intros l v Hl

3 open

rep :
mem → stdio_world → Prop
requests :
listword → mem → stdio_world → Z → Z → Prop
stdio_stable :
∀s : R.state m : mem s′ : R.state m′ : mem w : stdio_world, R.safepoints m s′ m′ → repm w → stdio_readym w → repm′ w ∧ stdio_readym′ w
Σ :
gFunctors
HinvP :
invGpreSΣ
HheapP :
gen_heapGpreSpiece pval Σ
m :
s :
R.state
fuel :
Z
Hr :
R.readys m
Hrep :
repm w
Hapart :
v :
Hl :
list_to_maplit_ps !! l = Somev
⊢
deferred goal
rep :
mem → stdio_world → Prop
requests :
listword → mem → stdio_world → Z → Z → Prop
stdio_stable :
∀s : R.state m : mem s′ : R.state m′ : mem w : stdio_world, R.safepoints m s′ m′ → repm w → stdio_readym w → repm′ w ∧ stdio_readym′ w
Σ :
gFunctors
HinvP :
invGpreSΣ
HheapP :
gen_heapGpreSpiece pval Σ
m :
s :
R.state
fuel :
Z
Hr :
R.readys m
Hrep :
repm w
Hapart :
⊢
stdio_wirep m w list_to_maplit_ps
deferred goal
rep :
mem → stdio_world → Prop
requests :
listword → mem → stdio_world → Z → Z → Prop
stdio_stable :
∀s : R.state m : mem s′ : R.state m′ : mem w : stdio_world, R.safepoints m s′ m′ → repm w → stdio_readym w → repm′ w ∧ stdio_readym′ w
Σ :
gFunctors
HinvP :
invGpreSΣ
HheapP :
gen_heapGpreSpiece pval Σ
m :
s :
R.state
fuel :
Z
Hr :
R.readys m
Hrep :
repm w
Hapart :
⊢
∀ HinvG : invGS_genHasNoLc Σ HheapG : gen_heapGSpiece pval Σ  ,
∗l↦v∈list_to_maplit_pspointstol DfracOwn1 v
⊢
let H ≔ nanofil_irisGSHB.hi_registryrep requests stdio_wirep HB.hi_genv in

exact lit_valid_agreesm Hv l v elem_of_list_to_map_2_ _ _ Hl

2 open

deferred goal
rep :
mem → stdio_world → Prop
requests :
listword → mem → stdio_world → Z → Z → Prop
stdio_stable :
∀s : R.state m : mem s′ : R.state m′ : mem w : stdio_world, R.safepoints m s′ m′ → repm w → stdio_readym w → repm′ w ∧ stdio_readym′ w
Σ :
gFunctors
HinvP :
invGpreSΣ
HheapP :
gen_heapGpreSpiece pval Σ
m :
s :
R.state
fuel :
Z
Hr :
R.readys m
Hrep :
repm w
Hapart :
⊢
stdio_wirep m w list_to_maplit_ps
deferred goal
rep :
mem → stdio_world → Prop
requests :
listword → mem → stdio_world → Z → Z → Prop
stdio_stable :
∀s : R.state m : mem s′ : R.state m′ : mem w : stdio_world, R.safepoints m s′ m′ → repm w → stdio_readym w → repm′ w ∧ stdio_readym′ w
Σ :
gFunctors
HinvP :
invGpreSΣ
HheapP :
gen_heapGpreSpiece pval Σ
m :
s :
R.state
fuel :
Z
Hr :
R.readys m
Hrep :
repm w
Hapart :
⊢
∀ HinvG : invGS_genHasNoLc Σ HheapG : gen_heapGSpiece pval Σ  ,
∗l↦v∈list_to_maplit_pspointstol DfracOwn1 v
⊢
let H ≔ nanofil_irisGSHB.hi_registryrep requests stdio_wirep HB.hi_genv in

–split ; exact Hrep |

2 open

rep :
mem → stdio_world → Prop
requests :
listword → mem → stdio_world → Z → Z → Prop
stdio_stable :
∀s : R.state m : mem s′ : R.state m′ : mem w : stdio_world, R.safepoints m s′ m′ → repm w → stdio_readym w → repm′ w ∧ stdio_readym′ w
Σ :
gFunctors
HinvP :
invGpreSΣ
HheapP :
gen_heapGpreSpiece pval Σ
m :
s :
R.state
fuel :
Z
Hr :
R.readys m
Hrep :
repm w
Hapart :
⊢
deferred goal
rep :
mem → stdio_world → Prop
requests :
listword → mem → stdio_world → Z → Z → Prop
stdio_stable :
∀s : R.state m : mem s′ : R.state m′ : mem w : stdio_world, R.safepoints m s′ m′ → repm w → stdio_readym w → repm′ w ∧ stdio_readym′ w
Σ :
gFunctors
HinvP :
invGpreSΣ
HheapP :
gen_heapGpreSpiece pval Σ
m :
s :
R.state
fuel :
Z
Hr :
R.readys m
Hrep :
repm w
Hapart :
⊢
∀ HinvG : invGS_genHasNoLc Σ HheapG : gen_heapGSpiece pval Σ  ,
∗l↦v∈list_to_maplit_pspointstol DfracOwn1 v
⊢
let H ≔ nanofil_irisGSHB.hi_registryrep requests stdio_wirep HB.hi_genv in

split ; exact Hw |

2 open

rep :
mem → stdio_world → Prop
requests :
listword → mem → stdio_world → Z → Z → Prop
stdio_stable :
∀s : R.state m : mem s′ : R.state m′ : mem w : stdio_world, R.safepoints m s′ m′ → repm w → stdio_readym w → repm′ w ∧ stdio_readym′ w
Σ :
gFunctors
HinvP :
invGpreSΣ
HheapP :
gen_heapGpreSpiece pval Σ
m :
s :
R.state
fuel :
Z
Hr :
R.readys m
Hrep :
repm w
Hapart :
deferred goal
rep :
mem → stdio_world → Prop
requests :
listword → mem → stdio_world → Z → Z → Prop
stdio_stable :
∀s : R.state m : mem s′ : R.state m′ : mem w : stdio_world, R.safepoints m s′ m′ → repm w → stdio_readym w → repm′ w ∧ stdio_readym′ w
Σ :
gFunctors
HinvP :
invGpreSΣ
HheapP :
gen_heapGpreSpiece pval Σ
m :
s :
R.state
fuel :
Z
Hr :
R.readys m
Hrep :
repm w
Hapart :
⊢
∀ HinvG : invGS_genHasNoLc Σ HheapG : gen_heapGSpiece pval Σ  ,
∗l↦v∈list_to_maplit_pspointstol DfracOwn1 v
⊢
let H ≔ nanofil_irisGSHB.hi_registryrep requests stdio_wirep HB.hi_genv in

intros sp a Hin Hs l & v & reg & Hl & _ & E _ & Hb

2 open

rep :
mem → stdio_world → Prop
requests :
listword → mem → stdio_world → Z → Z → Prop
stdio_stable :
∀s : R.state m : mem s′ : R.state m′ : mem w : stdio_world, R.safepoints m s′ m′ → repm w → stdio_readym w → repm′ w ∧ stdio_readym′ w
Σ :
gFunctors
HinvP :
invGpreSΣ
HheapP :
gen_heapGpreSpiece pval Σ
m :
s :
R.state
fuel :
Z
Hr :
R.readys m
Hrep :
repm w
Hapart :
sp :
a :
Z
Hin :
v :
reg :
Hl :
list_to_maplit_ps !! l = Somev
Hb :
piece_idl ≤ a < r_endreg
⊢
False
deferred goal
rep :
mem → stdio_world → Prop
requests :
listword → mem → stdio_world → Z → Z → Prop
stdio_stable :
∀s : R.state m : mem s′ : R.state m′ : mem w : stdio_world, R.safepoints m s′ m′ → repm w → stdio_readym w → repm′ w ∧ stdio_readym′ w
Σ :
gFunctors
HinvP :
invGpreSΣ
HheapP :
gen_heapGpreSpiece pval Σ
m :
s :
R.state
fuel :
Z
Hr :
R.readys m
Hrep :
repm w
Hapart :
⊢
∀ HinvG : invGS_genHasNoLc Σ HheapG : gen_heapGSpiece pval Σ  ,
∗l↦v∈list_to_maplit_pspointstol DfracOwn1 v
⊢
let H ≔ nanofil_irisGSHB.hi_registryrep requests stdio_wirep HB.hi_genv in

apply elem_of_list_to_map_2 in Hl

2 open

rep :
mem → stdio_world → Prop
requests :
listword → mem → stdio_world → Z → Z → Prop
stdio_stable :
∀s : R.state m : mem s′ : R.state m′ : mem w : stdio_world, R.safepoints m s′ m′ → repm w → stdio_readym w → repm′ w ∧ stdio_readym′ w
Σ :
gFunctors
HinvP :
invGpreSΣ
HheapP :
gen_heapGpreSpiece pval Σ
m :
s :
R.state
fuel :
Z
Hr :
R.readys m
Hrep :
repm w
Hapart :
sp :
a :
Z
Hin :
v :
reg :
Hl :
l, v ∈ lit_ps
Hb :
piece_idl ≤ a < r_endreg
⊢
False
deferred goal
rep :
mem → stdio_world → Prop
requests :
listword → mem → stdio_world → Z → Z → Prop
stdio_stable :
∀s : R.state m : mem s′ : R.state m′ : mem w : stdio_world, R.safepoints m s′ m′ → repm w → stdio_readym w → repm′ w ∧ stdio_readym′ w
Σ :
gFunctors
HinvP :
invGpreSΣ
HheapP :
gen_heapGpreSpiece pval Σ
m :
s :
R.state
fuel :
Z
Hr :
R.readys m
Hrep :
repm w
Hapart :
⊢
∀ HinvG : invGS_genHasNoLc Σ HheapG : gen_heapGSpiece pval Σ  ,
∗l↦v∈list_to_maplit_pspointstol DfracOwn1 v
⊢
let H ≔ nanofil_irisGSHB.hi_registryrep requests stdio_wirep HB.hi_genv in

rewrite string_ps_id_ _ _ _ l v Hl in E , Hb

2 open

rep :
mem → stdio_world → Prop
requests :
listword → mem → stdio_world → Z → Z → Prop
stdio_stable :
∀s : R.state m : mem s′ : R.state m′ : mem w : stdio_world, R.safepoints m s′ m′ → repm w → stdio_readym w → repm′ w ∧ stdio_readym′ w
Σ :
gFunctors
HinvP :
invGpreSΣ
HheapP :
gen_heapGpreSpiece pval Σ
m :
s :
R.state
fuel :
Z
Hr :
R.readys m
Hrep :
repm w
Hapart :
sp :
a :
Z
Hin :
v :
reg :
Hl :
l, v ∈ lit_ps
E :
object_region65552 m_regionsm = Somereg
Hb :
65552 ≤ a < r_endreg
⊢
False
deferred goal
rep :
mem → stdio_world → Prop
requests :
listword → mem → stdio_world → Z → Z → Prop
stdio_stable :
∀s : R.state m : mem s′ : R.state m′ : mem w : stdio_world, R.safepoints m s′ m′ → repm w → stdio_readym w → repm′ w ∧ stdio_readym′ w
Σ :
gFunctors
HinvP :
invGpreSΣ
HheapP :
gen_heapGpreSpiece pval Σ
m :
s :
R.state
fuel :
Z
Hr :
R.readys m
Hrep :
repm w
Hapart :
⊢
∀ HinvG : invGS_genHasNoLc Σ HheapG : gen_heapGSpiece pval Σ  ,
∗l↦v∈list_to_maplit_pspointstol DfracOwn1 v
⊢
let H ≔ nanofil_irisGSHB.hi_registryrep requests stdio_wirep HB.hi_genv in

rewrite proj1Hv in E

2 open

rep :
mem → stdio_world → Prop
requests :
listword → mem → stdio_world → Z → Z → Prop
stdio_stable :
∀s : R.state m : mem s′ : R.state m′ : mem w : stdio_world, R.safepoints m s′ m′ → repm w → stdio_readym w → repm′ w ∧ stdio_readym′ w
Σ :
gFunctors
HinvP :
invGpreSΣ
HheapP :
gen_heapGpreSpiece pval Σ
m :
s :
R.state
fuel :
Z
Hr :
R.readys m
Hrep :
repm w
Hapart :
sp :
a :
Z
Hin :
v :
reg :
Hl :
l, v ∈ lit_ps
Hb :
65552 ≤ a < r_endreg
E :
Somer_base ≔ 65552; r_end ≔ 65560; r_kind ≔ GlobalData; r_life ≔ Live = Somereg
⊢
False
deferred goal
rep :
mem → stdio_world → Prop
requests :
listword → mem → stdio_world → Z → Z → Prop
stdio_stable :
∀s : R.state m : mem s′ : R.state m′ : mem w : stdio_world, R.safepoints m s′ m′ → repm w → stdio_readym w → repm′ w ∧ stdio_readym′ w
Σ :
gFunctors
HinvP :
invGpreSΣ
HheapP :
gen_heapGpreSpiece pval Σ
m :
s :
R.state
fuel :
Z
Hr :
R.readys m
Hrep :
repm w
Hapart :
⊢
∀ HinvG : invGS_genHasNoLc Σ HheapG : gen_heapGSpiece pval Σ  ,
∗l↦v∈list_to_maplit_pspointstol DfracOwn1 v
⊢
let H ≔ nanofil_irisGSHB.hi_registryrep requests stdio_wirep HB.hi_genv in

injection E as ←

2 open

rep :
mem → stdio_world → Prop
requests :
listword → mem → stdio_world → Z → Z → Prop
stdio_stable :
∀s : R.state m : mem s′ : R.state m′ : mem w : stdio_world, R.safepoints m s′ m′ → repm w → stdio_readym w → repm′ w ∧ stdio_readym′ w
Σ :
gFunctors
HinvP :
invGpreSΣ
HheapP :
gen_heapGpreSpiece pval Σ
m :
s :
R.state
fuel :
Z
Hr :
R.readys m
Hrep :
repm w
Hapart :
sp :
a :
Z
Hin :
v :
Hl :
l, v ∈ lit_ps
Hb :
65552 ≤ a < r_endr_base ≔ 65552; r_end ≔ 65560; r_kind ≔ GlobalData; r_life ≔ Live
⊢
False
deferred goal
rep :
mem → stdio_world → Prop
requests :
listword → mem → stdio_world → Z → Z → Prop
stdio_stable :
∀s : R.state m : mem s′ : R.state m′ : mem w : stdio_world, R.safepoints m s′ m′ → repm w → stdio_readym w → repm′ w ∧ stdio_readym′ w
Σ :
gFunctors
HinvP :
invGpreSΣ
HheapP :
gen_heapGpreSpiece pval Σ
m :
s :
R.state
fuel :
Z
Hr :
R.readys m
Hrep :
repm w
Hapart :
⊢
∀ HinvG : invGS_genHasNoLc Σ HheapG : gen_heapGSpiece pval Σ  ,
∗l↦v∈list_to_maplit_pspointstol DfracOwn1 v
⊢
let H ≔ nanofil_irisGSHB.hi_registryrep requests stdio_wirep HB.hi_genv in

exact Hapartsp a Hin Hs Hb

deferred goal
rep :
mem → stdio_world → Prop
requests :
listword → mem → stdio_world → Z → Z → Prop
stdio_stable :
∀s : R.state m : mem s′ : R.state m′ : mem w : stdio_world, R.safepoints m s′ m′ → repm w → stdio_readym w → repm′ w ∧ stdio_readym′ w
Σ :
gFunctors
HinvP :
invGpreSΣ
HheapP :
gen_heapGpreSpiece pval Σ
m :
s :
R.state
fuel :
Z
Hr :
R.readys m
Hrep :
repm w
Hapart :
⊢
∀ HinvG : invGS_genHasNoLc Σ HheapG : gen_heapGSpiece pval Σ  ,
∗l↦v∈list_to_maplit_pspointstol DfracOwn1 v
⊢
let H ≔ nanofil_irisGSHB.hi_registryrep requests stdio_wirep HB.hi_genv in

–intros HinvG HheapG

rep :
mem → stdio_world → Prop
requests :
listword → mem → stdio_world → Z → Z → Prop
stdio_stable :
∀s : R.state m : mem s′ : R.state m′ : mem w : stdio_world, R.safepoints m s′ m′ → repm w → stdio_readym w → repm′ w ∧ stdio_readym′ w
Σ :
gFunctors
HinvP :
invGpreSΣ
HheapP :
gen_heapGpreSpiece pval Σ
m :
s :
R.state
fuel :
Z
Hr :
R.readys m
Hrep :
repm w
Hapart :
HinvG :
invGS_genHasNoLc Σ
HheapG :
gen_heapGSpiece pval Σ
⊢
∗l↦v∈list_to_maplit_pspointstol DfracOwn1 v
⊢
let H ≔ nanofil_irisGSHB.hi_registryrep requests stdio_wirep HB.hi_genv in

rewrite big_sepM_list_to_map ; | exact string_ps_nodup_ _ _ _

rep :
mem → stdio_world → Prop
requests :
listword → mem → stdio_world → Z → Z → Prop
stdio_stable :
∀s : R.state m : mem s′ : R.state m′ : mem w : stdio_world, R.safepoints m s′ m′ → repm w → stdio_readym w → repm′ w ∧ stdio_readym′ w
Σ :
gFunctors
HinvP :
invGpreSΣ
HheapP :
gen_heapGpreSpiece pval Σ
m :
s :
R.state
fuel :
Z
Hr :
R.readys m
Hrep :
repm w
Hapart :
HinvG :
invGS_genHasNoLc Σ
HheapG :
gen_heapGSpiece pval Σ
⊢
∗xk∈lit_pspointstoxk.1 DfracOwn1 xk.2
⊢
let H ≔ nanofil_irisGSHB.hi_registryrep requests stdio_wirep HB.hi_genv in

iIntros Hl

rep :
mem → stdio_world → Prop
requests :
listword → mem → stdio_world → Z → Z → Prop
stdio_stable :
∀s : R.state m : mem s′ : R.state m′ : mem w : stdio_world, R.safepoints m s′ m′ → repm w → stdio_readym w → repm′ w ∧ stdio_readym′ w
Σ :
gFunctors
HinvP :
invGpreSΣ
HheapP :
gen_heapGpreSpiece pval Σ
m :
s :
R.state
fuel :
Z
Hr :
R.readys m
Hrep :
repm w
Hapart :
HinvG :
invGS_genHasNoLc Σ
HheapG :
gen_heapGSpiece pval Σ
Hl :
∗xk∈lit_pspointstoxk.1 DfracOwn1 xk.2
∗

iApply main_spec

rep :
mem → stdio_world → Prop
requests :
listword → mem → stdio_world → Z → Z → Prop
stdio_stable :
∀s : R.state m : mem s′ : R.state m′ : mem w : stdio_world, R.safepoints m s′ m′ → repm w → stdio_readym w → repm′ w ∧ stdio_readym′ w
Σ :
gFunctors
HinvP :
invGpreSΣ
HheapP :
gen_heapGpreSpiece pval Σ
m :
s :
R.state
fuel :
Z
Hr :
R.readys m
Hrep :
repm w
Hapart :
HinvG :
invGS_genHasNoLc Σ
HheapG :
gen_heapGSpiece pval Σ
Hl :
∗xk∈lit_pspointstoxk.1 DfracOwn1 xk.2
∗

iSplit ; iPureIntro ; exact lit_ok | iExact Hl

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros Hr Hd Hrep & Hw & Hv Hapart
apply heap_labelled_safeΣ HB.hi_registryrep requests stdio_wirep HB.hi_genv hi_main m s w list_to_maplit_ps
–exact Hr
–exact Hd
–intros l v Hl
exact lit_valid_agreesm Hv l v elem_of_list_to_map_2_ _ _ Hl
–split ; exact Hrep |
split ; exact Hw |
intros sp a Hin Hs l & v & reg & Hl & _ & E _ & Hb
apply elem_of_list_to_map_2 in Hl
rewrite string_ps_id_ _ _ _ l v Hl in E , Hb
rewrite proj1Hv in E
injection E as ←
exact Hapartsp a Hin Hs Hb
–intros HinvG HheapG
rewrite big_sepM_list_to_map ; | exact string_ps_nodup_ _ _ _
iIntros Hl
iApply main_spec
iSplit ; iPureIntro ; exact lit_ok | iExact Hl

The resources the proof uses: invariants and the ghost heap.

155Definition hiΣ: gFunctors ≔
#invΣ; gen_heapΣpiece pval

hiΣ has invariants.

158Instance hiΣ_inv: invGpreShiΣ
Explore proof 2 tactics

Initial goal

⊢
invGpreShiΣ

apply subG_invΣ

⊢
subGinvΣ hiΣ

apply _

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
apply subG_invΣ
apply _

hiΣ has the ghost heap of pieces.

162Instance hiΣ_heap: gen_heapGpreSpiece pval hiΣ
Explore proof 2 tactics

Initial goal

⊢
gen_heapGpreSpiece pval hiΣ

apply subG_gen_heapGpreS

⊢
subGgen_heapΣpiece pval hiΣ

apply _

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
apply subG_gen_heapGpreS
apply _

The interpreter's runtime

hi over the interpreter's runtime.

168Module InterpHiLogic ≔ HiLogic InterpRuntime

Above 2^32, where the interpreter allocates, Hi.v's fixture memory holds no byte and no capability.

172Lemma hi_memory_high
∀ a
2 ^ 32 ≤ a
Explore proof 5 tactics

Initial goal

⊢
∀a : Z, 2 ^ 32 ≤ a → m_bytesHiChecks.memory a = 0 ∧ m_auxHiChecks.memory a = CNone

intros a Ha

a :
Z
Ha :
2 ^ 32 ≤ a

unfold HiChecks.memory , hi_memory

a :
Z
Ha :
2 ^ 32 ≤ a
⊢
m_bytesm_bytes ≔ m_bytesmatch initial_memoryhi_module with Some_, m ⇒ m | None ⇒ empty_mem end; m_regions ≔ r_base ≔ 2048; r_end ≔ 2064; r_kind ≔ Heap; r_life ≔ Live :: m_regionsmatch initial_memoryhi_module with Some_, m ⇒ m | None ⇒ empty_mem end; m_aux ≔ m_auxmatch initial_memoryhi_module with Some_, m ⇒ m | None ⇒ empty_mem end a = 0 ∧ m_auxm_bytes ≔ m_bytesmatch initial_memoryhi_module with Some_, m ⇒ m | None ⇒ empty_mem end; m_regions ≔ r_base ≔ 2048; r_end ≔ 2064; r_kind ≔ Heap; r_life ≔ Live :: m_regionsmatch initial_memoryhi_module with Some_, m ⇒ m | None ⇒ empty_mem end; m_aux ≔ m_auxmatch initial_memoryhi_module with Some_, m ⇒ m | None ⇒ empty_mem end a = CNone

lazy - [ Z.eqb Z.leb Z.ltb Z.add Z.sub Z.mul Z.div Z.modulo Z.pow ]

a :
Z
Ha :
2 ^ 32 ≤ a
⊢
65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 ≤? a
→
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 + 1
else
false
→
0 mod 2 ^ 8 × 1 / 2 ^ 8 × a − 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 mod 256
65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 ≤? a
→
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1
else
false
→
111 mod 2 ^ 8 × 1 / 2 ^ 8 × a − 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 mod 256
65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 ≤? a
→
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1
else
false
→
108 mod 2 ^ 8 × 1 / 2 ^ 8 × a − 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 mod 256
65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 ≤? a
→
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1
else
false
→
108 mod 2 ^ 8 × 1 / 2 ^ 8 × a − 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 mod 256
65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 ≤? a
→
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1
else
false
→
101 mod 2 ^ 8 × 1 / 2 ^ 8 × a − 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 mod 256
65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 ≤? a
→
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1
else
false
→
104 mod 2 ^ 8 × 1 / 2 ^ 8 × a − 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 mod 256
else
0
=
0
∧

repeat match goal with|- context [a <? ?x]⇒let E ≔ fresh in assert E : a <? x = false by apply Z.ltb_ge ; apply Z.le_trans with 2 ^ 32 ; vm_compute ; discriminate | exact Ha ; rewrite E|- context [?x ≤? a]⇒destruct x ≤? aend

64 open

a :
Z
Ha :
2 ^ 32 ≤ a
H :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 + 1 = false
H0 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 = false
H1 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 = false
H2 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 = false
H3 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 = false
H4 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 = false
⊢
0 = 0 ∧ CNone = CNone
focused goal
a :
Z
Ha :
2 ^ 32 ≤ a
H :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 + 1 = false
H0 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 = false
H1 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 = false
H2 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 = false
H3 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 = false
H4 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 = false
⊢
0 = 0 ∧ CNone = CNone
focused goal
a :
Z
Ha :
2 ^ 32 ≤ a
H :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 + 1 = false
H0 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 = false
H1 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 = false
H2 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 = false
H3 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 = false
H4 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 = false
⊢
0 = 0 ∧ CNone = CNone
focused goal
a :
Z
Ha :
2 ^ 32 ≤ a
H :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 + 1 = false
H0 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 = false
H1 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 = false
H2 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 = false
H3 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 = false
H4 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 = false
⊢
0 = 0 ∧ CNone = CNone
focused goal
a :
Z
Ha :
2 ^ 32 ≤ a
H :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 + 1 = false
H0 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 = false
H1 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 = false
H2 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 = false
H3 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 = false
H4 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 = false
⊢
0 = 0 ∧ CNone = CNone
focused goal
a :
Z
Ha :
2 ^ 32 ≤ a
H :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 + 1 = false
H0 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 = false
H1 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 = false
H2 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 = false
H3 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 = false
H4 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 = false
⊢
0 = 0 ∧ CNone = CNone
focused goal
a :
Z
Ha :
2 ^ 32 ≤ a
H :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 + 1 = false
H0 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 = false
H1 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 = false
H2 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 = false
H3 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 = false
H4 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 = false
⊢
0 = 0 ∧ CNone = CNone
focused goal
a :
Z
Ha :
2 ^ 32 ≤ a
H :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 + 1 = false
H0 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 = false
H1 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 = false
H2 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 = false
H3 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 = false
H4 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 = false
⊢
0 = 0 ∧ CNone = CNone
focused goal
a :
Z
Ha :
2 ^ 32 ≤ a
H :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 + 1 = false
H0 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 = false
H1 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 = false
H2 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 = false
H3 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 = false
H4 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 = false
⊢
0 = 0 ∧ CNone = CNone
focused goal
a :
Z
Ha :
2 ^ 32 ≤ a
H :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 + 1 = false
H0 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 = false
H1 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 = false
H2 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 = false
H3 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 = false
H4 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 = false
⊢
0 = 0 ∧ CNone = CNone
focused goal
a :
Z
Ha :
2 ^ 32 ≤ a
H :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 + 1 = false
H0 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 = false
H1 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 = false
H2 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 = false
H3 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 = false
H4 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 = false
⊢
0 = 0 ∧ CNone = CNone
focused goal
a :
Z
Ha :
2 ^ 32 ≤ a
H :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 + 1 = false
H0 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 = false
H1 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 = false
H2 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 = false
H3 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 = false
H4 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 = false
⊢
0 = 0 ∧ CNone = CNone
focused goal
a :
Z
Ha :
2 ^ 32 ≤ a
H :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 + 1 = false
H0 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 = false
H1 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 = false
H2 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 = false
H3 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 = false
H4 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 = false
⊢
0 = 0 ∧ CNone = CNone
focused goal
a :
Z
Ha :
2 ^ 32 ≤ a
H :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 + 1 = false
H0 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 = false
H1 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 = false
H2 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 = false
H3 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 = false
H4 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 = false
⊢
0 = 0 ∧ CNone = CNone
focused goal
a :
Z
Ha :
2 ^ 32 ≤ a
H :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 + 1 = false
H0 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 = false
H1 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 = false
H2 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 = false
H3 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 = false
H4 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 = false
⊢
0 = 0 ∧ CNone = CNone
focused goal
a :
Z
Ha :
2 ^ 32 ≤ a
H :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 + 1 = false
H0 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 = false
H1 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 = false
H2 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 = false
H3 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 = false
H4 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 = false
⊢
0 = 0 ∧ CNone = CNone
focused goal
a :
Z
Ha :
2 ^ 32 ≤ a
H :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 + 1 = false
H0 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 = false
H1 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 = false
H2 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 = false
H3 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 = false
H4 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 = false
⊢
0 = 0 ∧ CNone = CNone
focused goal
a :
Z
Ha :
2 ^ 32 ≤ a
H :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 + 1 = false
H0 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 = false
H1 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 = false
H2 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 = false
H3 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 = false
H4 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 = false
⊢
0 = 0 ∧ CNone = CNone
focused goal
a :
Z
Ha :
2 ^ 32 ≤ a
H :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 + 1 = false
H0 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 = false
H1 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 = false
H2 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 = false
H3 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 = false
H4 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 = false
⊢
0 = 0 ∧ CNone = CNone
focused goal
a :
Z
Ha :
2 ^ 32 ≤ a
H :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 + 1 = false
H0 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 = false
H1 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 = false
H2 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 = false
H3 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 = false
H4 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 = false
⊢
0 = 0 ∧ CNone = CNone
focused goal
a :
Z
Ha :
2 ^ 32 ≤ a
H :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 + 1 = false
H0 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 = false
H1 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 = false
H2 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 = false
H3 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 = false
H4 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 = false
⊢
0 = 0 ∧ CNone = CNone
focused goal
a :
Z
Ha :
2 ^ 32 ≤ a
H :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 + 1 = false
H0 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 = false
H1 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 = false
H2 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 = false
H3 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 = false
H4 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 = false
⊢
0 = 0 ∧ CNone = CNone
focused goal
a :
Z
Ha :
2 ^ 32 ≤ a
H :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 + 1 = false
H0 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 = false
H1 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 = false
H2 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 = false
H3 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 = false
H4 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 = false
⊢
0 = 0 ∧ CNone = CNone
focused goal
a :
Z
Ha :
2 ^ 32 ≤ a
H :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 + 1 = false
H0 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 = false
H1 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 = false
H2 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 = false
H3 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 = false
H4 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 = false
⊢
0 = 0 ∧ CNone = CNone
focused goal
a :
Z
Ha :
2 ^ 32 ≤ a
H :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 + 1 = false
H0 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 = false
H1 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 = false
H2 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 = false
H3 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 = false
H4 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 = false
⊢
0 = 0 ∧ CNone = CNone
focused goal
a :
Z
Ha :
2 ^ 32 ≤ a
H :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 + 1 = false
H0 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 = false
H1 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 = false
H2 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 = false
H3 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 = false
H4 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 = false
⊢
0 = 0 ∧ CNone = CNone
focused goal
a :
Z
Ha :
2 ^ 32 ≤ a
H :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 + 1 = false
H0 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 = false
H1 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 = false
H2 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 = false
H3 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 = false
H4 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 = false
⊢
0 = 0 ∧ CNone = CNone
focused goal
a :
Z
Ha :
2 ^ 32 ≤ a
H :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 + 1 = false
H0 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 = false
H1 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 = false
H2 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 = false
H3 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 = false
H4 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 = false
⊢
0 = 0 ∧ CNone = CNone
focused goal
a :
Z
Ha :
2 ^ 32 ≤ a
H :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 + 1 = false
H0 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 = false
H1 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 = false
H2 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 = false
H3 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 = false
H4 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 = false
⊢
0 = 0 ∧ CNone = CNone
focused goal
a :
Z
Ha :
2 ^ 32 ≤ a
H :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 + 1 = false
H0 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 = false
H1 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 = false
H2 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 = false
H3 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 = false
H4 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 = false
⊢
0 = 0 ∧ CNone = CNone
focused goal
a :
Z
Ha :
2 ^ 32 ≤ a
H :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 + 1 = false
H0 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 = false
H1 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 = false
H2 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 = false
H3 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 = false
H4 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 = false
⊢
0 = 0 ∧ CNone = CNone
focused goal
a :
Z
Ha :
2 ^ 32 ≤ a
H :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 + 1 = false
H0 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 = false
H1 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 = false
H2 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 = false
H3 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 = false
H4 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 = false
⊢
0 = 0 ∧ CNone = CNone
focused goal
a :
Z
Ha :
2 ^ 32 ≤ a
H :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 + 1 = false
H0 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 = false
H1 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 = false
H2 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 = false
H3 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 = false
H4 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 = false
⊢
0 = 0 ∧ CNone = CNone
focused goal
a :
Z
Ha :
2 ^ 32 ≤ a
H :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 + 1 = false
H0 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 = false
H1 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 = false
H2 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 = false
H3 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 = false
H4 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 = false
⊢
0 = 0 ∧ CNone = CNone
focused goal
a :
Z
Ha :
2 ^ 32 ≤ a
H :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 + 1 = false
H0 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 = false
H1 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 = false
H2 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 = false
H3 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 = false
H4 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 = false
⊢
0 = 0 ∧ CNone = CNone
focused goal
a :
Z
Ha :
2 ^ 32 ≤ a
H :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 + 1 = false
H0 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 = false
H1 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 = false
H2 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 = false
H3 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 = false
H4 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 = false
⊢
0 = 0 ∧ CNone = CNone
focused goal
a :
Z
Ha :
2 ^ 32 ≤ a
H :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 + 1 = false
H0 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 = false
H1 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 = false
H2 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 = false
H3 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 = false
H4 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 = false
⊢
0 = 0 ∧ CNone = CNone
focused goal
a :
Z
Ha :
2 ^ 32 ≤ a
H :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 + 1 = false
H0 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 = false
H1 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 = false
H2 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 = false
H3 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 = false
H4 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 = false
⊢
0 = 0 ∧ CNone = CNone
focused goal
a :
Z
Ha :
2 ^ 32 ≤ a
H :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 + 1 = false
H0 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 = false
H1 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 = false
H2 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 = false
H3 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 = false
H4 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 = false
⊢
0 = 0 ∧ CNone = CNone
focused goal
a :
Z
Ha :
2 ^ 32 ≤ a
H :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 + 1 = false
H0 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 = false
H1 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 = false
H2 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 = false
H3 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 = false
H4 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 = false
⊢
0 = 0 ∧ CNone = CNone
focused goal
a :
Z
Ha :
2 ^ 32 ≤ a
H :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 + 1 = false
H0 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 = false
H1 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 = false
H2 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 = false
H3 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 = false
H4 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 = false
⊢
0 = 0 ∧ CNone = CNone
focused goal
a :
Z
Ha :
2 ^ 32 ≤ a
H :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 + 1 = false
H0 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 = false
H1 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 = false
H2 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 = false
H3 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 = false
H4 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 = false
⊢
0 = 0 ∧ CNone = CNone
focused goal
a :
Z
Ha :
2 ^ 32 ≤ a
H :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 + 1 = false
H0 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 = false
H1 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 = false
H2 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 = false
H3 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 = false
H4 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 = false
⊢
0 = 0 ∧ CNone = CNone
focused goal
a :
Z
Ha :
2 ^ 32 ≤ a
H :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 + 1 = false
H0 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 = false
H1 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 = false
H2 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 = false
H3 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 = false
H4 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 = false
⊢
0 = 0 ∧ CNone = CNone
focused goal
a :
Z
Ha :
2 ^ 32 ≤ a
H :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 + 1 = false
H0 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 = false
H1 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 = false
H2 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 = false
H3 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 = false
H4 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 = false
⊢
0 = 0 ∧ CNone = CNone
focused goal
a :
Z
Ha :
2 ^ 32 ≤ a
H :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 + 1 = false
H0 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 = false
H1 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 = false
H2 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 = false
H3 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 = false
H4 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 = false
⊢
0 = 0 ∧ CNone = CNone
focused goal
a :
Z
Ha :
2 ^ 32 ≤ a
H :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 + 1 = false
H0 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 = false
H1 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 = false
H2 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 = false
H3 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 = false
H4 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 = false
⊢
0 = 0 ∧ CNone = CNone
focused goal
a :
Z
Ha :
2 ^ 32 ≤ a
H :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 + 1 = false
H0 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 = false
H1 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 = false
H2 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 = false
H3 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 = false
H4 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 = false
⊢
0 = 0 ∧ CNone = CNone
focused goal
a :
Z
Ha :
2 ^ 32 ≤ a
H :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 + 1 = false
H0 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 = false
H1 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 = false
H2 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 = false
H3 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 = false
H4 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 = false
⊢
0 = 0 ∧ CNone = CNone
focused goal
a :
Z
Ha :
2 ^ 32 ≤ a
H :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 + 1 = false
H0 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 = false
H1 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 = false
H2 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 = false
H3 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 = false
H4 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 = false
⊢
0 = 0 ∧ CNone = CNone
focused goal
a :
Z
Ha :
2 ^ 32 ≤ a
H :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 + 1 = false
H0 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 = false
H1 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 = false
H2 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 = false
H3 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 = false
H4 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 = false
⊢
0 = 0 ∧ CNone = CNone
focused goal
a :
Z
Ha :
2 ^ 32 ≤ a
H :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 + 1 = false
H0 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 = false
H1 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 = false
H2 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 = false
H3 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 = false
H4 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 = false
⊢
0 = 0 ∧ CNone = CNone
focused goal
a :
Z
Ha :
2 ^ 32 ≤ a
H :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 + 1 = false
H0 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 = false
H1 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 = false
H2 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 = false
H3 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 = false
H4 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 = false
⊢
0 = 0 ∧ CNone = CNone
focused goal
a :
Z
Ha :
2 ^ 32 ≤ a
H :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 + 1 = false
H0 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 = false
H1 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 = false
H2 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 = false
H3 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 = false
H4 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 = false
⊢
0 = 0 ∧ CNone = CNone
focused goal
a :
Z
Ha :
2 ^ 32 ≤ a
H :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 + 1 = false
H0 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 = false
H1 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 = false
H2 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 = false
H3 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 = false
H4 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 = false
⊢
0 = 0 ∧ CNone = CNone
focused goal
a :
Z
Ha :
2 ^ 32 ≤ a
H :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 + 1 = false
H0 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 = false
H1 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 = false
H2 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 = false
H3 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 = false
H4 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 = false
⊢
0 = 0 ∧ CNone = CNone
focused goal
a :
Z
Ha :
2 ^ 32 ≤ a
H :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 + 1 = false
H0 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 = false
H1 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 = false
H2 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 = false
H3 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 = false
H4 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 = false
⊢
0 = 0 ∧ CNone = CNone
focused goal
a :
Z
Ha :
2 ^ 32 ≤ a
H :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 + 1 = false
H0 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 = false
H1 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 = false
H2 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 = false
H3 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 = false
H4 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 = false
⊢
0 = 0 ∧ CNone = CNone
focused goal
a :
Z
Ha :
2 ^ 32 ≤ a
H :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 + 1 = false
H0 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 = false
H1 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 = false
H2 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 = false
H3 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 = false
H4 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 = false
⊢
0 = 0 ∧ CNone = CNone
focused goal
a :
Z
Ha :
2 ^ 32 ≤ a
H :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 + 1 = false
H0 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 = false
H1 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 = false
H2 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 = false
H3 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 = false
H4 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 = false
⊢
0 = 0 ∧ CNone = CNone
focused goal
a :
Z
Ha :
2 ^ 32 ≤ a
H :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 + 1 = false
H0 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 = false
H1 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 = false
H2 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 = false
H3 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 = false
H4 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 = false
⊢
0 = 0 ∧ CNone = CNone
focused goal
a :
Z
Ha :
2 ^ 32 ≤ a
H :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 + 1 = false
H0 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 = false
H1 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 = false
H2 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 = false
H3 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 = false
H4 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 = false
⊢
0 = 0 ∧ CNone = CNone
focused goal
a :
Z
Ha :
2 ^ 32 ≤ a
H :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 + 1 = false
H0 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 = false
H1 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 = false
H2 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 = false
H3 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 = false
H4 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 = false
⊢
0 = 0 ∧ CNone = CNone
focused goal
a :
Z
Ha :
2 ^ 32 ≤ a
H :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 + 1 = false
H0 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 + 1 = false
H1 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 + 1 = false
H2 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 + 1 = false
H3 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 + 1 = false
H4 :
a <? 65536 + 16 − 1 / 16 × 16 + 16 + 16 − 1 / 16 × 16 + 1 = false
⊢
0 = 0 ∧ CNone = CNone

all: split ; reflexivity

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros a Ha
lazy - [ Z.eqb Z.leb Z.ltb Z.add Z.sub Z.mul Z.div Z.modulo Z.pow ]
repeat match goal with|- context [a <? ?x]⇒let E ≔ fresh in assert E : a <? x = false by apply Z.ltb_ge ; apply Z.le_trans with 2 ^ 32 ; vm_compute ; discriminate | exact Ha ; rewrite E|- context [?x ≤? a]⇒destruct x ≤? aend
all: split ; reflexivity

The interpreter is ready in Hi.v's fixture memory: the libc root at 2048 and the literal at 65552, both below its first allocation at 2^32.

Explore proof 6 tactics

Initial goal

split ; vm_compute ; split ; congruence |

⊢
∀b : Z reg : region, object_regionb m_regionsHiChecks.memory = Somereg → 0 ≤ b < InterpRuntime.start ∧ r_endreg ≤ InterpRuntime.start ∧ r_lifereg = Freed → r_endreg = b ∧ ∀a : Z, InterpRuntime.start ≤ a → m_bytesHiChecks.memory a = 0 ∧ m_auxHiChecks.memory a = CNone

split ; | exact hi_memory_high

⊢
∀b : Z reg : region, object_regionb m_regionsHiChecks.memory = Somereg → 0 ≤ b < InterpRuntime.start ∧ r_endreg ≤ InterpRuntime.start ∧ r_lifereg = Freed → r_endreg = b

intros b reg E

⊢
0 ≤ b < InterpRuntime.start ∧ r_endreg ≤ InterpRuntime.start ∧ r_lifereg = Freed → r_endreg = b

change object_regionb mkRegion2048 2064 Heap Live; lit_reg = Somereg in E

b :
Z
reg :
E :
object_regionb r_base ≔ 2048; r_end ≔ 2064; r_kind ≔ Heap; r_life ≔ Live; lit_reg = Somereg
⊢
0 ≤ b < InterpRuntime.start ∧ r_endreg ≤ InterpRuntime.start ∧ r_lifereg = Freed → r_endreg = b

cbn - [ Z.eqb ] in E

b :
Z
reg :
E :
2048 =? b
→
Somer_base ≔ 2048; r_end ≔ 2064; r_kind ≔ Heap; r_life ≔ Live
65552 =? b
→
else
None
=
Somereg
⊢
0 ≤ b < InterpRuntime.start ∧ r_endreg ≤ InterpRuntime.start ∧ r_lifereg = Freed → r_endreg = b

destruct 2048 =? b eqn: E1 ; | destruct 65552 =? b eqn: E2 ; | discriminate E ; apply Z.eqb_eq in E1 || apply Z.eqb_eq in E2 ; subst b ; injection E as ← ; split ; vm_compute ; split ; congruence | ; split ; vm_compute ; congruence | discriminate

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
split ; vm_compute ; split ; congruence |
split ; | exact hi_memory_high
intros b reg E
change object_regionb mkRegion2048 2064 Heap Live; lit_reg = Somereg in E
cbn - [ Z.eqb ] in E
destruct 2048 =? b eqn: E1 ; | destruct 65552 =? b eqn: E2 ; | discriminate E ; apply Z.eqb_eq in E1 || apply Z.eqb_eq in E2 ; subst b ; injection E as ← ; split ; vm_compute ; split ; congruence | ; split ; vm_compute ; congruence | discriminate

The fixture's two live objects are apart.

201Lemma hi_memory_disjoint
Explore proof 5 tactics

Initial goal

intros b1 r1 b2 r2 E1 _ E2 _ Hne

b1 :
Z
r1 :
b2 :
Z
r2 :
Hne :
b1 ≠ b2
⊢
r_endr1 ≤ b2 ∨ r_endr2 ≤ b1

change object_regionb1 mkRegion2048 2064 Heap Live; lit_reg = Somer1 in E1

b1 :
Z
r1 :
b2 :
Z
r2 :
E1 :
object_regionb1 r_base ≔ 2048; r_end ≔ 2064; r_kind ≔ Heap; r_life ≔ Live; lit_reg = Somer1
Hne :
b1 ≠ b2
⊢
r_endr1 ≤ b2 ∨ r_endr2 ≤ b1

change object_regionb2 mkRegion2048 2064 Heap Live; lit_reg = Somer2 in E2

b1 :
Z
r1 :
b2 :
Z
r2 :
E1 :
object_regionb1 r_base ≔ 2048; r_end ≔ 2064; r_kind ≔ Heap; r_life ≔ Live; lit_reg = Somer1
E2 :
object_regionb2 r_base ≔ 2048; r_end ≔ 2064; r_kind ≔ Heap; r_life ≔ Live; lit_reg = Somer2
Hne :
b1 ≠ b2
⊢
r_endr1 ≤ b2 ∨ r_endr2 ≤ b1

cbn - [ Z.eqb ] in E1 , E2

b1 :
Z
r1 :
b2 :
Z
r2 :
E1 :
2048 =? b1
→
Somer_base ≔ 2048; r_end ≔ 2064; r_kind ≔ Heap; r_life ≔ Live
65552 =? b1
→
else
None
=
Somer1
E2 :
2048 =? b2
→
Somer_base ≔ 2048; r_end ≔ 2064; r_kind ≔ Heap; r_life ≔ Live
65552 =? b2
→
else
None
=
Somer2
Hne :
b1 ≠ b2
⊢
r_endr1 ≤ b2 ∨ r_endr2 ≤ b1

destruct 2048 =? b1 eqn: F1 ; | destruct 65552 =? b1 eqn: G1 ; | discriminate E1 ; destruct 2048 =? b2 eqn: F2 ; | destruct 65552 =? b2 eqn: G2 ; | discriminate E2;repeat match goal withH : _ =? _ = true |- _⇒apply Z.eqb_eq in Hend;injection E1 as ←;injection E2 as ←;cbn;lia

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script
intros b1 r1 b2 r2 E1 _ E2 _ Hne
change object_regionb1 mkRegion2048 2064 Heap Live; lit_reg = Somer1 in E1
change object_regionb2 mkRegion2048 2064 Heap Live; lit_reg = Somer2 in E2
cbn - [ Z.eqb ] in E1 , E2
destruct 2048 =? b1 eqn: F1 ; | destruct 65552 =? b1 eqn: G1 ; | discriminate E1 ; destruct 2048 =? b2 eqn: F2 ; | destruct 65552 =? b2 eqn: G2 ; | discriminate E2;repeat match goal withH : _ =? _ = true |- _⇒apply Z.eqb_eq in Hend;injection E1 as ←;injection E2 as ←;cbn;lia

hi's body is safe under the interpreter's runtime, from Hi.v's fixture: the libc root at 2048 and the initialized literal, with the fixture's stream representation.

Explore proof 9 tactics

Initial goal

intros fuel

apply InterpHiLogic.hi_logic_safefixture_rep fixture_requests HiChecks.interpreter_stdio_stablefixture_rep hiΣ

4 open

focused goal
focused goal
focused goal

–exact hi_memory_ready

3 open

deferred goal
deferred goal
deferred goal

–exact hi_memory_disjoint

2 open

deferred goal
deferred goal

–exact HiChecks.entry_pre

deferred goal

–intros sp a [ <-| [ ] ] Hs

fuel, a :
Z
⊢
¬65552 ≤ a < 65560

unfold span_contains in Hs

⊢
¬65552 ≤ a < 65560

cbn in Hs

fuel, a :
Z
Hs :
2048 ≤ a < 2048 + 16
⊢
¬65552 ≤ a < 65560

lia

No remaining goals.

Qed

✓ Proof checked and closed by Rocq.

Source script