260 likes | 388 Vues
This paper explores the integration of Stålmarck’s algorithm into the Coq proof assistant, aiming to automate verification processes. It provides a comprehensive overview of Stålmarck’s method, developed in 1994, which focuses on checking tautologies through a Boolean formula manipulation approach. By outlining practical implementations and evaluating efficiency, this integration seeks to enhance Coq's verification tools. The findings highlight the balance between extraction and reflection, discussing the theorem of correctness and implications of computational expenses in Coq's environment.
E N D
Integrating Stålmarck’s algorithm in Coq Laurent Théry Lemme
Motivations • Verifying verification tools • Adding more automation to Coq
Outline • What is Stålmarck’s algorithm? • How to integrate it to Coq? • How efficient is the result?
Stålmarck’s algorithm • Tautology Checker • Developed by Gunnar Stålmarck • Year 1994 • Commercialised by Prover Technology • Patented Algorithm!!!!
Boolean Formulae Constant value: Variables: Negation: Conjunction: Disjunction: Implication:
Checking tautologies Checking if the formula is true for all assignment:
Propagation Rules If Then If Then If Then
Example
Case Split Propagation Case Split Case Splitting Propagation Exponential Growth Propagation
Intersection Dilemma Rule Propagation Case Split Propagation Propagation
Iteration On all variables Till no new information is gained
Nesting Level 2: most tautologies
Extraction Reflection Coq Proof Checking Trace Integrating
Implementation • A Single Implementation for Extraction and Reflection • Functional style • Strict termination criterion
State • Variables: integer (T=1,=-1) • State: {2=-3,3=-1,4=5} • Union-find: {1 1, 2 1, 3 -1, 4 4, 5 4} • Back-pointer: {1 [2,-3],2 -1,3 -1,4 [5],5 4}
Termination • Easy except: fun append = [] M => M | L [] => L | [a|L] [b|M] => if (lt a b) then [a |(append [a|L] M)] else [b | (append L [b|M])] • _
fun append = [] M => M | L [] => L | [a|L] [b|M] => if (lt a b) then [a |(append L [b|M])] else let append1 = fun [] => L | [c|N] => if (lt a c) then [a|(append L [c|N])] else [c|(append1 N)] in [b|(append1 M)]
Trace Coq Ocaml
3 Level Approach • Adding Trace: • Checking Trace: • Correctness Theorem:
Trace Reducing Search: Successful case splitting (v) Successful rule propagation (r) Result of the intersection (i)
Conclusions • Extraction: clearly the most efficient • Reflection: computation is expensive in Coq (< 1s) • Trace: practical if we can reduce the amount of computation