4
4
import Aesop -- `aesop` を使うため --#
5
5
import Mathlib.Tactic.Tauto -- `tauto` を使うのに必要
6
6
7
- namespace Tauto --#
7
+ section --#
8
8
9
9
variable (P Q R : Prop )
10
10
@@ -20,23 +20,28 @@ example : (P → (Q → R)) → ((P → Q) → (P → R)) := by
20
20
example : (P ↔ ¬ P) → False := by
21
21
tauto
22
22
23
- /- `tauto` が扱えるのは命題論理の範囲で記述できる命題だけです。述語論理における恒真な式は、ごく簡単なものであっても `tauto` で示せないことがあります。-/
23
+ end --#
24
+ /- `tauto` が扱う対象の「トートロジー」は、命題論理の範囲で記述できるものに限ります。述語論理における恒真な式は、`tauto` で示せないことがあります。-/
24
25
25
- variable (α : Type ) (S : α → Prop )
26
-
27
- example : ¬(∀ x, S x) → (∃ x, ¬ S x) := by
26
+ example (α : Type ) (S : α → Prop ) : ¬(∀ x, S x) → (∃ x, ¬ S x) := by
28
27
-- `tauto` では示せない
29
28
fail_if_success tauto
30
29
31
30
aesop
32
31
33
- /- また、排中律を使わずに示せる命題であっても、`tauto` は排中律を使って示してしまうことがあります。直観主義論理の枠内で命題を示すには、代わりに[ `itauto` ] (./Itauto.md)を使用してください。-/
32
+ example (Q : Prop ) : ∀ (P : Prop ), P → (Q → P) := by
33
+ -- これは量化子を含むが、`tauto` でも示すことができる。
34
+ tauto
35
+
36
+ /- ## 排中律
37
+
38
+ 排中律を使わずに示せる命題であっても、`tauto` は排中律を使って示してしまうことがあります。直観主義論理の枠内で命題を示すには、代わりに [ `itauto` ] (./Itauto.md) タクティクを使用してください。-/
34
39
35
40
/-- 命題とその否定は同値ではない -/
36
41
theorem not_neg_iff {P : Prop } : ¬ (P ↔ ¬ P) := by tauto
37
42
38
43
-- 選択原理を使っているが、これは排中律を使っているため
39
- /-- info: 'Tauto. not_neg_iff' depends on axioms: [propext, Classical.choice, Quot.sound] -/
44
+ /-- info: 'not_neg_iff' depends on axioms: [propext, Classical.choice, Quot.sound] -/
40
45
#guard_msgs in #print axioms not_neg_iff
41
46
42
47
-- 実際には排中律は必要ない
@@ -49,7 +54,5 @@ theorem not_neg_iff' {P : Prop} : ¬ (P ↔ ¬ P) := by
49
54
have hp : P := by rwa [← h] at hnp
50
55
contradiction
51
56
52
- /-- info: 'Tauto. not_neg_iff'' depends on axioms: [ propext ] -/
57
+ /-- info: 'not_neg_iff'' depends on axioms: [ propext ] -/
53
58
#guard_msgs in #print axioms not_neg_iff'
54
-
55
- end Tauto --#
0 commit comments