/-
Copyright 2026 The Formal Conjectures Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
https://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-/
import FormalConjecturesUtilA generalized Stern sequence
A112970: A generalized Stern sequence, defined by the recurrence relations: $a(2n+1) = a(n)$ and $a(2n) = a(n) + a(n-2)$ with $a(0)=1$, $a(1)=1$ and $a(n)=0$ for $n \le -1$.
References:
namespace OeisA112970a n is the generalized Stern sequence, defined by the recurrence relations: $a(2n+1) = a(n)$ and $a(2n) = a(n)$ + $a(n-2)$ with $a(0) = 1$, $a(1) = 1$ and $a(n) = 0$ for $n \le -1$.
def a (n : ℕ) : ℕ :=
if n = 0 then 1
else if n = 1 then 1
else
let k := n / 2
if n % 2 = 1 then -- Odd case: a(2k + 1) = a(k)
a k
else -- Even case: a(2k) = a(k) + a(k - 2)
let aPrev : ℕ :=
-- a(m) is 0 if m < 0. Equivalent to checking k < 2 for the argument k-2.
if k < 2 then 0
else a (k - 2)
a k + aPrev
termination_by n@[category test, AMS 11]
theorem a_0 : a 0 = 1 := ⊢ a 0 = 1 ⊢ (if 0 = 0 then 1
else
if 0 = 1 then 1
else
have k := 0 / 2;
if 0 % 2 = 1 then a k
else
have aPrev := if k < 2 then 0 else a (k - 2);
a k + aPrev) =
1; All goals completed! 🐙@[category test, AMS 11]
theorem a_1 : a 1 = 1 := ⊢ a 1 = 1 ⊢ (if 1 = 0 then 1
else
if 1 = 1 then 1
else
have k := 1 / 2;
if 1 % 2 = 1 then a k
else
have aPrev := if k < 2 then 0 else a (k - 2);
a k + aPrev) =
1; All goals completed! 🐙@[category test, AMS 11]
theorem a_2 : a 2 = 1 := ⊢ a 2 = 1 ⊢ (if 2 = 0 then 1
else
if 2 = 1 then 1
else
have k := 2 / 2;
if 2 % 2 = 1 then a k
else
have aPrev := if k < 2 then 0 else a (k - 2);
a k + aPrev) =
1; ⊢ (if 2 = 0 then 1
else
if 2 = 1 then 1
else
have k := 2 / 2;
if 2 % 2 = 1 then
if k = 0 then 1
else
if k = 1 then 1
else
have k_1 := k / 2;
if k % 2 = 1 then a k_1
else
have aPrev := if k_1 < 2 then 0 else a (k_1 - 2);
a k_1 + aPrev
else
have aPrev :=
if k < 2 then 0
else
if k - 2 = 0 then 1
else
if k - 2 = 1 then 1
else
have k_1 := (k - 2) / 2;
if (k - 2) % 2 = 1 then a k_1
else
have aPrev := if k_1 < 2 then 0 else a (k_1 - 2);
a k_1 + aPrev;
(if k = 0 then 1
else
if k = 1 then 1
else
have k_1 := k / 2;
if k % 2 = 1 then a k_1
else
have aPrev := if k_1 < 2 then 0 else a (k_1 - 2);
a k_1 + aPrev) +
aPrev) =
1; ⊢ (if 2 = 0 then 1
else
if 2 = 1 then 1
else
have k := 2 / 2;
if 2 % 2 = 1 then
if k = 0 then 1
else
if k = 1 then 1
else
have k_1 := k / 2;
if k % 2 = 1 then
if k_1 = 0 then 1
else
if k_1 = 1 then 1
else
have k := k_1 / 2;
if k_1 % 2 = 1 then a k
else
have aPrev := if k < 2 then 0 else a (k - 2);
a k + aPrev
else
have aPrev :=
if k_1 < 2 then 0
else
if k_1 - 2 = 0 then 1
else
if k_1 - 2 = 1 then 1
else
have k := (k_1 - 2) / 2;
if (k_1 - 2) % 2 = 1 then a k
else
have aPrev := if k < 2 then 0 else a (k - 2);
a k + aPrev;
(if k_1 = 0 then 1
else
if k_1 = 1 then 1
else
have k := k_1 / 2;
if k_1 % 2 = 1 then a k
else
have aPrev := if k < 2 then 0 else a (k - 2);
a k + aPrev) +
aPrev
else
have aPrev :=
if k < 2 then 0
else
if k - 2 = 0 then 1
else
if k - 2 = 1 then 1
else
have k_1 := (k - 2) / 2;
if (k - 2) % 2 = 1 then
if k_1 = 0 then 1
else
if k_1 = 1 then 1
else
have k := k_1 / 2;
if k_1 % 2 = 1 then a k
else
have aPrev := if k < 2 then 0 else a (k - 2);
a k + aPrev
else
have aPrev :=
if k_1 < 2 then 0
else
if k_1 - 2 = 0 then 1
else
if k_1 - 2 = 1 then 1
else
have k := (k_1 - 2) / 2;
if (k_1 - 2) % 2 = 1 then a k
else
have aPrev := if k < 2 then 0 else a (k - 2);
a k + aPrev;
(if k_1 = 0 then 1
else
if k_1 = 1 then 1
else
have k := k_1 / 2;
if k_1 % 2 = 1 then a k
else
have aPrev := if k < 2 then 0 else a (k - 2);
a k + aPrev) +
aPrev;
(if k = 0 then 1
else
if k = 1 then 1
else
have k_1 := k / 2;
if k % 2 = 1 then
if k_1 = 0 then 1
else
if k_1 = 1 then 1
else
have k := k_1 / 2;
if k_1 % 2 = 1 then a k
else
have aPrev := if k < 2 then 0 else a (k - 2);
a k + aPrev
else
have aPrev :=
if k_1 < 2 then 0
else
if k_1 - 2 = 0 then 1
else
if k_1 - 2 = 1 then 1
else
have k := (k_1 - 2) / 2;
if (k_1 - 2) % 2 = 1 then a k
else
have aPrev := if k < 2 then 0 else a (k - 2);
a k + aPrev;
(if k_1 = 0 then 1
else
if k_1 = 1 then 1
else
have k := k_1 / 2;
if k_1 % 2 = 1 then a k
else
have aPrev := if k < 2 then 0 else a (k - 2);
a k + aPrev) +
aPrev) +
aPrev) =
1; All goals completed! 🐙@[category test, AMS 11]
theorem a_3 : a 3 = 1 := ⊢ a 3 = 1 ⊢ (if 3 = 0 then 1
else
if 3 = 1 then 1
else
have k := 3 / 2;
if 3 % 2 = 1 then a k
else
have aPrev := if k < 2 then 0 else a (k - 2);
a k + aPrev) =
1; ⊢ (if 3 = 0 then 1
else
if 3 = 1 then 1
else
have k := 3 / 2;
if 3 % 2 = 1 then
if k = 0 then 1
else
if k = 1 then 1
else
have k_1 := k / 2;
if k % 2 = 1 then a k_1
else
have aPrev := if k_1 < 2 then 0 else a (k_1 - 2);
a k_1 + aPrev
else
have aPrev :=
if k < 2 then 0
else
if k - 2 = 0 then 1
else
if k - 2 = 1 then 1
else
have k_1 := (k - 2) / 2;
if (k - 2) % 2 = 1 then a k_1
else
have aPrev := if k_1 < 2 then 0 else a (k_1 - 2);
a k_1 + aPrev;
(if k = 0 then 1
else
if k = 1 then 1
else
have k_1 := k / 2;
if k % 2 = 1 then a k_1
else
have aPrev := if k_1 < 2 then 0 else a (k_1 - 2);
a k_1 + aPrev) +
aPrev) =
1; All goals completed! 🐙@[category test, AMS 11]
theorem a_4 : a 4 = 2 := ⊢ a 4 = 2 ⊢ (if 4 = 0 then 1
else
if 4 = 1 then 1
else
have k := 4 / 2;
if 4 % 2 = 1 then a k
else
have aPrev := if k < 2 then 0 else a (k - 2);
a k + aPrev) =
2; ⊢ (if 4 = 0 then 1
else
if 4 = 1 then 1
else
have k := 4 / 2;
if 4 % 2 = 1 then
if k = 0 then 1
else
if k = 1 then 1
else
have k_1 := k / 2;
if k % 2 = 1 then a k_1
else
have aPrev := if k_1 < 2 then 0 else a (k_1 - 2);
a k_1 + aPrev
else
have aPrev :=
if k < 2 then 0
else
if k - 2 = 0 then 1
else
if k - 2 = 1 then 1
else
have k_1 := (k - 2) / 2;
if (k - 2) % 2 = 1 then a k_1
else
have aPrev := if k_1 < 2 then 0 else a (k_1 - 2);
a k_1 + aPrev;
(if k = 0 then 1
else
if k = 1 then 1
else
have k_1 := k / 2;
if k % 2 = 1 then a k_1
else
have aPrev := if k_1 < 2 then 0 else a (k_1 - 2);
a k_1 + aPrev) +
aPrev) =
2; ⊢ (if 4 = 0 then 1
else
if 4 = 1 then 1
else
have k := 4 / 2;
if 4 % 2 = 1 then
if k = 0 then 1
else
if k = 1 then 1
else
have k_1 := k / 2;
if k % 2 = 1 then
if k_1 = 0 then 1
else
if k_1 = 1 then 1
else
have k := k_1 / 2;
if k_1 % 2 = 1 then a k
else
have aPrev := if k < 2 then 0 else a (k - 2);
a k + aPrev
else
have aPrev :=
if k_1 < 2 then 0
else
if k_1 - 2 = 0 then 1
else
if k_1 - 2 = 1 then 1
else
have k := (k_1 - 2) / 2;
if (k_1 - 2) % 2 = 1 then a k
else
have aPrev := if k < 2 then 0 else a (k - 2);
a k + aPrev;
(if k_1 = 0 then 1
else
if k_1 = 1 then 1
else
have k := k_1 / 2;
if k_1 % 2 = 1 then a k
else
have aPrev := if k < 2 then 0 else a (k - 2);
a k + aPrev) +
aPrev
else
have aPrev :=
if k < 2 then 0
else
if k - 2 = 0 then 1
else
if k - 2 = 1 then 1
else
have k_1 := (k - 2) / 2;
if (k - 2) % 2 = 1 then
if k_1 = 0 then 1
else
if k_1 = 1 then 1
else
have k := k_1 / 2;
if k_1 % 2 = 1 then a k
else
have aPrev := if k < 2 then 0 else a (k - 2);
a k + aPrev
else
have aPrev :=
if k_1 < 2 then 0
else
if k_1 - 2 = 0 then 1
else
if k_1 - 2 = 1 then 1
else
have k := (k_1 - 2) / 2;
if (k_1 - 2) % 2 = 1 then a k
else
have aPrev := if k < 2 then 0 else a (k - 2);
a k + aPrev;
(if k_1 = 0 then 1
else
if k_1 = 1 then 1
else
have k := k_1 / 2;
if k_1 % 2 = 1 then a k
else
have aPrev := if k < 2 then 0 else a (k - 2);
a k + aPrev) +
aPrev;
(if k = 0 then 1
else
if k = 1 then 1
else
have k_1 := k / 2;
if k % 2 = 1 then
if k_1 = 0 then 1
else
if k_1 = 1 then 1
else
have k := k_1 / 2;
if k_1 % 2 = 1 then a k
else
have aPrev := if k < 2 then 0 else a (k - 2);
a k + aPrev
else
have aPrev :=
if k_1 < 2 then 0
else
if k_1 - 2 = 0 then 1
else
if k_1 - 2 = 1 then 1
else
have k := (k_1 - 2) / 2;
if (k_1 - 2) % 2 = 1 then a k
else
have aPrev := if k < 2 then 0 else a (k - 2);
a k + aPrev;
(if k_1 = 0 then 1
else
if k_1 = 1 then 1
else
have k := k_1 / 2;
if k_1 % 2 = 1 then a k
else
have aPrev := if k < 2 then 0 else a (k - 2);
a k + aPrev) +
aPrev) +
aPrev) =
2; ⊢ (if 4 = 0 then 1
else
if 4 = 1 then 1
else
have k := 4 / 2;
if 4 % 2 = 1 then
if k = 0 then 1
else
if k = 1 then 1
else
have k_1 := k / 2;
if k % 2 = 1 then
if k_1 = 0 then 1
else
if k_1 = 1 then 1
else
have k := k_1 / 2;
if k_1 % 2 = 1 then
if k = 0 then 1
else
if k = 1 then 1
else
have k_2 := k / 2;
if k % 2 = 1 then a k_2
else
have aPrev := if k_2 < 2 then 0 else a (k_2 - 2);
a k_2 + aPrev
else
have aPrev :=
if k < 2 then 0
else
if k - 2 = 0 then 1
else
if k - 2 = 1 then 1
else
have k_2 := (k - 2) / 2;
if (k - 2) % 2 = 1 then a k_2
else
have aPrev := if k_2 < 2 then 0 else a (k_2 - 2);
a k_2 + aPrev;
(if k = 0 then 1
else
if k = 1 then 1
else
have k_2 := k / 2;
if k % 2 = 1 then a k_2
else
have aPrev := if k_2 < 2 then 0 else a (k_2 - 2);
a k_2 + aPrev) +
aPrev
else
have aPrev :=
if k_1 < 2 then 0
else
if k_1 - 2 = 0 then 1
else
if k_1 - 2 = 1 then 1
else
have k := (k_1 - 2) / 2;
if (k_1 - 2) % 2 = 1 then
if k = 0 then 1
else
if k = 1 then 1
else
have k_2 := k / 2;
if k % 2 = 1 then a k_2
else
have aPrev := if k_2 < 2 then 0 else a (k_2 - 2);
a k_2 + aPrev
else
have aPrev :=
if k < 2 then 0
else
if k - 2 = 0 then 1
else
if k - 2 = 1 then 1
else
have k_2 := (k - 2) / 2;
if (k - 2) % 2 = 1 then a k_2
else
have aPrev := if k_2 < 2 then 0 else a (k_2 - 2);
a k_2 + aPrev;
(if k = 0 then 1
else
if k = 1 then 1
else
have k_2 := k / 2;
if k % 2 = 1 then a k_2
else
have aPrev := if k_2 < 2 then 0 else a (k_2 - 2);
a k_2 + aPrev) +
aPrev;
(if k_1 = 0 then 1
else
if k_1 = 1 then 1
else
have k := k_1 / 2;
if k_1 % 2 = 1 then
if k = 0 then 1
else
if k = 1 then 1
else
have k_2 := k / 2;
if k % 2 = 1 then a k_2
else
have aPrev := if k_2 < 2 then 0 else a (k_2 - 2);
a k_2 + aPrev
else
have aPrev :=
if k < 2 then 0
else
if k - 2 = 0 then 1
else
if k - 2 = 1 then 1
else
have k_2 := (k - 2) / 2;
if (k - 2) % 2 = 1 then a k_2
else
have aPrev := if k_2 < 2 then 0 else a (k_2 - 2);
a k_2 + aPrev;
(if k = 0 then 1
else
if k = 1 then 1
else
have k_2 := k / 2;
if k % 2 = 1 then a k_2
else
have aPrev := if k_2 < 2 then 0 else a (k_2 - 2);
a k_2 + aPrev) +
aPrev) +
aPrev
else
have aPrev :=
if k < 2 then 0
else
if k - 2 = 0 then 1
else
if k - 2 = 1 then 1
else
have k_1 := (k - 2) / 2;
if (k - 2) % 2 = 1 then
if k_1 = 0 then 1
else
if k_1 = 1 then 1
else
have k := k_1 / 2;
if k_1 % 2 = 1 then
if k = 0 then 1
else
if k = 1 then 1
else
have k_2 := k / 2;
if k % 2 = 1 then a k_2
else
have aPrev := if k_2 < 2 then 0 else a (k_2 - 2);
a k_2 + aPrev
else
have aPrev :=
if k < 2 then 0
else
if k - 2 = 0 then 1
else
if k - 2 = 1 then 1
else
have k_2 := (k - 2) / 2;
if (k - 2) % 2 = 1 then a k_2
else
have aPrev := if k_2 < 2 then 0 else a (k_2 - 2);
a k_2 + aPrev;
(if k = 0 then 1
else
if k = 1 then 1
else
have k_2 := k / 2;
if k % 2 = 1 then a k_2
else
have aPrev := if k_2 < 2 then 0 else a (k_2 - 2);
a k_2 + aPrev) +
aPrev
else
have aPrev :=
if k_1 < 2 then 0
else
if k_1 - 2 = 0 then 1
else
if k_1 - 2 = 1 then 1
else
have k := (k_1 - 2) / 2;
if (k_1 - 2) % 2 = 1 then
if k = 0 then 1
else
if k = 1 then 1
else
have k_2 := k / 2;
if k % 2 = 1 then a k_2
else
have aPrev := if k_2 < 2 then 0 else a (k_2 - 2);
a k_2 + aPrev
else
have aPrev :=
if k < 2 then 0
else
if k - 2 = 0 then 1
else
if k - 2 = 1 then 1
else
have k_2 := (k - 2) / 2;
if (k - 2) % 2 = 1 then a k_2
else
have aPrev := if k_2 < 2 then 0 else a (k_2 - 2);
a k_2 + aPrev;
(if k = 0 then 1
else
if k = 1 then 1
else
have k_2 := k / 2;
if k % 2 = 1 then a k_2
else
have aPrev := if k_2 < 2 then 0 else a (k_2 - 2);
a k_2 + aPrev) +
aPrev;
(if k_1 = 0 then 1
else
if k_1 = 1 then 1
else
have k := k_1 / 2;
if k_1 % 2 = 1 then
if k = 0 then 1
else
if k = 1 then 1
else
have k_2 := k / 2;
if k % 2 = 1 then a k_2
else
have aPrev := if k_2 < 2 then 0 else a (k_2 - 2);
a k_2 + aPrev
else
have aPrev :=
if k < 2 then 0
else
if k - 2 = 0 then 1
else
if k - 2 = 1 then 1
else
have k_2 := (k - 2) / 2;
if (k - 2) % 2 = 1 then a k_2
else
have aPrev := if k_2 < 2 then 0 else a (k_2 - 2);
a k_2 + aPrev;
(if k = 0 then 1
else
if k = 1 then 1
else
have k_2 := k / 2;
if k % 2 = 1 then a k_2
else
have aPrev := if k_2 < 2 then 0 else a (k_2 - 2);
a k_2 + aPrev) +
aPrev) +
aPrev;
(if k = 0 then 1
else
if k = 1 then 1
else
have k_1 := k / 2;
if k % 2 = 1 then
if k_1 = 0 then 1
else
if k_1 = 1 then 1
else
have k := k_1 / 2;
if k_1 % 2 = 1 then
if k = 0 then 1
else
if k = 1 then 1
else
have k_2 := k / 2;
if k % 2 = 1 then a k_2
else
have aPrev := if k_2 < 2 then 0 else a (k_2 - 2);
a k_2 + aPrev
else
have aPrev :=
if k < 2 then 0
else
if k - 2 = 0 then 1
else
if k - 2 = 1 then 1
else
have k_2 := (k - 2) / 2;
if (k - 2) % 2 = 1 then a k_2
else
have aPrev := if k_2 < 2 then 0 else a (k_2 - 2);
a k_2 + aPrev;
(if k = 0 then 1
else
if k = 1 then 1
else
have k_2 := k / 2;
if k % 2 = 1 then a k_2
else
have aPrev := if k_2 < 2 then 0 else a (k_2 - 2);
a k_2 + aPrev) +
aPrev
else
have aPrev :=
if k_1 < 2 then 0
else
if k_1 - 2 = 0 then 1
else
if k_1 - 2 = 1 then 1
else
have k := (k_1 - 2) / 2;
if (k_1 - 2) % 2 = 1 then
if k = 0 then 1
else
if k = 1 then 1
else
have k_2 := k / 2;
if k % 2 = 1 then a k_2
else
have aPrev := if k_2 < 2 then 0 else a (k_2 - 2);
a k_2 + aPrev
else
have aPrev :=
if k < 2 then 0
else
if k - 2 = 0 then 1
else
if k - 2 = 1 then 1
else
have k_2 := (k - 2) / 2;
if (k - 2) % 2 = 1 then a k_2
else
have aPrev := if k_2 < 2 then 0 else a (k_2 - 2);
a k_2 + aPrev;
(if k = 0 then 1
else
if k = 1 then 1
else
have k_2 := k / 2;
if k % 2 = 1 then a k_2
else
have aPrev := if k_2 < 2 then 0 else a (k_2 - 2);
a k_2 + aPrev) +
aPrev;
(if k_1 = 0 then 1
else
if k_1 = 1 then 1
else
have k := k_1 / 2;
if k_1 % 2 = 1 then
if k = 0 then 1
else
if k = 1 then 1
else
have k_2 := k / 2;
if k % 2 = 1 then a k_2
else
have aPrev := if k_2 < 2 then 0 else a (k_2 - 2);
a k_2 + aPrev
else
have aPrev :=
if k < 2 then 0
else
if k - 2 = 0 then 1
else
if k - 2 = 1 then 1
else
have k_2 := (k - 2) / 2;
if (k - 2) % 2 = 1 then a k_2
else
have aPrev := if k_2 < 2 then 0 else a (k_2 - 2);
a k_2 + aPrev;
(if k = 0 then 1
else
if k = 1 then 1
else
have k_2 := k / 2;
if k % 2 = 1 then a k_2
else
have aPrev := if k_2 < 2 then 0 else a (k_2 - 2);
a k_2 + aPrev) +
aPrev) +
aPrev) +
aPrev) =
2; All goals completed! 🐙Conjectures: a(2^n)=a(2^(n+1)+1)=A033638(n). This formalizes the equality a(2^n) = a(2^(n+1)+1).
@[category research solved, AMS 11,
formal_proof using lean4 at
"https://github.com/KitaKen1/oeis-a112970-formal-conjectures/blob/71ae72f443bd9bee7d958f0a19d9f9ec5ab82af5/lean/OeisA112970FC.lean#L43-L46"]
theorem conjecture1 (n : ℕ) : a (2^n) = a (2^(n + 1) + 1) := n:ℕ⊢ a (2 ^ n) = a (2 ^ (n + 1) + 1)
All goals completed! 🐙Conjectures: a(2^n-1)=a(32^n-1)=1. This formalizes the equality part a(2^n-1) = a(32^n-1).
@[category research solved, AMS 11,
formal_proof using lean4 at
"https://github.com/KitaKen1/oeis-a112970-formal-conjectures/blob/71ae72f443bd9bee7d958f0a19d9f9ec5ab82af5/lean/OeisA112970FC.lean#L56-L64"]
theorem conjecture2 (n : ℕ) : a (2^n - 1) = a (3 * 2^n - 1) := n:ℕ⊢ a (2 ^ n - 1) = a (3 * 2 ^ n - 1)
All goals completed! 🐙Conjectures: a(2^n-1)=a(3*2^n-1)=1. This formalizes the value part a(2^n-1)=1.
@[category research solved, AMS 11,
formal_proof using lean4 at
"https://github.com/KitaKen1/oeis-a112970-formal-conjectures/blob/71ae72f443bd9bee7d958f0a19d9f9ec5ab82af5/lean/OeisA112970FC.lean#L48-L54"]
theorem conjecture3 (n : ℕ) : a (2^n - 1) = 1 := n:ℕ⊢ a (2 ^ n - 1) = 1
All goals completed! 🐙end OeisA112970