提交信息
题目#2. 列表前缀和列表连续段证明
提交者vvauted
状态Accepted
分数100
提交时间2026/02/12 22:11:21
源代码
import Mathlib.Data.Int.Bitwise

def prefixes {A : Type} : List A → List (List A)
  | [] => [[]]
  | a :: l0 => [] :: (List.map (fun x => a :: x) (prefixes l0))

lemma nil_in_prefixes {A : Type} (l : List A) : [] ∈ prefixes l := by
  induction l with
  | nil => simp [prefixes]
  | cons a l ih =>
      simp [prefixes]

theorem in_prefixes {A : Type} (l1 l2 : List A) : l1 ∈ prefixes (l1 ++ l2) := by
  induction l1 generalizing l2 with
  | nil =>
      simp [nil_in_prefixes]
  | cons a l1 ih =>
      simp [prefixes, List.cons_append]
      apply ih

theorem in_prefixes_inv {A : Type} (l1 l : List A) :
    l1 ∈ prefixes l → ∃ l2, l1 ++ l2 = l := by
  induction l generalizing l1 with
  | nil =>
      intro h
      simp [prefixes] at h
      rw [h]
      exists []
  | cons a l ih =>
      intro h
      simp [prefixes] at h
      rcases h with (rfl | h)
      · exact ⟨a :: l, rfl⟩
      · rcases h with ⟨l1', h1, rfl⟩
        rcases ih l1' h1 with ⟨l2, h2⟩
        exact ⟨l2, by simp [h2]⟩


def sublists {A : Type} : List A → List (List A)
  | [] => [[]]
  | a :: l0 => List.map (fun x => a :: x) (prefixes l0) ++ sublists l0

lemma nil_in_sublists {A : Type} (l : List A) : [] ∈ sublists l := by
  induction l with
  | nil => simp [sublists]
  | cons a l ih =>
      simp [sublists]
      exact ih


lemma prefixes_in_sublists {A : Type} (l1 l2 : List A) : l1 ∈ sublists (l1 ++ l2) := by
  induction l1 with
  | nil =>
      simp [nil_in_sublists]
  | cons a l1 ih =>
      simp [sublists, List.cons_append]
      left
      have h : l1 ∈ prefixes (l1 ++ l2) := in_prefixes l1 l2
      apply h

theorem in_sublists {A : Type} (l1 l2 l3 : List A) :
    l2 ∈ sublists (l1 ++ l2 ++ l3) := by
  induction l1 with
  | nil =>
      simp
      exact prefixes_in_sublists l2 l3
  | cons a l1 ih =>
      simp [sublists]
      right
      rw [<- List.append_assoc]
      apply ih

theorem in_sublists_inv {A : Type} (l2 l : List A) :
    l2 ∈ sublists l → ∃ l1 l3, l1 ++ l2 ++ l3 = l := by
  induction l generalizing l2 with
  | nil =>
      intro h
      simp [sublists] at h
      rcases h with (rfl | ⟨⟩)
      exact ⟨[], [], rfl⟩
  | cons a l ih =>
      intro h
      simp [sublists] at h
      rcases h with (h | h)
      · rcases h with ⟨l2', h1, rfl⟩
        rcases in_prefixes_inv l2' l h1 with ⟨l3, h2⟩
        exact ⟨[], l3, by simp [h2]⟩
      · rcases ih l2 h with ⟨l1, l3, h3⟩
        exact ⟨a :: l1, l3, by simp [h3]⟩
评测详情
compilecompile_problem
732 ms1050 MBOK
Built: problem
输出 (stdout / stderr)
[lean -o] /work/problem.lean:10:8: warning: declaration uses 'sorry'
/work/problem.lean:13:8: warning: declaration uses 'sorry'
/work/problem.lean:22:8: warning: declaration uses 'sorry'
/work/problem.lean:26:8: warning: declaration uses 'sorry'

[lean -c] /work/problem.lean:10:8: warning: declaration uses 'sorry'
/work/problem.lean:13:8: warning: declaration uses 'sorry'
/work/problem.lean:22:8: warning: declaration uses 'sorry'
/work/problem.lean:26:8: warning: declaration uses 'sorry'
compilecompile_usersol
680 ms1050 MBOK
Built: UserSol
gradegrade
1176 ms1463 MBOK
Score: 100
输出 (stdout / stderr)
{"score": 100, "passed": true, "status": "accepted", "subtasks": [{"id": 1, "name": "in_prefixes", "score": 20, "passed": true, "msg": "Accepted"}, {"id": 2, "name": "in_prefixes_inv", "score": 20, "passed": true, "msg": "Accepted"}, {"id": 3, "name": "in_sublists", "score": 30, "passed": true, "msg": "Accepted"}, {"id": 4, "name": "in_sublists_inv", "score": 30, "passed": true, "msg": "Accepted"}]}
评测结果
评分
Passed100
测试点结果信息得分
#1 in_prefixesAcceptedAccepted20
#2 in_prefixes_invAcceptedAccepted20
#3 in_sublistsAcceptedAccepted30
#4 in_sublists_invAcceptedAccepted30