Print ex. Print sig. Print proj2. Print proj1. Check proj1_sig. Check proj2_sig. Print sigT. Search projT2. Check projT2. Print sumor. Locate "exists". Module Interval. Definition t (low high: nat): Type := {x:nat | (x >= low) /\ (x <= high)}. Context {low high: nat}. Definition add (a b: t low high): t low high. Proof. refine( let (a, pfa) := a in let (b, pfb) := b in exist _ (a+b) _). split. - induction a. + simpl. destruct pfb; assumption. + simpl. Abort. End Interval. Definition i28: Type := Interval.t 2 8. Definition n1: i28. (* unfold i28. *) (* unfold Interval.t. *) refine (exist _ 3 _). split; repeat constructor. Qed. Ltac ivtac n := match goal with | |- Interval.t _ _ => refine (exist _ n _); split; repeat constructor | |- {_:nat | _ >=_ /\ _ <= _} => refine (exist _ n _); split; repeat constructor end. (* Ltac ivtacGen low high n := *) (* match goal with *) (* | |- interval _ _ => *) (* refine (exist _ n _); *) (* split; repeat constructor *) (* end. *) Definition n2: i28. unfold i28. ivtac 5. Defined. (* Ltac ivtac n := *) (* match goal with *) (* | H: _ |- exist _ _ => idtac *) (* end. *) (* | {x:nat | x >=_ /\ x <= _} => *) (* refine (exist _ n _); *) (* split; repeat constructor. *) (* end *) From mathcomp Require Import all_ssreflect all_algebra. (* From mathcomp Require Import algebra.matrix. *) (* Check matrix. *) Check bool. Print RingType. Print ringType. Print GRing.Ring.type. Print GRing.Ring.class_of. Local Open Scope type_scope. Local Open Scope ring_scope. Fail Example diagonal := \matrix_(i < 3, j < 7) if i == j then 1 else 0. Fail Example diagonal := \matrix_(i < 3, j < 7) (if i == j then 1 else 0). Check \matrix_(i<3, j<7) (fun i j => if i==j then 1 else 0). Fail Compute \matrix_(i<3, j<7) if (i:nat)==j then 1 else 0. (* The command has indeed failed with message: In environment i : ordinal_finType 3 j : ordinal_finType 7 Unable to unify "?t0" with "?t@{b:=(i : nat) == j}" (cannot satisfy constraint "?t0" == "?t@{b:=(i : nat) == j}"). *) Fail Compute \matrix_(i<3, j<7) if (i==j :> nat) then 1 else 0. (* The command has indeed failed with message: In environment i : ordinal_finType 3 j : ordinal_finType 7 Unable to unify "?t0" with "?t@{b:=i == j :> nat}" (cannot satisfy constraint "?t0" == "?t@{b:=i == j :> nat}"). *) Fail Example eg1 := \matrix_(i<3, j<7) (fun (i:'I_3) (j:'I_7) => if (i==j :> nat) then 1 else 0). Fail Example eg1 := \matrix_(i<3, j<7) (fun (i:'I_3) (j:'I_7) => if (i:nat) == j then 1 else 0). Check \matrix_(i<3, j<7) if (i==j:>nat) then 1%:Z else 0. Fail Check \matrix_(i<3, j<7) if (i:nat)==j then 1 else 0. Fail Check \matrix_(i<3, j<7) (fun i:'I_3 j => if i==j then 1 else 0). Check 1%:M. Check const_mx (Some false): 'M_3. Definition M2 : 'M[int]_(2,2) := \matrix_(i,j < 2) 3%:Z. Example eg1: 'M[int]_ (3, 7) := \matrix_(i<3, j<7) 8%:Z. Example eg2: 'M[int]_ (3, 7) := \matrix_(i<3, j<7) 8. Check 3%:Z. Print Scope Z_scope. Print Scopes. Example eg3 := \matrix_(i<3, j<7) (fun i j => if i==j :> nat then 1 else 0%:Z). Locate "&&". Example eg6 := \matrix_(i<3, j<7) (if (i==0) && (j==1) then (Some true) else (Some false)). (* Example eg6 := \matrix_(i<3, j<7) *) (* (if (i==0) && (j==1) then 1 else 0%:Z). *) (* Example eg6 := \matrix_(i<3, j<7) *) (* (if ((i==0) && (j==1)) then 1 else 0%:Z). *) (* Example eg6 := \matrix_(i<3, j<7) *) (* (fun i j => if ((i=0:>nat) && (j=1):>nat) then 1 else 0%:Z). *) (* Example eg6 := \matrix_(i<3, j<7) *) (* (fun i j => if (i=0 && j=1):>nat then 1 else 0%:Z). *) Example eg7: 'rV_2 := \row_(i<2) (if i==0 then true else false). Check 1%:M: 'M_2. Check eg7. Example eg8: 'cV_2 := \col_(i<2) (if i!=0 then true else false). Check eg7 *m eg8. Example eg7ob: 'rV_2 := \row_(i<2) (if i==0 then Some true else Some false). Example eg8ob: 'cV_2 := \col_(i<2) (if i!=0 then Some true else Some false). Example eg4 := \matrix_(i<3, j<3) (i+j). (* Example eg4 := \matrix_(i<3, j<3) *) (* (fun i j => i+j%:Z). *) (* Compute eg4 0 1. *) Check mxE tt eg4. Locate "=2". Example eg5 := \matrix_(i<3, j<3) (Some (Nat.eqb i j)). Check map_mx (fun x => match x with | Some true => None | _ => x end). Definition eg5' := map_mx (fun x => match x with | Some true => None | _ => x end) eg5. Goal eg5 0 1 = Some false. rewrite /eg5 !mxE /=. Abort. Goal eg5' 1 1 = None. rewrite /eg5' !mxE /=. Abort. Print ordinal. Check Ordinal (m:=3). Fail Check Ordinal (_:3<5). (* Has to be at least one row and one column *) Definition matLinker {rows cols: nat} (mat: 'M[option bool]_(rows.+1, cols.+1)) : 'M[option bool]_(rows.+1, cols.+1). Proof. refine ( let colid := Ordinal (m:=cols) (n:=cols.+1) _ in let mapfn := fun ob => match ob with | Some true => None | _ => ob end in let lastcol := col colid mat in let lastcol' := map_mx mapfn lastcol in let mat' := col' colid mat in let res := row_mx mat' lastcol' in _). move: mat' res. rewrite PeanoNat.Nat.pred_succ. by rewrite addn1. Unshelve. by []. Show Proof. Defined. Check matLinker eg5. Check eg4. Fail Check eg4 _ 0 _ 0. Compute eg4 0 0. Check eg4 0 0. Search (int_ZmodType -> nat -> int_ZmodType). Check eg2 _ _. Check eg4 _ _. Check eg4 0 0. Compute eg4 0 0. Check matrix bool 3 4. (* 'M_(3, 4) : predArgType *) Check 'M_(3, 4). (* 'M_(3, 4) : predArgType where ?R : [ |- Type] *) Check 'M[bool]_(3, 4). (* 'M_(3, 4) : predArgType *) Local Open Scope ring_scope. Lemma sum_odd_n (n: nat) : \sum_(0 <= i < n.*2 | odd i) i = n^2. Proof. elim: n => [//=|n IH]; first by rewrite double0 -mulnn muln0 big_geq. rewrite (@big_cat_nat _ _ _ n.*2) //=; last by rewrite -!addnn leq_add. rewrite IH -!mulnn mulSnr mulnSr -addnA. congr (_ + _). rewrite big_ltn_cond ?ifF ?odd_double //. rewrite big_ltn_cond /ifT ?oddS ?odd_double //=. by rewrite big_geq ?addn0 -addnn addnS // -addnn addSn. Qed. Fail Check MatrixFormula.seq_of_rV eg4. From CoqEAL Require Import hrel param refinements trivial_seq seqmx. Check eg2. Compute (addmx eg2 eg2) 1 1. Check 1%:M. Check 0%:M. Check M. Check mkseqmx_ord. Check matrix_of_fun. Check fun_of_matrix. Check matrix_of_fun tt. Check matrix_of_fun _ _ _ _ eg4. Check fun_of_matrix eg4. (* Example smx4 := mkseqmx_ord (fun_of_matrix eg4). *) (* Check mkseqmx_ord (fun_of_matrix eg4). *) (* Compute List.tl smx4. *) (* Check smx4. *) Locate "'I_". Print ordinal. Compute [seq x <- ord_enum 2 | false ]. Compute [seq x <- ord_enum 2 | true ]. Check filter. Compute List.hd 1 (ord_enum 2). Check List.hd (Ordinal _) (ord_enum 2). Compute List.hd (Ordinal _) (ord_enum 2). Check ord_enum 2. Check ord_enum. Require Import Bvector. Print Ordinal. Check Vector.of_list. Lemma length_size {A:Type} (l: seq A): List.length l = size l. Proof. by []. Qed. Lemma size_ord_enum n : size (ord_enum n) = n. Proof. by rewrite -{3}(size_iota 0 n) -val_ord_enum size_map. Restart. rewrite -{3}(size_iota 0 n). rewrite -val_ord_enum. by rewrite size_map. Qed. (* Goal forall n:nat, *) (* size (ord_enum n) = n. *) (* Proof. *) (* move=> n. *) (* Search size. *) (* rewrite -{3}(size_iota 0 n). *) (* Search ord_enum. *) (* rewrite -val_ord_enum. *) (* Search size. *) (* by rewrite size_map. *) (* Search ord_enum. *) (* Qed. *) Definition mkRow {A:Type} {rows cols:nat} (r: 'I_rows) (f: 'I_rows -> 'I_cols -> A): Vector.t A cols. refine( match r with | @Ordinal _ r' _ => let cids := Vector.of_list (ord_enum cols) in (* list 'I_cols *) let rw := Vector.map (fun cid => f r cid) cids in _ end). move: rw. by rewrite length_size size_ord_enum. Defined. Definition mkMat {A:Type} {rows cols:nat} (f: 'I_rows -> 'I_cols -> A): Vector.t (Vector.t A cols) rows. Proof. refine( let rids := Vector.of_list (ord_enum rows) in (* list 'I_rows *) let rws := Vector.map (fun rid => mkRow rid f) rids in (* let res := Vector.fold_right (fun rw acc => rw ++ acc) rws [] in *) _). move: rws. (* by rewrite (length_size (ord_enum rows)) (size_ord_enum). *) by rewrite length_size size_ord_enum. Defined. Check (fun_of_matrix M2). Check (fun_of_matrix eg3). Definition xm2 := mkMat (fun_of_matrix M2). Definition xm3 := mkMat (fun_of_matrix eg3). Definition xm4 := mkMat (fun_of_matrix eg4). Check 'M_(3,4). Definition mkseqmx_ord {A: Type} m n (f : 'I_m -> 'I_n -> A): nat. Abort. Require Import Extraction. Extraction Language Haskell. Require Import ExtrHaskellBasic. Require Import ExtrHaskellZInteger. Require Import ExtrHaskellNatNum. Check 0xff. Definition nnnn: nat := 0xf. Check 'rV[bool]_nnnn. Check 'M_(0, 0). Definition M0: 'M_0 := \matrix_(i<0, j<0) false. Definition R0 (cols: nat) := \matrix_(i<0, j if i==j :> nat then true else false). (* Extract Inductive "Vector.t _ n" => "Vec" [ "Nil" "(:>)" ]. *) Extract Inductive Vector.t => "Vec" [ "Nil" "(:>)" ]. Recursive Extraction xm2. Recursive Extraction eg3. Example e1 := (ord_enum 2). Recursive Extraction e1. (* Ocaml ran this! *) Recursive Extraction smx4. (* Ocaml couldn't run this.. *) Goal ((0 : 'M[int]_(2,2)) == 0). by coqeal. Abort. Search (matrix _ _ _ -> seq _). Search (seqmx). Require Import Bvector. Compute \matrix_(i<3, j<7) if i==j then 1 else 0. Check \matrix_(i<3, j<7) if i==j then 1 else 0. Check \matrix_(i, j) (fun i j => i = j).