Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions Cslib.lean
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ public import Cslib.Foundations.Data.DecidableEqZero
public import Cslib.Foundations.Data.FinFun.Basic
public import Cslib.Foundations.Data.FinFun.Update
public import Cslib.Foundations.Data.HasFresh
public import Cslib.Foundations.Data.ListHelpers
public import Cslib.Foundations.Data.Nat.Segment
public import Cslib.Foundations.Data.OmegaSequence.Defs
public import Cslib.Foundations.Data.OmegaSequence.Flatten
Expand All @@ -69,8 +70,22 @@ public import Cslib.Foundations.Data.Relation
public import Cslib.Foundations.Data.Set.Saturation
public import Cslib.Foundations.Data.StackTape
public import Cslib.Foundations.Lint.Basic
public import Cslib.Foundations.Logic.Axioms
public import Cslib.Foundations.Logic.Connectives
public import Cslib.Foundations.Logic.InferenceSystem
public import Cslib.Foundations.Logic.LogicalEquivalence
public import Cslib.Foundations.Logic.Metalogic.Consistency
public import Cslib.Foundations.Logic.Metalogic.DeductionHelpers
public import Cslib.Foundations.Logic.ProofSystem
public import Cslib.Foundations.Logic.Theorems
public import Cslib.Foundations.Logic.Theorems.BigConj
public import Cslib.Foundations.Logic.Theorems.Combinators
public import Cslib.Foundations.Logic.Theorems.Modal.Basic
public import Cslib.Foundations.Logic.Theorems.Modal.S5
public import Cslib.Foundations.Logic.Theorems.Propositional.Connectives
public import Cslib.Foundations.Logic.Theorems.Propositional.Core
public import Cslib.Foundations.Logic.Theorems.Temporal.FrameConditions
public import Cslib.Foundations.Logic.Theorems.Temporal.TemporalDerived
public import Cslib.Foundations.Semantics.FLTS.Basic
public import Cslib.Foundations.Semantics.FLTS.FLTSToLTS
public import Cslib.Foundations.Semantics.FLTS.LTSToFLTS
Expand Down Expand Up @@ -140,7 +155,13 @@ public import Cslib.Logics.Modal.Basic
public import Cslib.Logics.Modal.Cube
public import Cslib.Logics.Modal.Denotation
public import Cslib.Logics.Propositional.Defs
public import Cslib.Logics.Propositional.Metalogic.DeductionTheorem
public import Cslib.Logics.Propositional.Metalogic.MCS
public import Cslib.Logics.Propositional.NaturalDeduction.Basic
public import Cslib.Logics.Propositional.NaturalDeduction.FromHilbert
public import Cslib.Logics.Propositional.ProofSystem.Axioms
public import Cslib.Logics.Propositional.ProofSystem.Derivation
public import Cslib.Logics.Propositional.ProofSystem.Instances
public import Cslib.MachineLearning.PACLearning.Defs
public import Cslib.MachineLearning.PACLearning.VCDimension
public import Cslib.MachineLearning.PACLearning.VersionSpace
Expand Down
71 changes: 71 additions & 0 deletions Cslib/Foundations/Data/ListHelpers.lean
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
/-
Copyright (c) 2026 Benjamin Brast-McKie. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Benjamin Brast-McKie
-/

module
public import Cslib.Init

/-! # Shared List Helper Utilities

Shared `removeAll` definition and supporting lemmas used by all DeductionTheorem
files (Propositional, Modal, Temporal, Bimodal). Extracted to avoid duplication.

## Main Definitions

- `removeAll`: Remove all occurrences of an element from a list
- `removeAll_subset_of_subset`: If `A in Gamma'` and `Gamma' subs A :: Delta`,
then `removeAll Gamma' A subs Delta`
- `mem_removeAll_of_mem_of_ne`: Membership in removeAll from membership and inequality
- `removeAll_subset_removeAll`: removeAll preserves subset relationships

## Aliases

- `removeAll_sub_of_sub`: Alias for `removeAll_subset_of_subset` using `List.Subset`
- `removeAll_sub_removeAll`: Alias for `removeAll_subset_removeAll` using `List.Subset`
-/

@[expose] public section

namespace Cslib.Logic.Helpers

/-- Remove all occurrences of `a` from a list. -/
def removeAll [DecidableEq α] (l : List α) (a : α) : List α :=
l.filter (· ≠ a)

theorem removeAll_subset_of_subset [DecidableEq α] {A : α} {Γ' Δ : List α}
(h_sub : ∀ x ∈ Γ', x ∈ A :: Δ) (h_mem : A ∈ Γ') :
∀ x ∈ removeAll Γ' A, x ∈ Δ := by
intro x hx
simp [removeAll, List.mem_filter] at hx
obtain ⟨hx_in, hx_ne⟩ := hx
have := h_sub x hx_in
simp [List.mem_cons] at this
rcases this with rfl | h
· exact absurd rfl hx_ne
· exact h

theorem mem_removeAll_of_mem_of_ne [DecidableEq α] {a x : α} {l : List α}
(h_mem : x ∈ l) (h_ne : x ≠ a) : x ∈ removeAll l a := by
simp [removeAll, List.mem_filter]
exact ⟨h_mem, h_ne⟩

theorem removeAll_subset_removeAll [DecidableEq α] {a : α} {l₁ l₂ : List α}
(h : ∀ x ∈ l₁, x ∈ l₂) : ∀ x ∈ removeAll l₁ a, x ∈ removeAll l₂ a := by
intro x hx
simp [removeAll, List.mem_filter] at hx ⊢
exact ⟨h x hx.1, hx.2⟩

/-- Alias using `List.Subset` notation for `removeAll_subset_of_subset`. -/
theorem removeAll_sub_of_sub [DecidableEq α] {A : α} {Γ' Δ : List α}
(h_sub : Γ' ⊆ A :: Δ) (h_mem : A ∈ Γ') :
removeAll Γ' A ⊆ Δ :=
removeAll_subset_of_subset h_sub h_mem

/-- Alias using `List.Subset` notation for `removeAll_subset_removeAll`. -/
theorem removeAll_sub_removeAll [DecidableEq α] {a : α} {l₁ l₂ : List α}
(h : l₁ ⊆ l₂) : removeAll l₁ a ⊆ removeAll l₂ a :=
removeAll_subset_removeAll h

end Cslib.Logic.Helpers
Loading