-
Notifications
You must be signed in to change notification settings - Fork 30
/
Copy path20.lean
32 lines (26 loc) · 1.06 KB
/
20.lean
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/-
Copyright (c) 2022 Jannis Limperg. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Asta H. From, Jannis Limperg
-/
import Aesop
set_option aesop.check.all true
attribute [aesop safe cases (cases_patterns := [List.Mem _ []])] List.Mem
attribute [aesop unsafe 50% constructors] List.Mem
attribute [aesop unsafe 50% cases (cases_patterns := [List.Mem _ (_ :: _)])] List.Mem
@[aesop safe [constructors, cases (cases_patterns := [All _ [], All _ (_ :: _)])]]
inductive All (P : α → Prop) : List α → Prop where
| none : All P []
| more {x xs} : P x → All P xs → All P (x :: xs)
@[simp]
theorem All.cons (P : α → Prop) (x : α) (xs : List α)
: All P (x :: xs) ↔ (P x ∧ All P xs) := by
aesop
theorem mem (P : α → Prop) (xs : List α)
: All P xs ↔ ∀ a : α, a ∈ xs → P a := by
induction xs
case nil => aesop
case cons x xs ih => aesop (config := { useSimpAll := false })
theorem mem' (P : α → Prop) (xs : List α)
: All P xs ↔ ∀ a : α, a ∈ xs → P a := by
induction xs <;> aesop