@@ -38,6 +38,9 @@ seqn n x_0 ... x_n-1 == the sequence of the x_i; can be partially applied.
38
38
** Random access :
39
39
nth x0 s i == the item i of s (numbered from 0 ), or x0 if s does
40
40
not have at least i +1 items (i .e ., size x <= i )
41
+ nths x0 s ks == the sequence that is formed when taking for each
42
+ index i in n the i -th item of ks (numbered from 0 ),
43
+ or x0 if s has fewer than i +1 items (i .e ., size s <= i ).
41
44
s `_i == standard notation for nth x0 s i for a default x0 ,
42
45
e .g ., 0 for rings .
43
46
set_nth x0 s i y == s where item i has been changed to y ; if s does not
@@ -1083,6 +1086,21 @@ begin
1083
1086
assume a beq x l hrefl ; simplify ; rewrite hrefl ; apply ⊤ᵢ;
1084
1087
end ;
1085
1088
1089
+ opaque symbol mem_tail [a ] (beq : τ a → τ a → 𝔹) (n m : τ a ) (l : 𝕃 a ) :
1090
+ π (∈ beq n l ) → π (∈ beq n (m ⸬ l )) ≔
1091
+ begin
1092
+ assume a beq n m ; induction
1093
+ {assume h1 ; refine ⊥ₑ h1 }
1094
+ {assume n0 l h1 h2 ;
1095
+ have H0 : π (beq n n0 ) → π (beq n m or (beq n n0 or ∈ beq n l ))
1096
+ {assume h3 ;
1097
+ refine or ᵢ₂ (beq n m ) [beq n n0 or ∈ beq n l ] (or ᵢ₁ [beq n n0 ] (∈ beq n l ) h3 )};
1098
+ have H1 : π (∈ beq n l ) → π (beq n m or (beq n n0 or ∈ beq n l ))
1099
+ {assume h3 ;
1100
+ refine or ᵢ₂ (beq n m ) [beq n n0 or ∈ beq n l ] (or ᵢ₂ (beq n n0 ) [∈ beq n l ] h3 )};
1101
+ refine or ₑ [beq n n0 ] [∈ beq n l ] (beq n m or (beq n n0 or ∈ beq n l )) h2 H0 H1 }
1102
+ end ;
1103
+
1086
1104
opaque symbol mem_take [a ] beq n l (x :τ a ) :
1087
1105
π (∈ beq x (take n l )) → π (∈ beq x l ) ≔
1088
1106
begin
@@ -1591,6 +1609,64 @@ begin
1591
1609
}
1592
1610
end ;
1593
1611
1612
+ // nths
1613
+
1614
+ symbol nths [a : Set ] : τ a → 𝕃 a → 𝕃 nat → 𝕃 a ;
1615
+
1616
+ rule nths $b $l $n ↪ map (nth $b $l ) $n ;
1617
+
1618
+ opaque symbol mapS_iota (m n : τ nat ) :
1619
+ π (map (+1 ) (iota n m ) = iota (n +1 ) m )≔
1620
+ begin
1621
+ induction
1622
+ { induction
1623
+ { refine eq_refl □ }
1624
+ { assume n h ; refine h } }
1625
+ { induction
1626
+ { assume h n ; refine eq_refl (n +1 ⸬ □) }
1627
+ { simplify ; assume n0 h0 h1 m ; rewrite h1 (m +1 );
1628
+ refine eq_refl (m +1 ⸬ m +1 +1 ⸬ iota (m +1 +1 +1 ) n0 ) } }
1629
+ end ;
1630
+
1631
+ opaque symbol indexes_cons [a : Set ] (x : τ a ) (l : 𝕃 a ) :
1632
+ π (indexes (x ⸬ l ) = 0 ⸬ (map (+1 ) (indexes l )))≔
1633
+ begin
1634
+ assume a x ;
1635
+ induction
1636
+ { refine eq_refl (0 ⸬ □) }
1637
+ { simplify ;
1638
+ assume y l h ;
1639
+ rewrite mapS_iota ;
1640
+ refine eq_refl (0 ⸬ 1 ⸬ iota 2 (size l )) }
1641
+ end ;
1642
+
1643
+ opaque symbol nths_shift_cons [a : Set ] (x b : τ a ) (l : 𝕃 a ) (n : 𝕃 nat ) :
1644
+ π ((nths b (x ⸬ l ) (map (+1 ) n )) = (nths b l n ))≔
1645
+ begin
1646
+ assume a x b l ; induction
1647
+ { refine eq_refl □ }
1648
+ { assume n ll h1 ;
1649
+ have H1 : π (nths b (x ⸬ l ) (map (+1 ) (n ⸬ ll )) =
1650
+ nth b (x ⸬ l ) (n +1 ) ⸬ nths b (x ⸬ l ) (map (+1 ) ll ))
1651
+ { refine eq_refl (nth b l n ⸬ map (nth b (x ⸬ l )) (map (+1 ) ll )) };
1652
+ rewrite H1 ; rewrite h1 ;
1653
+ refine eq_refl (nths b l (n ⸬ ll )) }
1654
+ end ;
1655
+
1656
+ opaque symbol nths_indexes_id [a : Set ] (b : τ a ) (l : 𝕃 a ) :
1657
+ π (nths b l (indexes l ) = l )≔
1658
+ begin
1659
+ assume a b ; induction
1660
+ { refine eq_refl □ }
1661
+ { assume x l h1 ;
1662
+ rewrite indexes_cons x l ;
1663
+ have H1 : π (nths b (x ⸬ l ) (0 ⸬ map (+1 ) (indexes l )) =
1664
+ x ⸬ nths b (x ⸬ l ) (map (+1 ) (indexes l )))
1665
+ { refine eq_refl (x ⸬ map (nth b (x ⸬ l )) (map (+1 ) (indexes l ))) };
1666
+ rewrite H1 ; rewrite nths_shift_cons x b l (indexes l ); rewrite h1 ;
1667
+ refine eq_refl (x ⸬ l ) }
1668
+ end ;
1669
+
1594
1670
// sumn
1595
1671
1596
1672
symbol sumn : 𝕃 nat → ℕ;
0 commit comments