@@ -278,15 +278,6 @@ let blacken_preserves_pred_dist_ok
278278 PREDICATE LEMMAS — Key reasoning steps for BFS proof
279279 ================================================================ *)
280280
281- (* Discovering (WHITE->GRAY) preserves source_ok *)
282- let discover_preserves_source_ok
283- ( scolor sdist : Seq. seq int) ( source n j : nat) ( dval : int)
284- : Lemma
285- ( requires source_ok scolor sdist source n /\ j < n /\ n <= Seq. length scolor /\
286- n <= Seq. length sdist /\ Seq. index scolor j == 0 /\ dval >= 0 )
287- ( ensures source_ok ( Seq. upd scolor j 1 ) ( Seq. upd sdist j dval ) source n )
288- = () // source != j (source is non-WHITE, j is WHITE)
289-
290281(* Blackening preserves source_ok *)
291282let blacken_preserves_source_ok
292283 ( scolor sdist : Seq. seq int) ( source n u : nat)
@@ -295,15 +286,6 @@ let blacken_preserves_source_ok
295286 ( ensures source_ok ( Seq. upd scolor u 2 ) sdist source n )
296287 = () // Either u == source (2 <> 0) or u != source (unchanged)
297288
298- (* Discovering preserves dist_ok *)
299- let discover_preserves_dist_ok
300- ( scolor sdist : Seq. seq int) ( n j : nat) ( dval : int)
301- : Lemma
302- ( requires dist_ok scolor sdist n /\ j < n /\ n <= Seq. length scolor /\
303- n <= Seq. length sdist /\ Seq. index scolor j == 0 /\ dval >= 0 )
304- ( ensures dist_ok ( Seq. upd scolor j 1 ) ( Seq. upd sdist j dval ) n )
305- = () // old non-WHITE: unchanged; j: new color 1, dist dval >= 0
306-
307289(* Discovering vertex j from u preserves dist_reachable.
308290 Precondition: u is discovered (color[u] <> 0) with dist[u] = du,
309291 edge (u, j) exists, j is WHITE, and we set dist[j] = du + 1.
@@ -347,15 +329,6 @@ let blacken_preserves_dist_ok
347329 ( ensures dist_ok ( Seq. upd scolor u 2 ) sdist n )
348330 = () // For w != u: unchanged. For w == u: was non-WHITE so dist >= 0, still >= 0.
349331
350- (* Discovering preserves queue_ok for existing entries *)
351- let discover_preserves_queue_ok
352- ( scolor : Seq. seq int) ( squeue : Seq. seq SZ. t ) ( n head tail j : nat)
353- : Lemma
354- ( requires queue_ok scolor squeue n head tail /\ j < n /\ n <= Seq. length scolor /\
355- Seq. index scolor j == 0 )
356- ( ensures queue_ok ( Seq. upd scolor j 1 ) squeue n head tail )
357- = () // Queue entries are non-WHITE, j is WHITE, so j != any queue entry. Colors unchanged.
358-
359332(* Blackening preserves queue_ok when u is not in queue range *)
360333let blacken_preserves_queue_ok
361334 ( scolor : Seq. seq int) ( squeue : Seq. seq SZ. t ) ( n head tail u : nat)
@@ -379,22 +352,6 @@ let frame_preserves_source_ok
379352 ( ensures source_ok scolor' sdist' source n )
380353 = ()
381354
382- (* Frame preserves dist_ok when only WHITE->non-WHITE changes with non-negative dist *)
383- let frame_preserves_dist_ok
384- ( scolor scolor' sdist sdist' : Seq. seq int) ( n : nat)
385- : Lemma
386- ( requires
387- dist_ok scolor sdist n /\
388- Seq. length scolor' >= n /\ Seq. length sdist' >= n /\
389- // Frame: old non-WHITE unchanged
390- ( forall ( w :nat). w < n /\ Seq. index scolor w <> 0 ==>
391- Seq. index scolor' w == Seq. index scolor w /\ Seq. index sdist' w == Seq. index sdist w ) /\
392- // New non-WHITE vertices have non-negative dist
393- ( forall ( w :nat). w < n /\ Seq. index scolor w == 0 /\ Seq. index scolor' w <> 0 ==>
394- Seq. index sdist' w >= 0 ))
395- ( ensures dist_ok scolor' sdist' n )
396- = ()
397-
398355(* Proving queue_ok after discovering a WHITE vertex.
399356 Uses exact Seq.upd terms so Z3 can chain:
400357 - Seq.upd axiom fires on conclusion → introduces Seq.index squeue i
@@ -458,16 +415,6 @@ let blacken_preserves_scanned_all (sadj scolor: Seq.seq int) (n u: nat)
458415 ( ensures scanned_all sadj n ( Seq. upd scolor u 2 ))
459416 = ()
460417
461- let init_scanned_partial ( sadj scolor : Seq. seq int) ( n u : nat)
462- : Lemma ( requires n <= Seq. length scolor /\ n * n <= Seq. length sadj /\ u < n )
463- ( ensures scanned_partial sadj n scolor u 0 )
464- = ()
465-
466- let discover_preserves_scanned_partial ( sadj scolor : Seq. seq int) ( n u k j : nat)
467- : Lemma ( requires scanned_partial sadj n scolor u k /\ j < n /\ Seq. index scolor j == 0 )
468- ( ensures scanned_partial sadj n ( Seq. upd scolor j 1 ) u k )
469- = ()
470-
471418let extend_scanned_partial_discover ( sadj scolor : Seq. seq int) ( n u vv : nat)
472419 : Lemma
473420 ( requires scanned_partial sadj n scolor u vv /\ vv < n /\ u < n /\
@@ -483,12 +430,6 @@ let extend_scanned_partial_skip (sadj scolor: Seq.seq int) (n u vv: nat)
483430 ( ensures scanned_partial sadj n scolor u ( vv + 1 ))
484431 = ()
485432
486- let blacken_preserves_scanned_partial ( sadj scolor : Seq. seq int) ( n u k : nat)
487- : Lemma ( requires scanned_partial sadj n scolor u k /\ u < n /\ n <= Seq. length scolor /\
488- Seq. index scolor u <> 0 )
489- ( ensures scanned_partial sadj n ( Seq. upd scolor u 2 ) u k )
490- = ()
491-
492433(* ================================================================
493434 COMPLETENESS LEMMA — induction on reachability steps
494435 ================================================================ *)
@@ -675,24 +616,6 @@ let init_dist_optimal (adj: Seq.seq int) (n: nat) (scolor_zeros sdist_zeros: Seq
675616 dist_optimal adj n ( Seq. upd scolor_zeros source 1 ) ( Seq. upd sdist_zeros source 0 ) source )
676617 = () // Only source is non-WHITE (color 1) with dist 0. 0 <= k for any nat k.
677618
678- let init_layer_complete ( adj : Seq. seq int) ( n : nat) ( scolor : Seq. seq int) ( source : nat)
679- : Lemma
680- ( requires source < n /\ n <= Seq. length scolor /\ Seq. length adj >= n * n )
681- ( ensures layer_complete adj n scolor source 0 )
682- = () // Vacuously true: no k < 0.
683-
684- let init_queue_dist_min ( sdist : Seq. seq int) ( squeue : Seq. seq SZ. t ) ( n head tail : nat) ( d : int)
685- : Lemma
686- ( requires
687- n >= 1 /\ Seq. length sdist >= n /\ Seq. length squeue >= n /\
688- head <= tail /\ tail <= n /\ d <= 0 /\
689- ( forall ( i : nat). {:pattern ( Seq. index squeue i )}
690- i >= head /\ i < tail ==>
691- SZ. v ( Seq. index squeue i ) < n /\
692- Seq. index sdist ( SZ. v ( Seq. index squeue i )) >= 0 ))
693- ( ensures queue_dist_min sdist squeue n head tail d )
694- = ()
695-
696619let init_queue_nondecreasing ( sdist : Seq. seq int) ( squeue : Seq. seq SZ. t ) ( n : nat) ( source : SZ. t )
697620 : Lemma
698621 ( requires
@@ -819,27 +742,6 @@ let blacken_preserves_dist_optimal
819742 dist_optimal adj n ( Seq. upd scolor u 2 ) sdist source )
820743 = () // Blackening only changes color (not dist). Non-WHITE stays non-WHITE.
821744
822- let blacken_preserves_layer_complete
823- ( adj : Seq. seq int) ( n : nat) ( scolor : Seq. seq int) ( source d u : nat)
824- : Lemma
825- ( requires
826- layer_complete adj n scolor source d /\
827- u < n /\ Seq. index scolor u <> 0 /\
828- Seq. length scolor >= n )
829- ( ensures
830- layer_complete adj n ( Seq. upd scolor u 2 ) source d )
831- = () // Blackening u: was non-WHITE → now color 2 (≠0, ≠1). Only strengthens layer_complete.
832-
833- let blacken_preserves_queue_dist_min
834- ( sdist : Seq. seq int) ( squeue : Seq. seq SZ. t ) ( n head tail u : nat) ( d : int)
835- : Lemma
836- ( requires
837- queue_dist_min sdist squeue n head tail d /\
838- u < n )
839- ( ensures
840- queue_dist_min sdist squeue n head tail d )
841- = () // Blackening doesn't change dist or queue.
842-
843745(* --- Queue ordering preservation lemmas --- *)
844746
845747let discover_preserves_queue_nondecreasing
@@ -882,13 +784,6 @@ let blacken_preserves_queue_nondecreasing
882784 ( ensures queue_nondecreasing sdist squeue n head tail )
883785 = ()
884786
885- let blacken_preserves_queue_dist_ub
886- ( sdist : Seq. seq int) ( squeue : Seq. seq SZ. t ) ( n head tail u : nat) ( d_ub : int)
887- : Lemma
888- ( requires queue_dist_ub sdist squeue n head tail d_ub /\ u < n )
889- ( ensures queue_dist_ub sdist squeue n head tail d_ub )
890- = ()
891-
892787(* Derive queue_dist_min from queue_nondecreasing: if queue is non-decreasing and
893788 front has dist d, then all entries have dist >= d.
894789 This is a transitivity argument: dist[queue[head]] <= dist[queue[i]] for all i >= head. *)
0 commit comments