@@ -1030,6 +1030,16 @@ We rcases on h_not_fresh:
10301030 which implies `exists_bad_until_j` to be true from `h_bad_after`
10311031 => `h_bad_before = true` by definition
10321032-/
1033+ private theorem fin_fun_heq_of_cast {m n : ℕ} (h : m = n)
1034+ (f : Fin m → L) (g : Fin n → L)
1035+ (hfg : ∀ i : Fin m, f i = g (Fin.cast h i)) :
1036+ HEq f g := by
1037+ subst h
1038+ apply heq_of_eq
1039+ funext i
1040+ simpa using hfg i
1041+
1042+ set_option maxHeartbeats 200000 in
10331043lemma incrementalBadEventExistsProp_fold_step_backward (i : Fin ℓ)
10341044 (stmtOStmtIn : (Statement (L := L) Context i.castSucc) × (∀ j,
10351045 OracleStatement 𝔽q β (ϑ := ϑ) (h_ℓ_add_R_rate := h_ℓ_add_R_rate) i.castSucc j))
@@ -1042,7 +1052,309 @@ lemma incrementalBadEventExistsProp_fold_step_backward (i : Fin ℓ)
10421052 incrementalBadEventExistsProp 𝔽q β i.castSucc
10431053 (OracleFrontierIndex.mkFromStmtIdx i.castSucc) stmtOStmtIn.2
10441054 stmtOStmtIn.1 .challenges := by
1045- sorry
1055+ classical
1056+ unfold incrementalBadEventExistsProp at h_bad_after ⊢
1057+ rcases h_bad_after with ⟨j, hj⟩
1058+ by_cases h_old : j.val + 1 < toOutCodewordsCount ℓ ϑ i.castSucc
1059+ · refine ⟨j, ?_⟩
1060+ have hj_copy := hj
1061+ dsimp at hj_copy ⊢
1062+ have h_k_full : j.val * ϑ + ϑ ≤ i.val := by
1063+ exact oracle_block_k_next_le_i (ℓ := ℓ) (ϑ := ϑ) (i := i.castSucc) (j := j) (hj := h_old)
1064+ have hk_after : min ϑ (i.val + 1 - j.val * ϑ) = ϑ := by
1065+ omega
1066+ have hk_before : min ϑ (i.val - j.val * ϑ) = ϑ := by
1067+ omega
1068+ let afterSlice : Fin ϑ → L := fun cId =>
1069+ Fin.snoc (α := fun _ => L) stmtOStmtIn.1 .challenges r_i'
1070+ ⟨j.val * ϑ + cId.val, by
1071+ have h_idx_lt : j.val * ϑ + cId.val < i.val := by
1072+ exact lt_of_lt_of_le (Nat.add_lt_add_left cId.isLt (j.val * ϑ)) h_k_full
1073+ exact lt_trans h_idx_lt (Nat.lt_succ_self i.val)⟩
1074+ let beforeSlice : Fin ϑ → L := fun cId =>
1075+ stmtOStmtIn.1 .challenges
1076+ ⟨j.val * ϑ + cId.val, by
1077+ exact lt_of_lt_of_le (Nat.add_lt_add_left cId.isLt (j.val * ϑ)) h_k_full⟩
1078+ have h_challenges : afterSlice = beforeSlice := by
1079+ have h_slice :=
1080+ getFoldingChallenges_init_succ_eq (r := r) (L := L) (𝓡 := 𝓡) (ϑ := ϑ)
1081+ (i := i) (j := j) (challenges := Fin.snoc stmtOStmtIn.1 .challenges r_i')
1082+ (h := h_k_full)
1083+ simp [getFoldingChallenges, afterSlice, beforeSlice] at h_slice
1084+ exact h_slice.symm
1085+ let blockStart : Fin r := ⟨j.val * ϑ, by
1086+ exact lt_r_of_lt_ℓ (h_ℓ_add_R_rate := h_ℓ_add_R_rate)
1087+ (oraclePositionToDomainIndex (ℓ := ℓ) (ϑ := ϑ) j).isLt⟩
1088+ let blockDest : Fin r := ⟨j.val * ϑ + ϑ, by
1089+ exact lt_r_of_le_ℓ (h_ℓ_add_R_rate := h_ℓ_add_R_rate)
1090+ (oracle_index_add_steps_le_ℓ ℓ ϑ (i := i.castSucc) (j := j))⟩
1091+ have hj_after_full :
1092+ incrementalFoldingBadEvent 𝔽q β
1093+ (h_ℓ_add_R_rate := h_ℓ_add_R_rate)
1094+ (block_start_idx := blockStart)
1095+ (k := ϑ)
1096+ (h_k_le := le_rfl)
1097+ (midIdx := blockDest)
1098+ (destIdx := blockDest)
1099+ (h_midIdx := rfl)
1100+ (h_destIdx := rfl)
1101+ (h_destIdx_le := oracle_index_add_steps_le_ℓ ℓ ϑ (i := i.castSucc) (j := j))
1102+ (f_block_start := stmtOStmtIn.2 j)
1103+ (r_challenges := afterSlice) := by
1104+ convert hj_copy using 1
1105+ · apply Fin.eq_of_val_eq
1106+ dsimp [blockDest]
1107+ omega
1108+ · exact hk_after.symm
1109+ · have h_afterSlice_heq :
1110+ HEq
1111+ (fun cId : Fin (min ϑ (i.val + 1 - j.val * ϑ)) =>
1112+ Fin.snoc (α := fun _ => L) stmtOStmtIn.1 .challenges r_i'
1113+ ⟨j.val * ϑ + cId.val, by
1114+ have h_cId_lt :
1115+ cId.val < i.val + 1 - j.val * ϑ := by
1116+ exact lt_of_lt_of_le cId.isLt (Nat.min_le_right ϑ _)
1117+ have h_block_le : j.val * ϑ ≤ i.val + 1 := by
1118+ omega
1119+ calc
1120+ j.val * ϑ + cId.val < j.val * ϑ + (i.val + 1 - j.val * ϑ) :=
1121+ Nat.add_lt_add_left h_cId_lt (j.val * ϑ)
1122+ _ = i.val + 1 := Nat.add_sub_of_le h_block_le⟩)
1123+ afterSlice := by
1124+ apply fin_fun_heq_of_cast hk_after
1125+ intro cId
1126+ dsimp [afterSlice]
1127+ exact HEq.symm h_afterSlice_heq
1128+ have h_bad_after_full :
1129+ foldingBadEvent 𝔽q β
1130+ (h_ℓ_add_R_rate := h_ℓ_add_R_rate)
1131+ (i := blockStart)
1132+ (destIdx := blockDest)
1133+ (steps := ϑ)
1134+ (h_destIdx := rfl)
1135+ (h_destIdx_le := oracle_index_add_steps_le_ℓ ℓ ϑ (i := i.castSucc) (j := j))
1136+ (f_i := stmtOStmtIn.2 j)
1137+ (r_challenges := afterSlice) := by
1138+ exact
1139+ (incrementalFoldingBadEvent_eq_foldingBadEvent_of_k_eq_ϑ
1140+ (𝔽q := 𝔽q) (β := β) (h_ℓ_add_R_rate := h_ℓ_add_R_rate)
1141+ (ϑ := ϑ)
1142+ (block_start_idx := blockStart)
1143+ (midIdx := blockDest)
1144+ (destIdx := blockDest)
1145+ (h_midIdx := by rfl)
1146+ (h_destIdx := rfl)
1147+ (h_destIdx_le := oracle_index_add_steps_le_ℓ ℓ ϑ (i := i.castSucc) (j := j))
1148+ (f_block_start := stmtOStmtIn.2 j)
1149+ (r_challenges := afterSlice)).1 hj_after_full
1150+ have h_bad_before_full := h_bad_after_full
1151+ rw [h_challenges] at h_bad_before_full
1152+ have hj_before_full :
1153+ incrementalFoldingBadEvent 𝔽q β
1154+ (h_ℓ_add_R_rate := h_ℓ_add_R_rate)
1155+ (block_start_idx := blockStart)
1156+ (k := ϑ)
1157+ (h_k_le := le_rfl)
1158+ (midIdx := blockDest)
1159+ (destIdx := blockDest)
1160+ (h_midIdx := rfl)
1161+ (h_destIdx := rfl)
1162+ (h_destIdx_le := oracle_index_add_steps_le_ℓ ℓ ϑ (i := i.castSucc) (j := j))
1163+ (f_block_start := stmtOStmtIn.2 j)
1164+ (r_challenges := beforeSlice) := by
1165+ exact
1166+ (incrementalFoldingBadEvent_eq_foldingBadEvent_of_k_eq_ϑ
1167+ (𝔽q := 𝔽q) (β := β) (h_ℓ_add_R_rate := h_ℓ_add_R_rate)
1168+ (ϑ := ϑ)
1169+ (block_start_idx := blockStart)
1170+ (midIdx := blockDest)
1171+ (destIdx := blockDest)
1172+ (h_midIdx := by rfl)
1173+ (h_destIdx := rfl)
1174+ (h_destIdx_le := oracle_index_add_steps_le_ℓ ℓ ϑ (i := i.castSucc) (j := j))
1175+ (f_block_start := stmtOStmtIn.2 j)
1176+ (r_challenges := beforeSlice)).2 h_bad_before_full
1177+ convert hj_before_full using 1
1178+ · apply Fin.eq_of_val_eq
1179+ dsimp [blockDest]
1180+ omega
1181+ · have h_beforeSlice_heq :
1182+ HEq
1183+ (fun cId : Fin (min ϑ (i.val - j.val * ϑ)) =>
1184+ stmtOStmtIn.1 .challenges
1185+ ⟨j.val * ϑ + cId.val, by
1186+ have h_cId_lt :
1187+ cId.val < i.val - j.val * ϑ := by
1188+ exact lt_of_lt_of_le cId.isLt (Nat.min_le_right ϑ _)
1189+ have h_block_le : j.val * ϑ ≤ i.val := by
1190+ exact le_trans (by omega) h_k_full
1191+ calc
1192+ j.val * ϑ + cId.val < j.val * ϑ + (i.val - j.val * ϑ) :=
1193+ Nat.add_lt_add_left h_cId_lt (j.val * ϑ)
1194+ _ = i.val := Nat.add_sub_of_le h_block_le⟩)
1195+ beforeSlice := by
1196+ apply fin_fun_heq_of_cast hk_before
1197+ intro cId
1198+ dsimp [beforeSlice]
1199+ exact h_beforeSlice_heq
1200+ · refine ⟨j, ?_⟩
1201+ have hj_copy := hj
1202+ dsimp at hj_copy ⊢
1203+ have h_j_last : j = getLastOraclePositionIndex ℓ ϑ i.castSucc := by
1204+ apply Fin.eq_of_val_eq
1205+ have hj_lt : j.val < toOutCodewordsCount ℓ ϑ i.castSucc := by
1206+ have hj_lt' := j.isLt
1207+ simp only [OracleFrontierIndex.val_mkFromStmtIdxCastSuccOfSucc, Fin.val_castSucc] at hj_lt'
1208+ exact hj_lt'
1209+ have h_val : j.val = toOutCodewordsCount ℓ ϑ i.castSucc - 1 := by
1210+ have h_ge : toOutCodewordsCount ℓ ϑ i.castSucc ≤ j.val + 1 := by
1211+ omega
1212+ omega
1213+ dsimp [getLastOraclePositionIndex]
1214+ exact h_val
1215+ subst j
1216+ dsimp [foldStepFreshDoomPreservationEvent] at h_not_fresh
1217+ have h_j_val : (getLastOraclePositionIndex ℓ ϑ i.castSucc).val = i.val / ϑ := by
1218+ dsimp only [getLastOraclePositionIndex]
1219+ unfold toOutCodewordsCount
1220+ simp only [Fin.val_castSucc, i.isLt, ↓reduceIte, add_tsub_cancel_right]
1221+ have h_diff_lt :
1222+ i.val - (getLastOraclePositionIndex ℓ ϑ i.castSucc).val * ϑ < ϑ := by
1223+ rw [h_j_val, Nat.mul_comm, ← Nat.mod_eq_sub_mul_div]
1224+ exact Nat.mod_lt i.val (Nat.pos_of_neZero ϑ)
1225+ have h_diff_eq :
1226+ i.val - (getLastOraclePositionIndex ℓ ϑ i.castSucc).val * ϑ = i.val % ϑ := by
1227+ rw [h_j_val, Nat.mul_comm, ← Nat.mod_eq_sub_mul_div]
1228+ have h_last_le :
1229+ (getLastOraclePositionIndex ℓ ϑ i.castSucc).val * ϑ ≤ i.val := by
1230+ rw [h_j_val, Nat.mul_comm]
1231+ have h_div := Nat.div_mul_le_self i.val ϑ
1232+ rw [Nat.mul_comm] at h_div
1233+ exact h_div
1234+ have hk_after_last :
1235+ min ϑ (i.val + 1 - (getLastOraclePositionIndex ℓ ϑ i.castSucc).val * ϑ) =
1236+ min ϑ (i.val - (getLastOraclePositionIndex ℓ ϑ i.castSucc).val * ϑ) + 1 := by
1237+ rw [show i.val + 1 - (getLastOraclePositionIndex ℓ ϑ i.castSucc).val * ϑ =
1238+ (i.val - (getLastOraclePositionIndex ℓ ϑ i.castSucc).val * ϑ) + 1 by
1239+ omega]
1240+ rw [h_diff_eq]
1241+ have h_mod_lt : i.val % ϑ < ϑ := by
1242+ exact Nat.mod_lt i.val (Nat.pos_of_neZero ϑ)
1243+ omega
1244+ let kBefore : ℕ := min ϑ (i.val - (getLastOraclePositionIndex ℓ ϑ i.castSucc).val * ϑ)
1245+ let prefixSlice : Fin kBefore → L := fun cId =>
1246+ stmtOStmtIn.1 .challenges
1247+ ⟨(getLastOraclePositionIndex ℓ ϑ i.castSucc).val * ϑ + cId.val, by
1248+ have h_min_le :
1249+ kBefore ≤ i.val - (getLastOraclePositionIndex ℓ ϑ i.castSucc).val * ϑ := by
1250+ dsimp [kBefore]
1251+ exact Nat.min_le_right ϑ _
1252+ have h_cId_lt :
1253+ cId.val < i.val - (getLastOraclePositionIndex ℓ ϑ i.castSucc).val * ϑ := by
1254+ exact lt_of_lt_of_le cId.isLt h_min_le
1255+ have h_idx_lt :
1256+ (getLastOraclePositionIndex ℓ ϑ i.castSucc).val * ϑ + cId.val < i.val := by
1257+ omega
1258+ exact h_idx_lt⟩
1259+ let afterSlice : Fin (kBefore + 1 ) → L := fun cId =>
1260+ Fin.snoc (α := fun _ => L) stmtOStmtIn.1 .challenges r_i'
1261+ ⟨(getLastOraclePositionIndex ℓ ϑ i.castSucc).val * ϑ + cId.val, by
1262+ have h_cId_le : cId.val ≤ kBefore := by
1263+ exact Nat.lt_succ_iff.mp cId.isLt
1264+ have h_idx_le :
1265+ (getLastOraclePositionIndex ℓ ϑ i.castSucc).val * ϑ + cId.val ≤ i.val := by
1266+ dsimp [kBefore] at h_cId_le
1267+ have h_min_le :
1268+ min ϑ (i.val - (getLastOraclePositionIndex ℓ ϑ i.castSucc).val * ϑ) ≤
1269+ i.val - (getLastOraclePositionIndex ℓ ϑ i.castSucc).val * ϑ :=
1270+ Nat.min_le_right ϑ _
1271+ omega
1272+ exact lt_of_le_of_lt h_idx_le (Nat.lt_succ_self i.val)⟩
1273+ let freshSlice : Fin (kBefore + 1 ) → L := Fin.snoc (α := fun _ => L) prefixSlice r_i'
1274+ have h_after_challenges : afterSlice = freshSlice := by
1275+ funext cId
1276+ by_cases h_lt : cId.val < kBefore
1277+ · have h_idx_lt :
1278+ (getLastOraclePositionIndex ℓ ϑ i.castSucc).val * ϑ + cId.val < i.val := by
1279+ dsimp [kBefore] at h_lt
1280+ omega
1281+ simp [afterSlice, freshSlice, prefixSlice, Fin.snoc, h_lt, h_idx_lt, h_idx_lt.ne]
1282+ · have h_eq_last :
1283+ cId.val = kBefore := by
1284+ omega
1285+ have h_idx_eq :
1286+ (getLastOraclePositionIndex ℓ ϑ i.castSucc).val * ϑ + cId.val = i.val := by
1287+ rw [h_eq_last]
1288+ dsimp [kBefore]
1289+ omega
1290+ have h_not_idx_lt :
1291+ ¬ (getLastOraclePositionIndex ℓ ϑ i.castSucc).val * ϑ + cId.val < i.val := by
1292+ omega
1293+ simp [afterSlice, freshSlice, prefixSlice, Fin.snoc, h_lt, h_idx_eq, h_not_idx_lt]
1294+ let blockStart : Fin r := ⟨(getLastOraclePositionIndex ℓ ϑ i.castSucc).val * ϑ, by
1295+ exact lt_r_of_le_ℓ (h_ℓ_add_R_rate := h_ℓ_add_R_rate)
1296+ (Nat.le_of_lt (lt_of_le_of_lt h_last_le i.isLt))⟩
1297+ let blockMidAfter : Fin r :=
1298+ ⟨(getLastOraclePositionIndex ℓ ϑ i.castSucc).val * ϑ + (kBefore + 1 ), by
1299+ apply lt_r_of_le_ℓ (h_ℓ_add_R_rate := h_ℓ_add_R_rate)
1300+ dsimp [kBefore]
1301+ omega⟩
1302+ let blockDest : Fin r := ⟨(getLastOraclePositionIndex ℓ ϑ i.castSucc).val * ϑ + ϑ, by
1303+ exact lt_r_of_le_ℓ (h_ℓ_add_R_rate := h_ℓ_add_R_rate)
1304+ (oracle_index_add_steps_le_ℓ ℓ ϑ (i := i.castSucc)
1305+ (j := getLastOraclePositionIndex ℓ ϑ i.castSucc))⟩
1306+ have h_after_last_afterSlice :
1307+ incrementalFoldingBadEvent 𝔽q β
1308+ (h_ℓ_add_R_rate := h_ℓ_add_R_rate)
1309+ (block_start_idx := blockStart)
1310+ (k := kBefore + 1 )
1311+ (h_k_le := by
1312+ dsimp [kBefore]
1313+ omega)
1314+ (midIdx := blockMidAfter)
1315+ (destIdx := blockDest)
1316+ (h_midIdx := rfl)
1317+ (h_destIdx := rfl)
1318+ (h_destIdx_le := oracle_index_add_steps_le_ℓ ℓ ϑ (i := i.castSucc)
1319+ (j := getLastOraclePositionIndex ℓ ϑ i.castSucc))
1320+ (f_block_start := stmtOStmtIn.2 (getLastOraclePositionIndex ℓ ϑ i.castSucc))
1321+ (r_challenges := afterSlice) := by
1322+ convert hj_copy using 1
1323+ · apply Fin.eq_of_val_eq
1324+ dsimp [blockStart, blockMidAfter, kBefore]
1325+ omega
1326+ · dsimp [kBefore]
1327+ omega
1328+ · have h_afterSlice_heq :
1329+ HEq
1330+ (fun cId : Fin
1331+ (min ϑ (i.val + 1 - (getLastOraclePositionIndex ℓ ϑ i.castSucc).val * ϑ)) =>
1332+ Fin.snoc (α := fun _ => L) stmtOStmtIn.1 .challenges r_i'
1333+ ⟨(getLastOraclePositionIndex ℓ ϑ i.castSucc).val * ϑ + cId.val, by
1334+ have h_cId_lt :
1335+ cId.val <
1336+ i.val + 1 -
1337+ (getLastOraclePositionIndex ℓ ϑ i.castSucc).val * ϑ := by
1338+ exact lt_of_lt_of_le cId.isLt (Nat.min_le_right ϑ _)
1339+ have h_block_le :
1340+ (getLastOraclePositionIndex ℓ ϑ i.castSucc).val * ϑ ≤ i.val + 1 := by
1341+ omega
1342+ calc
1343+ (getLastOraclePositionIndex ℓ ϑ i.castSucc).val * ϑ + cId.val <
1344+ (getLastOraclePositionIndex ℓ ϑ i.castSucc).val * ϑ +
1345+ (i.val + 1 -
1346+ (getLastOraclePositionIndex ℓ ϑ i.castSucc).val * ϑ) :=
1347+ Nat.add_lt_add_left h_cId_lt _
1348+ _ = i.val + 1 := Nat.add_sub_of_le h_block_le⟩)
1349+ afterSlice := by
1350+ apply fin_fun_heq_of_cast hk_after_last
1351+ intro cId
1352+ dsimp [afterSlice]
1353+ exact HEq.symm h_afterSlice_heq
1354+ have h_after_last' := h_after_last_afterSlice
1355+ rw [h_after_challenges] at h_after_last'
1356+ by_contra h_before_false
1357+ exact h_not_fresh ⟨h_before_false, h_after_last'⟩
10461358lemma foldStep_rbrExtractionFailureEvent_imply_sumcheck_or_badEvent (i : Fin ℓ)
10471359 (stmtOStmtIn : (Statement (L := L) Context i.castSucc) × (∀ j,
10481360 OracleStatement 𝔽q β (ϑ := ϑ) (h_ℓ_add_R_rate := h_ℓ_add_R_rate) i.castSucc j))
0 commit comments