Skip to content

Commit 1d535d3

Browse files
prove 5 more sorrys
1 parent 6965c35 commit 1d535d3

3 files changed

Lines changed: 553 additions & 63 deletions

File tree

ArkLib/OracleReduction/Security/RoundByRound.lean

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -562,10 +562,9 @@ def Verifier.StateFunction.id {lang : Set Statement} :
562562
rw [simulateQ_pure]
563563
change Prod.fst <$> (pure (some stmt) : StateT σ ProbComp _).run s = _
564564
rw [StateT.run_pure]; simp [map_pure]
565-
rw [key] at hx_run
566-
simp only [support_pure, Set.mem_singleton_iff, Option.some.injEq] at hx_run
567-
subst hx_run
568-
exact h
565+
rw [key] at hx
566+
simp only [support_pure, Set.mem_singleton_iff] at hx
567+
cases hx; exact h
569568

570569
/-- The identity / trivial verifier is perfectly round-by-round sound. -/
571570
@[simp]
@@ -603,10 +602,10 @@ def Verifier.KnowledgeStateFunction.id {rel : Set (Statement × Witness)} :
603602
rw [simulateQ_pure]
604603
change Prod.fst <$> (pure (some stmtIn) : StateT σ ProbComp _).run s = _
605604
rw [StateT.run_pure]; simp [map_pure]
606-
rw [key] at hx_run
607-
simp only [support_pure, Set.mem_singleton_iff, Option.some.injEq] at hx_run
608-
subst hx_run
609-
simpa [Extractor.RoundByRound.id] using hrel
605+
rw [key] at hx
606+
simp only [support_pure, Set.mem_singleton_iff] at hx
607+
cases (Option.some.inj hx)
608+
exact hrel
610609

611610
/-- The identity / trivial verifier is perfectly round-by-round knowledge sound. -/
612611
@[simp]

ArkLib/ProofSystem/Binius/BinaryBasefold/Steps.lean

Lines changed: 313 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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
10331043
lemma 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'⟩
10461358
lemma 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

Comments
 (0)