[coq] fix padR in ohe.v

This commit is contained in:
Julin S 2024-03-06 11:52:49 +05:30
parent 08d553e847
commit 168df58125
1 changed files with 96 additions and 18 deletions

114
coq/ohe.v
View File

@ -1,15 +1,19 @@
(* One hot encoding *)
(*
One hot encoding
Requirements:
- Exactly one marked bit
- Size = n
*)
From mathcomp Require Import all_ssreflect.
Set Bullet Behavior "Strict Subproofs".
(* Set Implicit Arguments. *)
Require Import Bvector.
Search (Vector.t _ _ -> Vector.t _ _ -> bool).
Print BVeq.
Print Vector.eqb.
About Vector.eqb.
(* Require Import Arith. *)
(* Parameters: size and a flag indicating whether the mark has been made *)
(* Valid values have flag set to true *)
@ -22,6 +26,32 @@ Inductive t: nat -> bool -> Type :=
Fixpoint eqb {b1 b2: bool} {n1 n2: nat} (o1: t n1 b1) (o2: t n2 b2): bool.
case (Nat.eqb n1 n2) eqn:Hneq.
have Hn := iffLR (PeanoNat.Nat.eqb_eq n1 n2) Hneq.
clear Hneq; rename Hn into Hneq.
- refine (
match o1, o2 with
| Nil, Nil => true
| Pad n1' b1' o1', Pad n2' b2' o2' => _
| Mark n1' o1', Mark n2' o2' => _
| _, _ => false
end).
+ case (Nat.eqb n1' n2') eqn:Hneq'.
* have Hn := iffLR (PeanoNat.Nat.eqb_eq n1' n2') Hneq'.
clear Hneq'; rename Hn into Hneq'.
rewrite -Hneq' in o2'.
exact: eqb _ _ _ _ o1' o2'.
* exact: false.
+ case (Nat.eqb n1' n2') eqn:Hneq'.
* have Hn := iffLR (PeanoNat.Nat.eqb_eq n1' n2') Hneq'.
clear Hneq'; rename Hn into Hneq'.
rewrite -Hneq' in o2'.
exact: eqb _ _ _ _ o1' o2'.
* exact: false.
- exact: false.
Defined.
Fixpoint eqb' {b1 b2: bool} {n1 n2: nat} (o1: t n1 b1) (o2: t n2 b2): bool.
case (Nat.eqb n1 n2) eqn:Hneq.
move/PeanoNat.Nat.eqb_spec: Hneq => Hneq.
refine (
@ -36,18 +66,57 @@ Fixpoint eqb {b1 b2: bool} {n1 n2: nat} (o1: t n1 b1) (o2: t n2 b2): bool.
+ move/PeanoNat.Nat.eqb_spec: Hneq' => Hneq'.
rewrite -Hneq'.
move => o1' o2'.
exact: eqb _ _ _ _ o1' o2'.
exact: eqb' _ _ _ _ o1' o2'.
+ exact: (fun _ _ => false).
- move: n1' n2' o1' o2' => n1' n2'.
case (Nat.eqb n1' n2') eqn:Hneq'.
+ move/PeanoNat.Nat.eqb_spec: Hneq' => Hneq'.
rewrite -Hneq'.
move => o1' o2'.
exact: eqb _ _ _ _ o1' o2'.
exact: eqb' _ _ _ _ o1' o2'.
+ exact: (fun _ _ => false).
- exact: false.
Defined.
(* move/PeanoNat.Nat.eqb_spec: Hneq => Hneq. *)
(* refine ( *)
(* match o1, o2 with *)
(* | Nil, Nil => true *)
(* | Pad n1' b1' o1', Pad n2' b2' o2' => _ *)
(* | Mark n1' o1', Mark n2' o2' => _ *)
(* | _, _ => false *)
(* end). *)
(* - move: n1' n2' o1' o2' => n1' n2'. *)
(* case (Nat.eqb n1' n2') eqn:Hneq'. *)
(* + Search Nat.eqb. *)
(* (1* PeanoNat.Nat.eqb_eq *1) *)
(* Check (EqNat.beq_nat_true_stt n1' n2'). *)
(* Search Nat.eqb Nat.eqb. *)
(* move: Hneq'. *)
(* Check Nat.eqb_eq n1' n2'. *)
(* Check (EqNat.beq_nat_true_stt n1' n2'). *)
(* rewrite (EqNat.beq_nat_true_stt n1' n2') in Hneq'. *)
(* move => o1' o2'. *)
(* exact: eqb _ _ _ _ o1' o2'. *)
(* Search (_ = _) Nat.eqb. *)
(* Check PeanoNat.Nat.eqb_eq n1' n2'. *)
(* rewrite (EqNat.beq_nat_true_stt n1' n2') in Hneq'. *)
(* rewrite -(EqNat.beq_nat_true_stt n1' n2'). *)
(* S *)
(* + exact: (fun _ _ => false). *)
(* - move: n1' n2' o1' o2' => n1' n2'. *)
(* case (Nat.eqb n1' n2') eqn:Hneq'. *)
(* + move/PeanoNat.Nat.eqb_spec: Hneq' => Hneq'. *)
(* rewrite -Hneq'. *)
(* move => o1' o2'. *)
(* exact: eqb _ _ _ _ o1' o2'. *)
(* + exact: (fun _ _ => false). *)
(* - exact: false. *)
(* Defined. *)
Fixpoint markCount_aux {n: nat} {b: bool} (a: t n b): nat :=
match a with
| Nil => 0
@ -103,6 +172,11 @@ Example eg3: t 2 true := Mark (Pad Nil).
Example eg4: t 3 true := Pad (Mark (Pad Nil)).
Example eg5: t 4 true := Pad (Pad (Mark (Pad Nil))).
Compute eqb Nil Nil.
Compute eqb (Mark Nil) Nil.
Compute eqb (Pad (Mark Nil)) (Mark (Pad Nil)).
Compute eqb (Pad (Mark Nil)) (Pad (Mark Nil)).
Compute markCount eg2.
Compute markCount eg3.
Compute markCount eg4.
@ -127,7 +201,7 @@ by [].
Defined.
Fixpoint padR {n: nat} {b: bool} (a: t n b) (z: nat): t (z+n) b.
Fixpoint padR {n: nat} {b: bool} (a: t n b) (z: nat): t (n+z) b.
refine (
match a with
| Nil => _
@ -142,25 +216,29 @@ refine (
| S z' => _
end
end).
- rewrite addn0.
- rewrite add0n.
exact: genPad z.
- rewrite add0n.
exact: (Pad a').
- rewrite addSnnS.
exact: padR _ _ (Pad (Pad a')) z'.
- rewrite add0n.
exact: Mark a'.
- rewrite addSnnS.
exact: padR _ _ (Pad (Mark a')) z'.
- rewrite addn0.
exact: (Pad a'). (* No change *)
- rewrite -addSnnS.
exact: padR _ _ (Pad (Pad a')) z'. (* an extra padding *)
- rewrite addn0.
exact: (Mark a'). (* No change *)
- rewrite -addSnnS.
exact: padR _ _ (Pad (Mark a')) z'.
Defined.
Compute padL (Pad (Mark Nil)) 3.
Compute padR (Pad (Mark Nil)) 3.
Example eg8 := Eval compute in padR (Pad (Mark Nil)) 3.
Example eg := Eval compute in padR (Pad (Mark Nil)) 3.
Require Import Extraction.
Extraction Language Haskell.
Recursive Extraction eg.
Recursive Extraction eqb.
Recursive Extraction eqb'.
Recursive Extraction eg8.
(*
data T =
Nil