@@ -484,21 +484,39 @@ begin
484484 reflexivity ;
485485end ;
486486
487+ // Arr
488+
489+ symbol Arr : ℕ → Set → Set → TYPE ;
490+
491+ rule Arr 0 $a $b ↪ τ $b
492+ with Arr ($n +1 ) $a $b ↪ τ $a → Arr $n $a $b ;
493+
487494// seqn
488495
489- symbol Seqn : ℕ → Set → TYPE ;
496+ symbol seqn_acc [a ] n : 𝕃 a → Arr n a (list a );
497+
498+ rule seqn_acc 0 $l ↪ rev $l
499+ with seqn_acc ($n +1 ) $l $x ↪ seqn_acc $n ($x ⸬ $l );
500+
501+ symbol seqn [a ] n ≔ @seqn_acc a n □;
490502
491- rule Seqn 0 $a ↪ 𝕃 $a
492- with Seqn ($n +1 ) $a ↪ τ $a → Seqn $n $a ;
503+ assert a (x y : τ a ) ⊢ seqn 2 x y ≡ x ⸬ y ⸬ □;
493504
494- symbol seqn ' [ a ] n : 𝕃 a → Seqn n a ;
505+ // iota
495506
496- rule seqn ' 0 $l ↪ rev $l
497- with seqn ' ($n +1 ) $l $x ↪ seqn ' $n ($x ⸬ $l );
507+ symbol iota : ℕ → ℕ → 𝕃 nat ;
508+ rule iota $n 0 ↪ □
509+ with iota $n ($k +1 ) ↪ $n ⸬ iota ($n +1 ) $k ;
498510
499- symbol seqn [ a ] n ≔ @seqn ' a n □;
511+ assert ⊢ iota 1 2 ≡ 1 ⸬ 2 ⸬ □;
500512
501- assert ⊢ seqn 2 1 2 ≡ 1 ⸬ 2 ⸬ □;
513+ // indexes
514+
515+ symbol indexes [a ] : 𝕃 a → 𝕃 nat ;
516+
517+ rule indexes $l ↪ iota 0 (size $l );
518+
519+ assert x ⊢ indexes (x ⸬ x ⸬ x ⸬ x ⸬ □) ≡ 0 ⸬ 1 ⸬ 2 ⸬ 3 ⸬ □;
502520
503521// last
504522
@@ -1045,8 +1063,7 @@ begin
10451063 assume a beq x ; reflexivity ;
10461064end ;
10471065
1048- opaque symbol mem_seq1 [a ] beq (x y :τ a ) :
1049- π (∈ beq x (y ⸬ □) = (beq x y )) ≔
1066+ opaque symbol mem_seq1 [a ] beq (x y :τ a ) : π (∈ beq x (y ⸬ □) = beq x y ) ≔
10501067begin
10511068 assume a beq x y ; reflexivity ;
10521069end ;
@@ -1082,6 +1099,66 @@ begin
10821099 refine @or ᵢ₂ (∈ beq x (take n l )) (∈ beq x (drop n l )) h ;
10831100end ;
10841101
1102+ opaque symbol mem_rcons_left [a ] beq (n m : τ a ) (l : 𝕃 a ) :
1103+ π (∈ beq n l ) → π (∈ beq n (rcons l m )) ≔
1104+ begin
1105+ assume a beq n m ;
1106+ induction
1107+ { assume h ; refine ⊥ₑ h }
1108+ { assume n0 l h1 h2 ;
1109+ have H0 : π (beq n n0 ) → π (beq n n0 or ∈ beq n (rcons l m ))
1110+ { assume h3 ;
1111+ refine (or ᵢ₁ [beq n n0 ] (∈ beq n (rcons l m )) h3 ) };
1112+ have H1 : π (∈ beq n l ) → π (beq n n0 or ∈ beq n (rcons l m ))
1113+ { assume h3 ;
1114+ refine (or ᵢ₂ (beq n n0 ) [∈ beq n (rcons l m )] (h1 h3 )) };
1115+ refine or ₑ [beq n n0 ] [∈ beq n l ] (beq n n0 or ∈ beq n (rcons l m )) h2 H0 H1 }
1116+ end ;
1117+
1118+ opaque symbol 0 ∈indexes ⸬ [a ] (x : τ a ) (l : 𝕃 a ) :
1119+ π (∈ eqn 0 (indexes (x ⸬ l ))) ≔
1120+ begin
1121+ assume a x ;
1122+ induction
1123+ {refine ⊤ᵢ}
1124+ {assume y l h ;
1125+ refine mem_rcons_left eqn 0 (size l +1 ) (indexes (x ⸬ l )) h }
1126+ end ;
1127+
1128+ symbol +1 ∈iota +1 n m k :
1129+ π (∈ eqn n (iota m k )) → π (∈ eqn (n +1 ) (iota (m +1 ) k )) ≔
1130+ begin
1131+ assume n ;
1132+ have h : Π k m , π (∈ eqn n (iota m k )) → π (∈ eqn (n +1 ) (iota (m +1 ) k ))
1133+ { induction
1134+ { assume m ; simplify ; assume h ; refine h }
1135+ { assume k h1 m ; simplify ; assume h2 ;
1136+ refine or ₑ [eqn n m ] [∈ eqn n (iota (m +1 ) k )] (eqn n m or ∈ eqn (n +1 ) (iota ((m +1 ) +1 ) k )) h2 _ _
1137+ { assume h3 ;
1138+ refine or ᵢ₁ [eqn n m ] (∈ eqn (n +1 ) (iota ((m +1 ) +1 ) k )) h3 }
1139+ { assume h3 ;
1140+ refine or ᵢ₂ (eqn n m ) [∈ eqn (n +1 ) (iota ((m +1 ) +1 ) k )] _;
1141+ refine h1 (m +1 ) _; refine h3
1142+ }
1143+ }
1144+ };
1145+ assume m k ; refine h k m
1146+ end ;
1147+
1148+ opaque symbol +1 ∈indexes ⸬ a (n : τ nat ) (l : 𝕃 a ) (y : τ a ) :
1149+ π (∈ eqn n (indexes l )) → π (∈ eqn (n +1 ) (indexes (y ⸬ l ))) ≔
1150+ begin
1151+ assume a n ; induction
1152+ { simplify ; assume x h ; refine h }
1153+ { assume x l h y ; simplify ; assume i ;
1154+ refine or ₑ [eqn n 0 ] [∈ eqn n (iota 1 (size l ))] _ i _ _
1155+ { assume j ; apply or ᵢ₁ [eqn n 0 ] (∈ eqn (n +1 ) (iota 2 (size l ))) j }
1156+ { assume j ; apply or ᵢ₂ (eqn n 0 ) [∈ eqn (n +1 ) (iota 2 (size l ))] _;
1157+ refine +1 ∈iota +1 n 1 (size l ) j ;
1158+ }
1159+ }
1160+ end ;
1161+
10851162// index
10861163
10871164symbol index [a ] : (τ a → τ a → 𝔹) → τ a → 𝕃 a → ℕ;
0 commit comments