Status: Proof sketch documented; no checked contextual Rocq module exists yet
Rocq target module: rocq/liblevenshtein/ContextualCompletion/Query.v
Date: 2025-01-21
Authors: Formal Verification Team
This theorem establishes that the complete() function correctly combines draft and finalized completions, returning the union of all matching terms visible from a context, with duplicates removed and drafts taking priority.
User Impact: This is the core completion correctness theorem. Without it:
Dependencies: Combines all previous theorems:
let engine = DynamicContextualCompletionEngine::new();
let global = engine.create_root_context(0);
let local = engine.create_child_context(1, global);
// Finalize "result" in global scope
engine.finalize_direct(global, "result");
// Type "res" in local scope draft
engine.insert_str(local, "res");
// Query from local context
let completions = engine.complete(local, "re", 1);
// Expected: ["res" (draft), "result" (finalized)]
// - "res" from local draft buffer ✓
// - "result" from global dictionary ✓
// - Both match query "re" with distance ≤ 1 ✓
// - No duplicates ✓
// - Draft ranks higher (appears first after sort) ✓
(* Result set - completions with their sources *)
Record Completion : Type := {
term : string;
distance : nat;
source_context : ContextId;
is_draft : bool
}.
(* Query fusion - union of draft + finalized results *)
Definition complete (tree : ContextTree) (drafts : DraftMap)
(dict : Dictionary) (ctx : ContextId) (query : string) (max_dist : nat)
: list Completion :=
let visible := visible_contexts tree ctx in
let draft_results := complete_drafts drafts visible query max_dist in
let finalized_results := complete_finalized dict visible query max_dist in
deduplicate (draft_results ++ finalized_results).
(* Deduplication - keep first occurrence (draft priority) *)
Fixpoint deduplicate (results : list Completion) : list Completion :=
match results with
| [] => []
| r :: rest => r :: deduplicate (filter (fun x => x.(term) <> r.(term)) rest)
end.
Theorem query_fusion_correctness :
forall (tree : ContextTree) (drafts : DraftMap) (dict : Dictionary)
(ctx : ContextId) (query : string) (max_dist : nat),
well_formed tree ->
valid_drafts drafts ->
valid_dictionary dict ->
let results := complete tree drafts dict ctx query max_dist in
(* Soundness: All results match query within distance *)
(forall c, In c results ->
levenshtein_distance query c.(term) <= max_dist) /\
(* Completeness: All visible matching terms returned *)
(forall term,
(visible_and_matches tree drafts dict ctx term query max_dist) ->
(exists c, In c results /\ c.(term) = term)) /\
(* No duplicates *)
(forall i j, i < j < length results ->
nth i results default_completion .(term) <>
nth j results default_completion .(term)) /\
(* Draft priority: Drafts appear before finalized for same term *)
(forall term,
(exists draft_ctx, In term (draft_terms drafts draft_ctx)) ->
(forall c, In c results /\ c.(term) = term -> c.(is_draft) = true)).
Strategy: Set theory on result sets + deduplication properties.
Main Steps:
complete_drafts and complete_finalized filter by distancededuplicate removes all but first occurrenceSource: src/contextual/engine.rs:1058-1087
pub fn complete(&self, context: ContextId, query: &str, max_distance: usize)
-> Vec<Completion> {
let mut results = Vec::new();
// Query drafts (visible contexts)
results.extend(self.complete_drafts(context, query, max_distance));
// Query finalized terms (dictionary)
results.extend(self.complete_finalized(context, query, max_distance));
// Deduplicate (draft overrides finalized)
let mut seen = HashSet::new();
results.retain(|c| seen.insert(c.term.clone()));
results.sort();
results
}
Correspondence:
visible_contexts → Theorem 1 (Context Visibility)complete_drafts → Queries all visible draft bufferscomplete_finalized → Queries dictionary with visibility filterHashSet dedup → Keeps first occurrence (drafts come first)sort() → Orders by (distance, term)Unit Tests: src/contextual/engine.rs:1800-2000 (#[cfg(test)])
#[test]
fn test_complete_fusion() {
let engine = Engine::new();
let root = engine.create_root_context(0);
engine.insert_str(root, "draft_term");
engine.finalize_direct(root, "final_term");
let results = engine.complete(root, "term", 2);
assert_eq!(results.len(), 2);
assert!(results.iter().any(|c| c.term == "draft_term" && c.is_draft));
assert!(results.iter().any(|c| c.term == "final_term" && !c.is_draft));
}
Depends on:
Required by:
Last Updated: 2025-01-21 Review trigger: Reconcile this page when a checked contextual Rocq module is added.
Can you improve this documentation?Edit on GitHub
cljdoc builds & hosts documentation for Clojure/Script libraries
| Ctrl+k | Jump to recent docs |
| ← | Move to previous article |
| → | Move to next article |
| Ctrl+/ | Jump to the search field |