All-path reachability proof checker
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 5/5
- Thời gian dự kiến
- Hơn một tuần
- Mức phù hợp với người mới
- 30/100
Hướng nghiên cứu
Start by locating the pyk APRProofChecker entry point and the Haskell backend RPC surface for guided_execute, then inspect the existing implies, get_model, and simplify RPCs. Done means the checker validates edges, splits, covers, and leaves, returns the specified status, remainders, and undecided obligations, and demonstrates the stated speed goal against the prover.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
check(APRProof) → (ProofStatus, APRProof, [remainder], [undecided_obligation]).
The prover is slow because at every step it searches for applicable rules and calls SMT to decide which branches are feasible; re-establishing a proof (after a semantics change, or to trust one from elsewhere) re-pays all of it, though the finished proof already records which rules fire and where it branches.
The Checker instead treats the KCFG as a certificate and validates every element by its kind: edges are re-applied by the Haskell backend (force-apply the recorded rules, no search), splits and covers are discharged by SMT in pyk.
Because the fired rule is known, there is no rule-search SMT and the taken branch is feasible by its concrete witness; only the irreducible SMT remains — split coverage (parent ∧ ¬⋁cᵢ UNSAT) and cover subsumption (implies) — and even that moves off the critical path, since the rule sequence is fixed: rewrite streams ahead while SMT runs concurrently.
All soundness lives here.
Goal. ≥~2× faster than the prover, or reusing a proof / adding concolic execution is not worth it — measured once a first
APRProofCheckerexists, not before.
What is checked, and how
- Edge
source --[τ]--> target, a rule sequenceτ = [r₁, …, rₙ]— Haskell backend.
guided_executeforce-appliesτtosourceand returns the resulting end statetarget'; it is agnostic to any previously recorded target.
If a step branches beforeτis exhausted, the edge hides an uncovered case and the check emits a remainder. - Split
parentinto branches with conditionsc₁, …, cₖ— SMT.
The branches must be exhaustive and non-vacuous:parent ∧ ¬(c₁ ∨ … ∨ cₖ)is UNSAT (nothing falls through the cracks) and eachparent ∧ cᵢis SAT.
A satisfiableparent ∧ ¬⋁cᵢis a coverage hole, and its model is a remainder seed. - Cover
node ⟹ target(or an ancestor, under a substitution) — SMT,implies.
This closes the final target and loops; a BMC depth bound is the backstop when no cover is found. - Leaf — it must subsume the target (success) or be a known terminal/bounded node; a stuck leaf that subsumes neither is a
Failedcounterexample.
Any of these SMT checks may return unknown/timeout → an UndecidedObligation; it never silently passes.
Layers
- Haskell backend —
guided_execute(S, τ)(new RPC).
Force-apply rules fromτtoS(no rule search), folding steps into a single Edge; cheap simplification discharges trivial guards.
At the first step whose guard it cannot cheaply discharge, it solvesC ∧ ¬guardin place: UNSAT → fold and continue (no round-trip); SAT → return the Edge (depth, end stateS'), the taken branch'sguard(the Split condition), and the remainder'smodel(the¬guardseed); unknown → return an obligation; the trace end also returns.
It uses SMT for these remainder checks but never for rule search, and can overlap rewriting along the fixedτwith the remainder solve.
Checking the taken branch's feasibility is an optional parameter — skip it when a concrete witness already establishes it (explore mode), enable it when re-validating a proof without one. - pyk — the driver.
Driveguided_executeand record its Edges, Splits, and remainder seeds; check aggregate split coverage (parent ∧ ¬⋁cᵢ) and cover subsumption viaimplies; maintain the KCFG and accumulate the result tuple and the monotoneProofStatus.
Reuses the existingimplies,get_model, andsimplifyRPCs.
Outputs
ProofStatus—Passed/Pending/Failed.- updated
APRProof— the validated (and, when building, grown) KCFG. [remainder]— coverage holes still open.
Each isremainder = (depth, model, obligation):depthlocates the node;modelis a concrete seed for the uncovered sub-region (set when the residual is SAT);obligationis set instead when the solver could not decide.[undecided_obligation]—
UndecidedObligation:
source_node_id : int # node whose check spawned the query (referenced, not owned)
depth : int # rewrite steps from source_node_id to the query
kind : edge | split-coverage | cover
rule_id : str | None
query : Pattern # the term the solver could not decide
result : unknown | timeout
Passed ⟺ remainders == [] and undecided_obligations == [] and every leaf subsumes the target.
- Ngôn ngữ chính
- Python
- Star
- 591
- Fork
- 163
- Chỉ số merge pull request
- Không có pull request nào được merge trong 30 ngày
Chuẩn bị môi trường
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của runtimeverification/k
-
Introduce composable symbolic execution interface in pyxCó thể làm lại được @Stevengre đã nhận 97 ngày trước và không có pull request nào đang mở. Đang mở
runtimeverification/k#4939 · 1 người được giao ·
-
Concolic ExplorerĐang mở
Độ khó 5/5 Hơn một tuần Mức phù hợp với người mới 32/100
runtimeverification/k#4937 ·
-
Accelerating all-path reachability proofs with one-path reachability proofsCó thể làm lại được @Stevengre đã nhận 103 ngày trước và không có pull request nào đang mở. Đang mởtype:epic
runtimeverification/k#4934 · 4 bình luận · 1 người được giao ·
-
Support progressive depth halving as a generic policy in `Prover.advance_proof`Có thể làm lại được @Stevengre đã nhận 123 ngày trước và không có pull request nào đang mở. Đang mở
runtimeverification/k#4924 · 1 người được giao ·
-
area:haskell-backend area:llvm-backend priority:p2 status:icebox type:feature
Độ khó 5/5 Hơn một tuần Mức phù hợp với người mới 25/100
runtimeverification/k#4904 ·
Tất cả issue của runtimeverification/k
Issue tương tự
-
bug
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 85/100
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 90/100
Maintainer thường phản hồi trong vòng 1 ngày
-
https://search.utilibre.orgĐang mởinstance instance add
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 68/100
searxng/searx-instances#941 · 1 bình luận ·
-
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 92/100
FluidNumerics/fluid-walk-blocker#89 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
bug
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 84/100
Maintainer thường phản hồi trong vòng 1 ngày