Skip to content
Back to skills

417 Isabelle Lemmas B858c64e

ASecurity

Comprehensive guide for discovering and using lemmas in Isabelle/HOL.

  • 9 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added October 11, 2026
researchgoexpress

Security analysis

A100/100

Scanned October 11, 2026

npx -y skills add tools-only/X-Skills --skill 417-isabelle_lemmas_b858c64e --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of 417 Isabelle Lemmas B858c64e?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for 417 Isabelle Lemmas B858c64e
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/tools-only-417-isabelle-lemmas-b858c64e/badge)](https://www.skillsdirectory.com/skills/tools-only-417-isabelle-lemmas-b858c64e)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

SKILL.md
# Isabelle/HOL Lemma Discovery

Comprehensive guide for discovering and using lemmas in Isabelle/HOL.

## Automatic Lemma Discovery

### Sledgehammer

Sledgehammer is Isabelle's most powerful automatic proof tool that searches for relevant lemmas.

**Basic usage:**
```isabelle
lemma "P"
  by sledgehammer
```

**With timeout:**
```isabelle
lemma "P"
  by (sledgehammer [timeout = 60])
```

**Selecting provers:**
```isabelle
lemma "P"
  by (sledgehammer [provers = e spass z3])
```

**Example:**
```isabelle
lemma "length (xs @ ys) = length xs + length ys"
  by sledgehammer
(* Sledgehammer finds: by (simp add: length_append) *)
```

### Try and Try0

Quick proof search tactics.

**try:** Attempts various proof methods
```isabelle
lemma "sorted []"
  by try
```

**try0:** Faster version, tries only basic tactics
```isabelle
lemma "x + 0 = x"
  by try0
```

## Finding Existing Lemmas

### Find Theorems

Search for lemmas by pattern or name.

**By pattern:**
```isabelle
find_theorems "length (_ @ _)"
(* Finds: length_append, length_append_singleton, etc. *)
```

**By name:**
```isabelle
find_theorems name: "append"
(* Finds all lemmas with "append" in name *)
```

**With constraints:**
```isabelle
find_theorems "length ?xs = ?n" "?xs @ ?ys"
(* Finds lemmas matching both patterns *)
```

**Excluding patterns:**
```isabelle
find_theorems "_ + _" -"_ * _"
(* Finds addition lemmas, excluding multiplication *)
```

### Print Theorems

List all available theorems.

```isabelle
print_theorems
(* Lists all theorems in current context *)
```

## Common Lemma Patterns

### List Lemmas

**Append properties:**
```isabelle
lemma append_Nil: "xs @ [] = xs"
lemma append_Nil2: "[] @ xs = xs"
lemma append_assoc: "(xs @ ys) @ zs = xs @ (ys @ zs)"
lemma length_append: "length (xs @ ys) = length xs + length ys"
```

**Map properties:**
```isabelle
lemma map_append: "map f (xs @ ys) = map f xs @ map f ys"
lemma map_map: "map f (map g xs) = map (f ∘ g) xs"
lemma map_ident: "map id xs = xs"
lemma length_map: "length (map f xs) = length xs"
```

**Filter properties:**
```isabelle
lemma filter_append: "filter P (xs @ ys) = filter P xs @ filter P ys"
lemma filter_filter: "filter P (filter Q xs) = filter (λx. P x ∧ Q x) xs"
lemma length_filter_le: "length (filter P xs) ≤ length xs"
```

**Reverse properties:**
```isabelle
lemma rev_append: "rev (xs @ ys) = rev ys @ rev xs"
lemma rev_rev_ident: "rev (rev xs) = xs"
lemma length_rev: "length (rev xs) = length xs"
```

### Arithmetic Lemmas

**Addition:**
```isabelle
lemma add_0: "0 + n = n"
lemma add_0_right: "n + 0 = n"
lemma add_commute: "m + n = n + m"
lemma add_assoc: "(m + n) + p = m + (n + p)"
lemma add_left_cancel: "k + m = k + n ⟹ m = n"
```

**Multiplication:**
```isabelle
lemma mult_0: "0 * n = 0"
lemma mult_1: "1 * n = n"
lemma mult_commute: "m * n = n * m"
lemma mult_assoc: "(m * n) * p = m * (n * p)"
lemma mult_distrib: "(m + n) * p = m * p + n * p"
```

**Ordering:**
```isabelle
lemma le_refl: "n ≤ n"
lemma le_trans: "⟦ i ≤ j; j ≤ k ⟧ ⟹ i ≤ k"
lemma le_antisym: "⟦ m ≤ n; n ≤ m ⟧ ⟹ m = n"
lemma add_le_mono: "⟦ i ≤ j; k ≤ l ⟧ ⟹ i + k ≤ j + l"
```

### Set Lemmas

**Basic operations:**
```isabelle
lemma Un_empty: "A ∪ {} = A"
lemma Un_commute: "A ∪ B = B ∪ A"
lemma Un_assoc: "(A ∪ B) ∪ C = A ∪ (B ∪ C)"
lemma Int_empty: "A ∩  = {}"
lemma Int_commute: "A ∩ B = B ∩ A"
```

**Membership:**
```isabelle
lemma mem_Un: "x ∈ A ∪ B ⟷ x ∈ A ∨ x ∈ B"
lemma mem_Int: "x ∈ A ∩ B ⟷ x ∈ A ∧ x ∈ B"
lemma mem_Diff: "x ∈ A - B ⟷ x ∈ A ∧ x ∉ B"
```

## Induction Lemmas

### Strengthening Induction Hypotheses

**Problem:** Induction hypothesis too weak.

**Pattern:** Generalize the statement.

**Example:**
```isabelle
(* Too specific *)
lemma "sum_upto n = n * (n + 1) div 2"
  (* Fails: need to generalize *)

(* Generalized with accumulator *)
lemma sum_upto_acc: "sum_upto_acc n acc = acc + n * (n + 1) div 2"
proof (induction n arbitrary: acc)
  case 0
  then show ?case by simp
next
  case (Suc n)
  then show ?case by simp
qed
```

### Mutual Induction

**Pattern:** Prove multiple properties simultaneously.

**Example:**
```isabelle
lemma even_odd:
  "even n ⟷ ¬ odd n"
  "odd n ⟷ ¬ even n"
proof (induction n)
  case 0
  then show "even 0 ⟷ ¬ odd 0" by simp
  then show "odd 0 ⟷ ¬ even 0" by simp
next
  case (Suc n)
  then show "even (Suc n) ⟷ ¬ odd (Suc n)" by simp
  then show "odd (Suc n) ⟷ ¬ even (Suc n)" by simp
qed
```

### Rule Induction

**Pattern:** Induction on inductively defined predicates.

**Example:**
```isabelle
inductive even :: "nat ⇒ bool" where
  even_0: "even 0" |
  even_SS: "even n ⟹ even (Suc (Suc n))"

lemma even_double: "even n ⟹ ∃k. n = 2 * k"
proof (induction rule: even.induct)
  case even_0
  then show ?case by (rule exI[of _ 0]) simp
next
  case (even_SS n)
  then obtain k where "n = 2 * k" by blast
  then show ?case by (rule exI[of _ "Suc k"]) simp
qed
```

## Simplification Lemmas

### Adding to Simpset

**Declare as simp rule:**
```isabelle
declare my_lemma [simp]
```

**Conditional simp rule:**
```isabelle
lemma my_cond_simp [simp]: "P ⟹ f x = g x"
```

**Remove from simpset:**
```isabelle
declare my_lemma [simp del]
```

### Rewrite Lemmas

**Pattern:** Equations for simplification.

**Example:**
```isabelle
lemma comp_apply [simp]: "(f ∘ g) x = f (g x)"
  by (simp add: comp_def)

lemma id_apply [simp]: "id x = x"
  by (simp add: id_def)

lemma const_apply [simp]: "const c x = c"
  by (simp add: const_def)
```

## Case Analysis Lemmas

### Split Rules

**Pattern:** Case split for conditional expressions.

**Example:**
```isabelle
lemma if_split: "P (if c then x else y) = ((c ⟶ P x) ∧ (¬c ⟶ P y))"
  by auto

lemma case_split: "P (case xs of [] ⇒ a | _ ⇒ b) =
  ((xs = [] ⟶ P a) ∧ (xs ≠ [] ⟶ P b))"
  by (cases xs) auto
```

### Exhaustiveness Lemmas

**Pattern:** Cover all cases of a datatype.

**Example:**
```isabelle
lemma list_cases: "xs = [] ∨ (∃y ys. xs = y # ys)"
  by (cases xs) auto

lemma nat_cases: "n = 0 ∨ (∃m. n = Suc m)"
  by (cases n) auto
```

## Proof Automation

### Auto and Simp

**auto:** Applies classical reasoning and simplification
```isabelle
lemma "P ∧ Q ⟹ Q ∧ P"
  by auto
```

**simp:** Applies simplification rules
```isabelle
lemma "xs @ [] = xs"
  by simp
```

**simp with additional rules:**
```isabelle
lemma "..."
  by (simp add: my_lemma1 my_lemma2)
```

### Blast and Force

**blast:** Fast classical reasoner
```isabelle
lemma "⟦ P ⟶ Q; Q ⟶ R; P ⟧ ⟹ R"
  by blast
```

**force:** Combines auto and blast
```isabelle
lemma "..."
  by force
```

### Clarify and Safe

**clarify:** Performs safe steps without splitting
```isabelle
lemma "..."
  by clarify
```

**safe:** Performs all safe steps
```isabelle
lemma "..."
  by safe
```

## Specialized Lemmas

### Monotonicity Lemmas

**Pattern:** Preserve ordering.

**Example:**
```isabelle
lemma map_mono: "⟦ ∀x ∈ set xs. f x ≤ g x ⟧ ⟹
  map f xs ≤ map g xs"
  by (induction xs) auto

lemma filter_mono: "⟦ ∀x. P x ⟶ Q x ⟧ ⟹
  set (filter P xs) ⊆ set (filter Q xs)"
  by auto
```

### Injectivity Lemmas

**Pattern:** Function is injective.

**Example:**
```isabelle
lemma Suc_inject: "Suc m = Suc n ⟹ m = n"
  by simp

lemma Cons_inject: "x # xs = y # ys ⟹ x = y ∧ xs = ys"
  by simp
```

### Distinctness Lemmas

**Pattern:** Constructors are distinct.

**Example:**
```isabelle
lemma Nil_not_Cons: "[] ≠ x # xs"
  by simp

lemma Zero_not_Suc: "0 ≠ Suc n"
  by simp
```

## Lemma Discovery Workflow

### Step 1: Try Automatic Tools

```isabelle
lemma "goal"
  by sledgehammer
  (* or *)
  by try
  (* or *)
  by auto
```

### Step 2: Search for Relevant Lemmas

```isabelle
find_theorems "pattern"
```

### Step 3: Manual Proof with Lemmas

```isabelle
lemma "goal"
proof -
  have "intermediate" by (simp add: lemma1)
  then show ?thesis by (simp add: lemma2)
qed
```

### Step 4: Identify Missing Lemmas

If proof fails, identify what's missing and propose new lemma.

## Example: Complete Discovery

**Goal:**
```isabelle
lemma "length (filter P (map f xs)) ≤ length xs"
```

**Attempt 1:**
```isabelle
proof (induction xs)
  case Nil
  then show ?case by simp
next
  case (Cons x xs)
  (* Stuck: need lemma about length of filter *)
  then show ?case sorry
qed
```

**Search for lemmas:**
```isabelle
find_theorems "length (filter _ _)"
(* Finds: length_filter_le *)
```

**Attempt 2:**
```isabelle
proof (induction xs)
  case Nil
  then show ?case by simp
next
  case (Cons x xs)
  (* Still stuck: need lemma about filter and map *)
  then show ?case sorry
qed
```

**Propose new lemma:**
```isabelle
lemma filter_map: "filter P (map f xs) = map f (filter (P ∘ f) xs)"
proof (induction xs)
  case Nil
  then show ?case by simp
next
  case (Cons x xs)
  then show ?case by (auto simp: comp_def)
qed
```

**Final proof:**
```isabelle
lemma "length (filter P (map f xs)) ≤ length xs"
proof -
  have "length (filter P (map f xs)) = length (map f (filter (P ∘ f) xs))"
    by (simp add: filter_map)
  also have "... = length (filter (P ∘ f) xs)"
    by (simp add: length_map)
  also have "... ≤ length xs"
    by (rule length_filter_le)
  finally show ?thesis .
qed
```

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.