Skip to content

Commit 5584437

Browse files
authored
add classical logic (#14)
1 parent 6559f04 commit 5584437

File tree

12 files changed

+185
-74
lines changed

12 files changed

+185
-74
lines changed

AUTHORS.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
- Quentin Garchery
2+
- Quentin Buzet
3+
- Frédéric Blanqui

Bool.lp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ with istrue false ↪ ⊥;
3434

3535
opaque symbol falsetrue : π (falsetrue) ≔
3636
begin
37-
assume h; refine ind_eq h istrue top
37+
assume h; refine ind_eq h istrue ⊤ᵢ
3838
end;
3939

4040
opaque symbol truefalse : π (truefalse) ≔
@@ -61,28 +61,28 @@ with $b or false ↪ $b;
6161
opaque symbol ∨_istrue [p q] : π(istrue(p or q)) → π(istrue pistrue q) ≔
6262
begin
6363
induction
64-
{ assume q h; apply ∨ᵢ₁; apply top; }
64+
{ assume q h; apply ∨ᵢ₁; apply ⊤ᵢ; }
6565
{ assume q h; apply ∨ᵢ₂; apply h; }
6666
end;
6767

6868
opaque symbol istrue_or [p q] : π(istrue pistrue q) → π(istrue(p or q)) ≔
6969
begin
7070
induction
71-
{ assume q h; apply top; }
71+
{ assume q h; apply ⊤ᵢ; }
7272
{ assume q h; apply ∨ₑ h { assume i; apply ⊥ₑ i; } { assume i; apply i; } }
7373
end;
7474

7575
opaque symbol orᵢ₁ [p] q : π (istrue p) → π (istrue (p or q)) ≔
7676
begin
7777
induction
78-
{ simplify; assume b h; apply top }
78+
{ simplify; assume b h; apply ⊤ᵢ }
7979
{ simplify; assume b h; apply ⊥ₑ h }
8080
end;
8181

8282
opaque symbol orᵢ₂ p [q] : π (istrue q) → π (istrue (p or q)) ≔
8383
begin
8484
induction
85-
{ simplify; assume b h; apply top }
85+
{ simplify; assume b h; apply ⊤ᵢ }
8686
{ simplify; assume b h; apply h }
8787
end;
8888

@@ -121,7 +121,7 @@ opaque symbol ∧_istrue [p q] : π(istrue (p and q)) → π(istrue p ∧ istrue
121121
begin
122122
induction
123123
{ induction
124-
{ assume h; apply ∧ᵢ { apply top } { apply top } }
124+
{ assume h; apply ∧ᵢ { apply ⊤ᵢ } { apply ⊤ᵢ } }
125125
{ assume h; apply ⊥ₑ h; }
126126
}
127127
{ assume q h; apply ⊥ₑ h; }
@@ -143,7 +143,7 @@ end;
143143
opaque symbol andₑ₁ [p q] : π (istrue (p and q)) → π (istrue p) ≔
144144
begin
145145
induction
146-
{ assume q i; apply top; }
146+
{ assume q i; apply ⊤ᵢ; }
147147
{ assume q i; apply i; }
148148
end;
149149

CHANGES.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
All notable changes to this project will be documented in this file.
2+
3+
The format is based on [Keep a Changelog](https://keepachangelog.com/),
4+
and this project adheres to [Semantic Versioning](https://semver.org/).
5+
6+
## 1.1.0 (2024-06-21)
7+
8+
- Add classical logic
9+
- Rename top into ⊤ᵢ
10+
- Declare more arguments of ∃ᵢ and ∃ₑ implicit
11+
12+
## 1.0.0 (2023-10-19)
13+
14+
- Add integers (Quentin Garchery)
15+
16+
## 0.0.0 (2022-01-27)
17+
18+
- Add natural numbers and lists (Quentin Buzet)

Classic.lp

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
// classical logic
2+
3+
require open Stdlib.Set Stdlib.Prop Stdlib.FOL;
4+
5+
symbol em p : π (p ∨ ¬ p); // excluded middle
6+
7+
opaque symbol ¬¬ₑ p : π (¬ ¬ p) → π p
8+
begin
9+
assume p nnp; apply ∨ₑ (em p)
10+
{ assume h; refine h }
11+
{ assume np; apply ⊥ₑ; refine nnp np }
12+
end;
13+
14+
opaque symbol ∨¬ᵢ p q : π (pq) → π (¬ pq) ≔
15+
begin
16+
assume p q pq; apply ∨ₑ (em p)
17+
{ assume hp; refine ∨ᵢ₂ _; refine pq hp }
18+
{ assume np; refine ∨ᵢ₁ np }
19+
end;
20+
21+
opaque symbol ∃¬ᵢ a p : π (¬ (∀ p)) → π (`∃ x : τ a, ¬ (p x)) ≔
22+
begin
23+
assume a p not_all_p; apply ∨ₑ (em (`∃ x, ¬ (p x)))
24+
{ assume h; apply h }
25+
{ assume not_ex_not_p; apply ⊥ₑ; apply not_all_p;
26+
have h: π (`∀ x, ¬ ¬ (p x))
27+
{ refine ¬∃ (λ x, ¬ (p x)) _; refine not_ex_not_p};
28+
assume x; apply ¬¬ₑ; refine h x
29+
}
30+
end;

Comp.lp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,17 +40,17 @@ with isGt Gt ↪ true;
4040

4141
symbol LtEq : π (LtEq) ≔
4242
begin
43-
assume h; refine ind_eq hn, istrue(isEq n)) top
43+
assume h; refine ind_eq hn, istrue(isEq n)) ⊤ᵢ
4444
end;
4545

4646
symbol GtEq : π (GtEq) ≔
4747
begin
48-
assume h; refine ind_eq hn, istrue(isEq n)) top
48+
assume h; refine ind_eq hn, istrue(isEq n)) ⊤ᵢ
4949
end;
5050

5151
symbol GtLt : π (GtLt) ≔
5252
begin
53-
assume h; refine ind_eq hn, istrue(isLt n)) top
53+
assume h; refine ind_eq hn, istrue(isLt n)) ⊤ᵢ
5454
end;
5555

5656
// Opposite of a Comp

FOL.lp

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,27 @@ require open Stdlib.Set Stdlib.Prop;
44

55
// Universal quantification
66

7-
constant symbol ∀ [a] : (τ aProp) → Prop; notationquantifier; // !! or \forall
7+
constant symbol ∀ [a] : (τ aProp) → Prop; // !! or \forall
8+
9+
notationquantifier;
810

911
rule π (∀ $f) ↪ Π x, π ($f x);
1012

1113
// Existential quantification
1214

13-
constant symbol ∃ [a] : (τ aProp) → Prop; notationquantifier; // ?? or \exists
15+
constant symbol ∃ [a] : (τ aProp) → Prop; // ?? or \exists
16+
17+
notationquantifier;
18+
19+
constant symbol ∃ᵢ [a p] (xa) : π (p x) → π (∃ p);
20+
21+
symbol ∃ₑ [a p] : π (∃ p) → Π [q], (Π xa, π (p x) → π q) → π q;
22+
23+
rule ∃ₑ (∃ᵢ $x $px) $f ↪ $f $x $px;
1424

15-
constant symbol ∃ᵢ [a] p (xa) : π (p x) → π (∃ p);
16-
symbol ∃ₑ [a] p : π (∃ p) → Π q, (Π xa, π (p x) → π q) → π q;
25+
// properties
1726

18-
rule ∃ₑ _ (∃ᵢ _ $x $px) _ $f ↪ $f $x $px;
27+
opaque symbol ¬∃ [a] p : π (¬ (∃ p) ⇒ `∀ x : τ a, ¬ (p x)) ≔
28+
begin
29+
assume a p not_ex_p x px; apply not_ex_p; apply ∃ᵢ x px
30+
end;

List.lp

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,7 @@ with is□ (_ ⸬ _) ↪ false;
220220

221221
opaque symbol ⸬≠□ [a] [xa] [l] : π (xl ≠ □) ≔
222222
begin
223-
assume a x l h; refine ind_eq hl, istrue(isl)) top
223+
assume a x l h; refine ind_eq hl, istrue(isl)) ⊤ᵢ
224224
end;
225225

226226
opaque symbol □≠⸬ [a] [xa] [l] : π (□ ≠ xl) ≔
@@ -286,7 +286,7 @@ opaque symbol eql_complete a beq: π(`∀ x:τ a, `∀ y, x = y ⇒ istrue(beq x
286286
begin
287287
simplify; //FIXME: remove
288288
assume a beq beq_complete; induction
289-
{ assume m i; rewrite left i; apply top; }
289+
{ assume m i; rewrite left i; apply ⊤ᵢ; }
290290
{ simplify /*FIXME*/; assume x l h; induction
291291
{ assume j; apply ⸬≠□ j; }
292292
{ assume y m i j; simplify;
@@ -1086,7 +1086,7 @@ end;
10861086
opaque symbol mem_head [a] beq (xa) l :
10871087
π (beq x x = true) → π (istrue (∈ beq x (xl))) ≔
10881088
begin
1089-
assume a beq x l hrefl; simplify; rewrite hrefl; apply top;
1089+
assume a beq x l hrefl; simplify; rewrite hrefl; apply ⊤ᵢ;
10901090
end;
10911091

10921092
opaque symbol mem_take [a] beq n l (xa) :
@@ -1119,10 +1119,10 @@ opaque symbol index_size [a] beq (x:τ a) l :
11191119
π (istrue (index beq x lsize l)) ≔
11201120
begin
11211121
assume a beq x; induction
1122-
{ apply top; }
1122+
{ apply ⊤ᵢ; }
11231123
{ assume e l h; simplify;
11241124
refine ind_𝔹 (λ b, istrue (if b 0 (index beq x l +1) ≤ size l +1)) _ _ (beq x e) {
1125-
apply top;
1125+
apply ⊤ᵢ;
11261126
} {
11271127
simplify; apply h;
11281128
};
@@ -1169,10 +1169,10 @@ opaque symbol find_size [a] (p:τ a → 𝔹) l :
11691169
π (istrue (find p lsize l)) ≔
11701170
begin
11711171
assume a p; induction
1172-
{ apply top; }
1172+
{ apply ⊤ᵢ; }
11731173
{ assume e l h;
11741174
refine ind_𝔹 (λ x:𝔹, istrue (if x 0 (find p l +1) ≤ size l +1)) _ _ (p e) {
1175-
apply top;
1175+
apply ⊤ᵢ;
11761176
} {
11771177
simplify; apply h;
11781178
};
@@ -1192,7 +1192,7 @@ assert ⊢ count (λ x, eqn (x + 1) 3) (2 ⸬ 2 ⸬ 2 ⸬ 2 ⸬ □) ≡ 4;
11921192
opaque symbol count_size [a] (pa → 𝔹) l : π(istrue (count p lsize l)) ≔
11931193
begin
11941194
assume a p; induction
1195-
{ apply top; }
1195+
{ apply ⊤ᵢ; }
11961196
{ assume e l h; simplify;
11971197
refine ind_𝔹 (λ x:𝔹, istrue (if x (count p l +1) (count p l) ≤ size l +1)) _ _ (p e) {
11981198
simplify; apply h;
@@ -1378,7 +1378,7 @@ opaque symbol size_undup [a] beq (l:𝕃 a) :
13781378
π (istrue (size (undup beq l) ≤ size l)) ≔
13791379
begin
13801380
assume a beq; induction
1381-
{ apply top; }
1381+
{ apply ⊤ᵢ; }
13821382
{ assume e l h; simplify;
13831383
refine ind_𝔹 (λ x, istrue (size (if x (undup beq l) (eundup beq l)) ≤ size l +1)) _ _ (∈ beq e (undup beq l)) {
13841384
simplify;
@@ -1393,7 +1393,7 @@ opaque symbol undup_uniq [a] beq (l:𝕃 a) :
13931393
π (istrue (uniq beq (undup beq l))) ≔
13941394
begin
13951395
assume a beq; induction
1396-
{ apply top; }
1396+
{ apply ⊤ᵢ; }
13971397
{ assume e l h; simplify;
13981398
refine ind_𝔹_eqb, (istrue(uniq beq (if b (undup beq l) (e ⸬ (undup beq l)))))) (∈ beq e (undup beq l)) _ _ {
13991399
assume i; rewrite i; simplify; apply h;

Nat.lp

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ with is0 (_ +1) ↪ false;
117117

118118
opaque symbol s0 [n] : π (n +10) ≔
119119
begin
120-
assume n h; refine ind_eq hn, istrue(is0 n)) top
120+
assume n h; refine ind_eq hn, istrue(is0 n)) ⊤ᵢ
121121
end;
122122

123123
opaque symbol 0s [n] : π (0n +1) ≔
@@ -154,7 +154,7 @@ end;
154154
opaque symbol eqn_complete x y : π(x = y) → π(istrue(eqn x y)) ≔
155155
begin
156156
induction
157-
{ assume y i; rewrite left i; apply top; }
157+
{ assume y i; rewrite left i; apply ⊤ᵢ; }
158158
{ simplify; assume x h; induction
159159
{ assume i; apply s0 i; }
160160
{ assume y i j; simplify; }
@@ -654,7 +654,7 @@ end;
654654
opaque symbol ≤_refl x : π (istrue (xx)) ≔
655655
begin
656656
induction
657-
{ simplify; apply top;}
657+
{ simplify; apply ⊤ᵢ;}
658658
{ assume x h; simplify; apply h; }
659659
end;
660660

@@ -749,14 +749,14 @@ end;
749749
opaque symbol leq_pred n : π (istrue (n -1n)) ≔
750750
begin
751751
induction
752-
{ apply top;}
752+
{ apply ⊤ᵢ;}
753753
{ assume n h; simplify; apply leqnSn n;}
754754
end;
755755

756756
opaque symbol ltnW m n : π (istrue (m < n)) → π (istrue (mn)) ≔
757757
begin
758758
induction
759-
{ assume m h; apply top;}
759+
{ assume m h; apply ⊤ᵢ;}
760760
{ assume m h; induction
761761
{ assume i; apply i;}
762762
{ assume n i j; apply h n; apply j;}
@@ -798,9 +798,9 @@ end;
798798
opaque symbol leq_total x y : π (istrue (xy) ∨ istrue (yx)) ≔
799799
begin
800800
induction
801-
{ assume y; simplify; apply ∨ᵢ₁; apply top; }
801+
{ assume y; simplify; apply ∨ᵢ₁; apply ⊤ᵢ; }
802802
{ assume x h; induction
803-
{ simplify; apply ∨ᵢ₂; apply top; }
803+
{ simplify; apply ∨ᵢ₂; apply ⊤ᵢ; }
804804
{ assume y i; simplify; apply h y; }
805805
}
806806
end;
@@ -814,7 +814,7 @@ begin
814814
} {
815815
generalize n; induction
816816
{ assume h; apply h (eq_refl 0); }
817-
{ assume n h i; apply top; }
817+
{ assume n h i; apply ⊤ᵢ; }
818818
};
819819
end;
820820

@@ -824,7 +824,7 @@ begin
824824
generalize m; induction
825825
{ induction
826826
{ assume h; apply ∨ᵢ₁ (eq_refl 0) }
827-
{ assume n h i; apply ∨ᵢ₂ top }
827+
{ assume n h i; apply ∨ᵢ₂ ⊤ᵢ }
828828
}
829829
{ assume m h; induction
830830
{ assume i; apply ∨ᵢ₂ i }
@@ -883,7 +883,7 @@ end;
883883
opaque symbol leq_addl m n : π (istrue (nm + n)) ≔
884884
begin
885885
assume m; induction
886-
{ apply top; }
886+
{ apply ⊤ᵢ; }
887887
{ assume n h; apply h; }
888888
end;
889889

@@ -897,7 +897,7 @@ begin
897897
induction
898898
{ assume n; apply ≤_refl n; }
899899
{ assume m h; induction
900-
{ apply top; }
900+
{ apply ⊤ᵢ; }
901901
{ assume n i; simplify;
902902
have t: π (istrue (nn +1)) { apply leqnSn n };
903903
apply @leq_trans (n - m) n (n +1) (h n) t;
@@ -909,7 +909,7 @@ opaque symbol subn_eq0 m n : π ((m - n = 0) ⇔ istrue (m ≤ n)) ≔
909909
begin
910910
assume m n; apply ∧ᵢ {
911911
generalize m; induction
912-
{ assume n h; apply top; }
912+
{ assume n h; apply ⊤ᵢ; }
913913
{ assume m h; induction
914914
{ assume i; apply s0 i; }
915915
{ assume n i j; apply h n j; }
@@ -1188,7 +1188,7 @@ rule max $x $x ↪ $x;
11881188
opaque symbol leq_maxl m n : π (istrue (mmax m n)) ≔
11891189
begin
11901190
induction
1191-
{ assume n; apply top; }
1191+
{ assume n; apply ⊤ᵢ; }
11921192
{ assume m h; induction
11931193
{ simplify; apply ≤_refl m; }
11941194
{ assume n i; simplify; apply h n; }
@@ -1352,7 +1352,7 @@ begin
13521352
} {
13531353
generalize m; induction
13541354
{ assume h; apply h (eq_refl 0); }
1355-
{ assume m h i; apply top; }
1355+
{ assume m h i; apply ⊤ᵢ; }
13561356
};
13571357
end;
13581358

@@ -1482,9 +1482,9 @@ rule min $x $x ↪ $x;
14821482
opaque symbol geq_minl m n : π (istrue (min m nm)) ≔
14831483
begin
14841484
induction
1485-
{ assume n; apply top; }
1485+
{ assume n; apply ⊤ᵢ; }
14861486
{ assume m h; induction
1487-
{ apply top; }
1487+
{ apply ⊤ᵢ; }
14881488
{ assume n i; simplify; apply h n; }
14891489
}
14901490
end;
@@ -1777,7 +1777,7 @@ end;
17771777
opaque symbol fact_gt0 n : π (istrue (n ! > 0)) ≔
17781778
begin
17791779
induction
1780-
{ apply top; }
1780+
{ apply ⊤ᵢ; }
17811781
{ assume n h; rewrite factS n; rewrite mulSnr n (n !);
17821782
apply ltn_addl 0 (n !) (n * n !); apply h; }
17831783
end;
@@ -1790,6 +1790,6 @@ end;
17901790
opaque symbol fact_geq n : π (istrue (nn !)) ≔
17911791
begin
17921792
induction
1793-
{ apply top; }
1793+
{ apply ⊤ᵢ; }
17941794
{ assume n h; rewrite factS n; apply leq_pmulr (n +1) (n !) (fact_gt0 n); }
17951795
end;

0 commit comments

Comments
 (0)