[coq] improve string notation example

This commit is contained in:
Julin S 2024-02-09 16:44:09 +05:30
parent 5e796ce27d
commit e60c7efacf
1 changed files with 31 additions and 10 deletions

View File

@ -30,25 +30,46 @@ Fixpoint blist_parse (b: list Byte.byte): blist :=
| _ => blist_parse bs
end
end.
Fixpoint blist_print (b: blist): list Byte.byte :=
match b with
(* ctr is a counter to leave a space after each 4-tuple *)
Fixpoint blist_print_aux (bl: blist) (ctr: nat): list Byte.byte :=
match bl with
| BNil => []
| BCons b bs =>
match b with
| false => x30 :: (blist_print bs)
| true => x31 :: (blist_print bs)
let nxt := match b with
| false => x30
| true => x31
end in
nxt ::
match Nat.eqb ctr 3 with
| true => x20 :: (blist_print_aux bs 0)
| false => (blist_print_aux bs (S ctr))
end
end.
Fixpoint blist_print (bl: blist): list Byte.byte :=
let rem := 4 - (Nat.modulo (length bl) 4) in
let prefix := List.repeat false rem in
let lst := to_list bl in
let newbl := of_list (prefix ++ lst) in
blist_print_aux newbl 0.
Declare Scope bl_scope.
Delimit Scope bl_scope with bl.
String Notation blist blist_parse blist_print: bl_scope.
Compute "0"%bl.
Compute "00"%bl.
Compute "000"%bl.
(* "000"%bl : blist *)
Compute to_list "010203"%bl.
(* [false; true; false; false] : list bool *)
Compute to_list "011101"%bl.
(* [false; true; true; true; false; true] : list bool *)
Compute "0000"%bl.
Compute "00000"%bl.
Compute "11101101001001001"%bl.
(* "0001 1101 1010 0100 1001 "%bl : blist *)
(* Before adding 4-tuple padding and space *)
(* Compute "000"%bl. *)
(* (1* "000"%bl : blist *1) *)
(* Compute to_list "010203"%bl. *)
(* (1* [false; true; false; false] : list bool *1) *)
(* Compute to_list "011101"%bl. *)
(* (1* [false; true; true; true; false; true] : list bool *1) *)
(**********************************)