Skip to content

Commit 6a6ca39

Browse files
Merge pull request #235 from SkyLabsAI/paolo/extend-float-theory
Extend float theory
2 parents 3e61482 + b8ec08c commit 6a6ca39

11 files changed

Lines changed: 251 additions & 220 deletions

File tree

rocq-skylabs-brick/tests/float_simple_pred_support.v

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ Section pure_encoding_tests.
3636
rewrite /pure_encodes /=.
3737
split; [reflexivity|].
3838
split.
39-
- replace (float_value.to_bits float_type.Ffloat16 f16_one) with f16_one_bits.
39+
- replace (float_value.to_bits f16_one) with f16_one_bits.
4040
+ rewrite /in_Z_to_bytes_bounds /f16_one_bits /=.
4141
change (0 <= 15360 /\ 15360 < 65536)%Z. lia.
4242
+ symmetry. apply float_value.to_of_bits. change (0 <= 15360 < 65536)%Z. lia.
@@ -50,7 +50,7 @@ Section pure_encoding_tests.
5050
rewrite /pure_encodes /=.
5151
split; [reflexivity|].
5252
split.
53-
- replace (float_value.to_bits float_type.Ffloat f32_one) with f32_one_bits.
53+
- replace (float_value.to_bits f32_one) with f32_one_bits.
5454
+ rewrite /in_Z_to_bytes_bounds /f32_one_bits /=.
5555
change (0 <= 1065353216 /\ 1065353216 < 4294967296)%Z. lia.
5656
+ symmetry. apply float_value.to_of_bits.
@@ -65,7 +65,7 @@ Section pure_encoding_tests.
6565
rewrite /pure_encodes /=.
6666
split; [reflexivity|].
6767
split.
68-
- replace (float_value.to_bits float_type.Ffloat128 f128_one) with f128_one_bits.
68+
- replace (float_value.to_bits f128_one) with f128_one_bits.
6969
+ rewrite /in_Z_to_bytes_bounds /f128_one_bits /=.
7070
change (0 <= 85065399433376081038215121361612832768 /\
7171
85065399433376081038215121361612832768 <

rocq-skylabs-brick/tests/float_support.v

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -268,17 +268,17 @@ Qed.
268268

269269
Example float_to_of_bits_roundtrips bits :
270270
(0 <= bits < 2 ^ float_type.bit_width float_type.Ffloat)%Z ->
271-
float_value.to_bits float_type.Ffloat
271+
float_value.to_bits
272272
(float_value.of_bits float_type.Ffloat bits) = bits.
273273
Proof. apply float_value.to_of_bits. Qed.
274274

275-
Example double_of_to_bits_roundtrip f :
275+
Example double_of_to_bits_roundtrip (f : float_type.car float_type.Fdouble) :
276276
float_value.of_bits float_type.Fdouble
277-
(float_value.to_bits float_type.Fdouble f) = f.
277+
(float_value.to_bits f) = f.
278278
Proof. apply float_value.of_to_bits. Qed.
279279

280280
Example float128_nan_payload_bits_preserved :
281-
float_value.to_bits float_type.Ffloat128 f128_nan_payload = f128_nan_payload_bits.
281+
float_value.to_bits f128_nan_payload = f128_nan_payload_bits.
282282
Proof.
283283
apply float_value.to_of_bits.
284284
change (0 <= 170138587312039964317873038467719495681 <
@@ -356,16 +356,16 @@ Proof.
356356
Qed.
357357

358358
Example float_nan_compare_unordered :
359-
float_value.value_compare float_type.Ffloat f32_nan f32_nan = None.
359+
float_value.value_compare f32_nan f32_nan = None.
360360
Proof. vm_compute; reflexivity. Qed.
361361

362362
Example double_nan_compare_unordered :
363-
float_value.value_compare float_type.Fdouble f64_nan f64_nan = None.
363+
float_value.value_compare f64_nan f64_nan = None.
364364
Proof. vm_compute; reflexivity. Qed.
365365

366366
Example float_nan_payload_add_preserved :
367-
float_value.to_bits float_type.Ffloat
368-
(float_value.add float_type.Ffloat f32_nan_payload f32_one) =
367+
float_value.to_bits
368+
(float_value.add f32_nan_payload f32_one) =
369369
f32_nan_payload_bits.
370370
Proof. vm_compute; reflexivity. Qed.
371371

@@ -383,22 +383,22 @@ Proof. vm_compute; reflexivity. Qed.
383383

384384
Example raw_float16_intro {σ : genv} :
385385
raw_bytes_of_val σ Tfloat16 (Vfloat float_type.Ffloat16 f16_one)
386-
(float_raw_bytes σ float_type.Ffloat16 f16_one).
386+
(float_raw_bytes σ f16_one).
387387
Proof. apply raw_bytes_of_val_float_intro. Qed.
388388

389389
Example raw_float_intro {σ : genv} :
390390
raw_bytes_of_val σ Tfloat (Vfloat float_type.Ffloat f32_one)
391-
(float_raw_bytes σ float_type.Ffloat f32_one).
391+
(float_raw_bytes σ f32_one).
392392
Proof. apply raw_bytes_of_val_float_intro. Qed.
393393

394394
Example raw_double_intro {σ : genv} :
395395
raw_bytes_of_val σ Tdouble (Vfloat float_type.Fdouble f64_one)
396-
(float_raw_bytes σ float_type.Fdouble f64_one).
396+
(float_raw_bytes σ f64_one).
397397
Proof. apply raw_bytes_of_val_float_intro. Qed.
398398

399399
Example raw_float128_intro {σ : genv} :
400400
raw_bytes_of_val σ Tfloat128 (Vfloat float_type.Ffloat128 f128_one)
401-
(float_raw_bytes σ float_type.Ffloat128 f128_one).
401+
(float_raw_bytes σ f128_one).
402402
Proof. apply raw_bytes_of_val_float_intro. Qed.
403403

404404
Example float16_bits_compatible :
@@ -422,7 +422,7 @@ Example longdouble_raw_bits_not_binary128_compatible :
422422
Proof. intros [_ Hwidth]. vm_compute in Hwidth. discriminate. Qed.
423423

424424
Example float_to_bits_has_unsigned_type {σ : genv} :
425-
has_type_prop (Vint (float_value.to_bits float_type.Ffloat f32_one))
425+
has_type_prop (Vint (float_value.to_bits f32_one))
426426
(Tnum int_rank.Iint Unsigned).
427427
Proof.
428428
apply float_to_bits_has_type_unsigned.

rocq-skylabs-brick/theories/lang/cpp/logic/raw.v

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,12 +66,12 @@ Axiom raw_byte_of_int_eq : ∀ {σ : genv} sz x rs,
6666
∃ l, decodes_uint l x /\ raw_int_byte <$> l = rs /\ length l = N.to_nat (int_rank.bytesN sz).
6767

6868
Lemma raw_bytes_of_val_float_intro {σ : genv} ft (f : float_type.car ft) :
69-
raw_bytes_of_val σ (Tfloat_ ft) (Vfloat ft f) (float_raw_bytes σ ft f).
69+
raw_bytes_of_val σ (Tfloat_ ft) (Vfloat ft f) (float_raw_bytes σ f).
7070
Proof. apply raw_bytes_of_val_float. reflexivity. Qed.
7171

7272
Lemma raw_bytes_of_val_float_elim {σ : genv} ft (f : float_type.car ft) rs :
7373
raw_bytes_of_val σ (Tfloat_ ft) (Vfloat ft f) rs ->
74-
rs = float_raw_bytes σ ft f.
74+
rs = float_raw_bytes σ f.
7575
Proof. apply raw_bytes_of_val_float. Qed.
7676

7777
Definition float_bits_compatible (sz : int_rank.t) (ft : float_type.t) : Prop :=
@@ -87,7 +87,7 @@ Qed.
8787

8888
Lemma float_to_bits_has_type_unsigned {σ : genv} sz ft (f : float_type.car ft) :
8989
float_bits_compatible sz ft ->
90-
has_type_prop (Vint (float_value.to_bits ft f)) (Tnum sz Unsigned).
90+
has_type_prop (Vint (float_value.to_bits f)) (Tnum sz Unsigned).
9191
Proof.
9292
intros [Hbits Hwidth].
9393
rewrite -has_int_type.

rocq-skylabs-brick/theories/lang/cpp/model/simple_pred.v

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -430,8 +430,8 @@ Module SimpleCPP.
430430
match v with
431431
| Vfloat ft' f =>
432432
ft = ft' /\
433-
in_Z_to_bytes_bounds (float_type.bitsize ft') Unsigned (float_value.to_bits ft' f) /\
434-
vs = Z_to_bytes (float_type.bitsize ft') Unsigned (float_value.to_bits ft' f)
433+
in_Z_to_bytes_bounds (float_type.bitsize ft') Unsigned (float_value.to_bits f) /\
434+
vs = Z_to_bytes (float_type.bitsize ft') Unsigned (float_value.to_bits f)
435435
| Vundef => pure_encodes_undef (float_type.bitsize ft) vs
436436
| _ => False
437437
end

rocq-skylabs-brick/theories/lang/cpp/semantics/cast.v

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -296,7 +296,7 @@ Definition conv_float {σ : genv} (tu : translation_unit) (from to : type) (v v'
296296
| Tfloat_ _ , Tnum _ _ =>
297297
match v with
298298
| Vfloat f z =>
299-
match float_value.to_int f z with
299+
match float_value.to_int z with
300300
| Some n => v' = Vint n /\ has_type_prop (Vint n) to
301301
| None => False
302302
end
@@ -432,7 +432,7 @@ Section conv_float.
432432

433433
Lemma conv_float_to_int ty sz sgn ft (fv : float_type.car ft) z :
434434
representation_type tu ty = Tnum sz sgn ->
435-
float_value.to_int ft fv = Some z ->
435+
float_value.to_int fv = Some z ->
436436
has_type_prop (Vint z) ty ->
437437
conv_float tu (Tfloat_ ft) ty (Vfloat ft fv) (Vint z).
438438
Proof using Hmod.
@@ -459,7 +459,7 @@ Section conv_float.
459459

460460
Lemma conv_float_to_enum nm sz sgn ft (fv : float_type.car ft) z :
461461
representation_type tu (Tenum nm) = Tnum sz sgn ->
462-
float_value.to_int ft fv = Some z ->
462+
float_value.to_int fv = Some z ->
463463
has_type_prop (Vint z) (Tenum nm) ->
464464
conv_float tu (Tfloat_ ft) (Tenum nm) (Vfloat ft fv) (Vint z).
465465
Proof using Hmod.

rocq-skylabs-brick/theories/lang/cpp/semantics/characters.v

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ Definition Z_to_char_bits (ct : char_type.t) (z : Z) : N :=
7070

7171
Definition float_to_char (σ : genv) (ft : float_type.t) (ct : char_type.t)
7272
(f : float_type.car ft) : option N :=
73-
match float_value.to_int ft f with
73+
match float_value.to_int f with
7474
| Some z => if char_float_boundb σ ct z then Some (Z_to_char_bits ct z) else None
7575
| None => None
7676
end.
@@ -450,7 +450,7 @@ Lemma float_to_char_has_type {σ : genv} ft ct (f : float_type.car ft) n :
450450
has_type_prop (Vchar n) (Tchar_ ct).
451451
Proof.
452452
rewrite /float_to_char.
453-
destruct (float_value.to_int ft f) as [z|] eqn:HtoZ; try discriminate.
453+
destruct (float_value.to_int f) as [z|] eqn:HtoZ; try discriminate.
454454
destruct (char_float_boundb σ ct z) eqn:Hbound; inversion 1; subst.
455455
apply has_type_prop_char'.
456456
apply Z_to_char_bits_bounded.

rocq-skylabs-brick/theories/lang/cpp/semantics/operator.v

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ Axiom eval_minus_int : forall ty a c,
151151
eval_unop Uminus ty ty (Vint a) (Vint c).
152152
Axiom eval_minus_float : forall f a,
153153
eval_unop Uminus (Tfloat_ f) (Tfloat_ f)
154-
(Vfloat f a) (Vfloat f (float_value.opp f a)).
154+
(Vfloat f a) (Vfloat f (float_value.opp a)).
155155

156156
(** * Binary Operators *)
157157

@@ -194,10 +194,10 @@ Let eval_float_op (bo : BinOp)
194194
eval_binop_pure bo (Tfloat_ f) (Tfloat_ f) (Tfloat_ f)
195195
(Vfloat f a) (Vfloat f b) (Vfloat f c).
196196

197-
Axiom eval_float_add : Hnf (eval_float_op Badd float_value.add).
198-
Axiom eval_float_sub : Hnf (eval_float_op Bsub float_value.sub).
199-
Axiom eval_float_mul : Hnf (eval_float_op Bmul float_value.mul).
200-
Axiom eval_float_div : Hnf (eval_float_op Bdiv float_value.div).
197+
Axiom eval_float_add : Hnf (eval_float_op Badd (@float_value.add)).
198+
Axiom eval_float_sub : Hnf (eval_float_op Bsub (@float_value.sub)).
199+
Axiom eval_float_mul : Hnf (eval_float_op Bmul (@float_value.mul)).
200+
Axiom eval_float_div : Hnf (eval_float_op Bdiv (@float_value.div)).
201201

202202
(* The binary operator / divides the first operand by the second, after usual
203203
arithmetic conversions.
@@ -418,12 +418,12 @@ Arguments eval_ge _ {_}.
418418
eval_binop_pure bo (Tfloat_ f) (Tfloat_ f) ty'
419419
(Vfloat f av) (Vfloat f bv) (Vbool (o f av bv)).
420420

421-
Axiom eval_float_eq : Hnf (eval_float_rel_op float_value.eqb Beq).
422-
Axiom eval_float_neq : Hnf (eval_float_rel_op float_value.neqb Bneq).
423-
Axiom eval_float_lt : Hnf (eval_float_rel_op float_value.ltb Blt).
424-
Axiom eval_float_gt : Hnf (eval_float_rel_op float_value.gtb Bgt).
425-
Axiom eval_float_le : Hnf (eval_float_rel_op float_value.leb Ble).
426-
Axiom eval_float_ge : Hnf (eval_float_rel_op float_value.geb Bge).
421+
Axiom eval_float_eq : Hnf (eval_float_rel_op (@float_value.eqb) Beq).
422+
Axiom eval_float_neq : Hnf (eval_float_rel_op (@float_value.neqb) Bneq).
423+
Axiom eval_float_lt : Hnf (eval_float_rel_op (@float_value.ltb) Blt).
424+
Axiom eval_float_gt : Hnf (eval_float_rel_op (@float_value.gtb) Bgt).
425+
Axiom eval_float_le : Hnf (eval_float_rel_op (@float_value.leb) Ble).
426+
Axiom eval_float_ge : Hnf (eval_float_rel_op (@float_value.geb) Bge).
427427

428428
(* Special cases for <decltype(nullptr)> because they are not generally comparable *)
429429
Axiom eval_eq_nullptr :

rocq-skylabs-brick/theories/lang/cpp/semantics/values.v

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -242,23 +242,23 @@ Module Type RAW_BYTES_VAL
242242
Axiom raw_bytes_of_val_sizeof : forall {σ ty v rs},
243243
raw_bytes_of_val σ ty v rs -> size_of σ ty = Some (N.of_nat $ length rs).
244244

245-
Definition float_raw_bytes (σ : genv) ft (f : float_type.car ft) : list raw_byte :=
245+
Definition float_raw_bytes (σ : genv) {ft} (f : float_type.car ft) : list raw_byte :=
246246
raw_int_byte <$> _Z_to_bytes (N.to_nat (float_type.bytesN ft))
247-
(genv_byte_order σ) Unsigned (float_value.to_bits ft f).
247+
(genv_byte_order σ) Unsigned (float_value.to_bits f).
248248

249249
Lemma float_raw_bytes_length σ ft (f : float_type.car ft) :
250-
length (float_raw_bytes σ ft f) = N.to_nat (float_type.bytesN ft).
250+
length (float_raw_bytes σ f) = N.to_nat (float_type.bytesN ft).
251251
Proof. by rewrite /float_raw_bytes length_fmap _Z_to_bytes_length. Qed.
252252

253253
(** Float raw-byte support is intentionally narrow: the byte sequence is the
254254
deterministic object-size encoding of [float_value.to_bits]. Equality of
255255
such encodings for values of the same float type determines the value. *)
256256
Axiom raw_bytes_of_val_float : forall {σ ft} (f : float_type.car ft) rs,
257257
raw_bytes_of_val σ (Tfloat_ ft) (Vfloat ft f) rs <->
258-
rs = float_raw_bytes σ ft f.
258+
rs = float_raw_bytes σ f.
259259

260260
#[global] Declare Instance float_raw_bytes_inj : forall {σ ft},
261-
Inj (=) (=) (float_raw_bytes σ ft).
261+
Inj (=) (=) (float_raw_bytes σ (ft := ft)).
262262

263263
(* TODO Maybe add?
264264
Axiom raw_bytes_of_val_int : forall σ sz z rs,

rocq-skylabs-brick/theories/lang/cpp/syntax/compare.v

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1962,7 +1962,7 @@ Module Expr.
19621962
| Eunresolved_string_literal t => t
19631963
| Eint n t => Box_Eint n t
19641964
| Ebool b => b
1965-
| Efloat ft v => Box_Efloat ft (float_value.to_bits ft v)
1965+
| Efloat ft v => Box_Efloat ft (float_value.to_bits v)
19661966
| Eunop op e t => Box_Eunop op e t
19671967
| Ebinop op l r t => Box_Ebinop op l r t
19681968
| Ederef e t => Box_Ederef e t

0 commit comments

Comments
 (0)