Skip to content

Commit 2d460f2

Browse files
authored
List: add iota and indexes (#24)
1 parent cc92b78 commit 2d460f2

File tree

2 files changed

+88
-10
lines changed

2 files changed

+88
-10
lines changed

CHANGES.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/).
55

66
## Unreleased
77

8+
- List: add iota and indexes
89
- Bool: declare istrue as a coercion
910
- Add files for higher-order logic:
1011
HOL: Set constructor ⤳ for quantifying over function types

List.lp

Lines changed: 87 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -484,21 +484,39 @@ begin
484484
reflexivity;
485485
end;
486486

487+
// Arr
488+
489+
symbol Arr : ℕ → SetSetTYPE;
490+
491+
rule Arr 0 $a $b ↪ τ $b
492+
with Arr ($n +1) $a $b ↪ τ $aArr $n $a $b;
493+
487494
// seqn
488495

489-
symbol Seqn : ℕ → SetTYPE;
496+
symbol seqn_acc [a] n : 𝕃 aArr n a (list a);
497+
498+
rule seqn_acc 0 $lrev $l
499+
with seqn_acc ($n +1) $l $xseqn_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 ↪ τ $aSeqn $n $a;
503+
assert a (x y : τ a) ⊢ seqn 2 x yxy ⸬ □;
493504

494-
symbol seqn' [a] n : 𝕃 aSeqn n a;
505+
// iota
495506

496-
rule seqn' 0 $lrev $l
497-
with seqn' ($n +1) $l $xseqn' $n ($x ⸬ $l);
507+
symbol iota : ℕ → ℕ → 𝕃 nat;
508+
rule iota $n 0 ↪ □
509+
with iota $n ($k +1) ↪ $niota ($n +1) $k;
498510

499-
symbol seqn [a] n@seqn' a n □;
511+
assertiota 1 212 □;
500512

501-
assertseqn 2 1 212 ⸬ □;
513+
// indexes
514+
515+
symbol indexes [a] : 𝕃 a → 𝕃 nat;
516+
517+
rule indexes $liota 0 (size $l);
518+
519+
assert xindexes (xxxx ⸬ □) ≡ 0123 ⸬ □;
502520

503521
// last
504522

@@ -1045,8 +1063,7 @@ begin
10451063
assume a beq x; reflexivity;
10461064
end;
10471065

1048-
opaque symbol mem_seq1 [a] beq (x ya) :
1049-
π (∈ beq x (y ⸬ □) = (beq x y)) ≔
1066+
opaque symbol mem_seq1 [a] beq (x ya) : π (∈ beq x (y ⸬ □) = beq x y) ≔
10501067
begin
10511068
assume a beq x y; reflexivity;
10521069
end;
@@ -1082,6 +1099,66 @@ begin
10821099
refine @orᵢ₂ (∈ beq x (take n l)) (∈ beq x (drop n l)) h;
10831100
end;
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 orbeq 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 orbeq 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 orbeq n (rcons l m)) h2 H0 H1 }
1116+
end;
1117+
1118+
opaque symbol 0indexes⸬ [a] (x : τ a) (l: 𝕃 a) :
1119+
π (∈ eqn 0 (indexes (xl))) ≔
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 (xl)) h }
1126+
end;
1127+
1128+
symbol +1iota+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 oreqn (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 +1indexesa (n: τ nat) (l: 𝕃 a) (y: τ a) :
1149+
π (∈ eqn n (indexes l)) → π (∈ eqn (n +1) (indexes (yl))) ≔
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 +1iota+1 n 1 (size l) j;
1158+
}
1159+
}
1160+
end;
1161+
10851162
// index
10861163

10871164
symbol index [a] : (τ a → τ a → 𝔹) → τ a → 𝕃 a → ℕ;

0 commit comments

Comments
 (0)